[python]微信公众号JS逆向

目录

    • 一、前言
    • 二、网站代码分析
    • 三、环境安装
    • 四、代码部分
      • 导库
      • 完整代码
        • 方法1
        • 方法2
    • 五、总结

一、前言

对于爬虫来说除了抓取数据以外, 还有的就是面对各种网站的反爬机制, 有图片验证码, 滑块, 问题类等等的反爬机制, 而js逆向也是最常见的一种, 而微信公众号登录的请求也是对密码进行了一个js加密的, 对于明文的方式请求是绝对失败的. 所以就要模拟一下他的js加密然后把加密后的数据当作参数进行请求接口.

二、网站代码分析

  • 通过浏览器抓包找到登录的接口, 查看传递的参数其中pwd是进行加密了的数据, 对于一些熟悉加密的朋友来说, 大概就知道了这个是md5的一个加密方法.
    [python]微信公众号JS逆向_第1张图片
  • 对参数pwd进行全局搜索找到相关的js加密文件
    • 通过搜索之后出来的结果就只有3个, 一个是css 一个是js 另外一个是主页的html, 所以应该就是这个js了
      [python]微信公众号JS逆向_第2张图片
  • 点击js之后格式化js进行全局搜索pwd关键字, 对可疑地方打断点
    [python]微信公众号JS逆向_第3张图片
  • 我大概对5个可疑的地方打了断点, 反正可疑的都打上, 也不亏
    [python]微信公众号JS逆向_第4张图片
  • 打完断点之后, 重新请求登录接口, 对代码进行分析
    • 请求登录接口之后可以看到这个地方,我们的pwd还是以明文的方式在代码里面的,所以到这里还是未进行加密的, 但是这里调用了一个目前还未知的方法名为’l’的方法, 我们需要点击右上角↓的按钮或者点击F11步入方法查看.
      [python]微信公众号JS逆向_第5张图片
  • 可以看到进入方法之后, 是直接返回了一个加密之后的数据, 然后把这个返回的数据和请求接口的pwd进行对比后发现是一致的, 可以确定是这里加密的了.
    [python]微信公众号JS逆向_第6张图片
  • 向上可以看到一大堆看不懂的类似于这样的东西就大概可以确定是md5加密了
    [python]微信公众号JS逆向_第7张图片
  • 把一整个代码块复制, 然后用发条js调试工具调试→没有的自己去百度下载
    • 在运行的时候发现报错, 'n’未定义
      [python]微信公众号JS逆向_第8张图片
  • 在最上面定义一个空的字典n, 就可以加载成功了

[python]微信公众号JS逆向_第9张图片

  • 因为该函数未命名, 所以我们给他改一个名字, 然后再次加载代码, 测试运行一下是否正常返回加密后的密码
    • 因为之前看到t和n两个变量都是undefined, 所以我们不需要给他任何参数
    • 修改完之后在下面的框直接调用函数并且把密码123456传进去, 点击计算表达式
    • 修改完之后必须点击加载代码后在计算表达式
    • 可以看到计算计过是跟抓包工具里面的一模一样可以说我们的逆向已经完成了. 接下来就到python表演的时候了
      [python]微信公众号JS逆向_第10张图片

三、环境安装

  • node.js
    • 不会安装的点击这里
  • PyExecJS
    • pip install PyExecJs(使用anaconda的也需要这个命令, 因为conda里面没有这个库)

四、代码部分

  • 创建一个js文件,把刚才发条js里面的代码复制进去.

导库

import execjs

完整代码

方法1

# -*- coding: utf-8 -*-
import execjs

password = '123456'
# js源文件编译
with open('code.js', 'r', encoding='utf-8') as fp:
    ctx = execjs.compile(fp.read())
	# 执行js函数
    pwd = ctx.call("getPwd", password)
print(pwd)

方法2

# -*- coding: utf-8 -*-
import execjs

password = '123456'
# 实例化node对象
node = execjs.get()
# js源文件编译
with open('code.js', 'r', encoding='utf-8') as fp:
	ctx = execjs.compile(fp.read())
	# 执行js函数
	func_name = 'getPwd("{}")'.format('123456')
	pwd = ctx.eval(func_name)
print(pwd)

五、总结

  • 没啥好总结的, 里面已经很详细了

你可能感兴趣的:(Python,加密解密,md5,python,爬虫)