idea离线安装 VMware asynchronous neo4j uiview autocomplete tree vb6 Vanilla JS underscorejs vue例子 react脚手架搭建 pmp视频 jquery绑定事件的方法 oracle给表增加字段 java取绝对值 idea格式化代码设置 表白网页源码 python报错 python中的zip java正则匹配 java入门教程 java实现多线程 javahttp php实例教程 qq飞车剧情辅助 Ext2Fsd 苹果滚动截屏 只狼鬼佛 战地联盟辅助 max电池容量 只狼脚本 怎么设置迅雷为默认下载器 显示器面板类型 python数组赋值 淘宝店铺采集 k3刷机 cad特性不显示 汪文君 发表评论
当前位置: 首页 > 学习教程  > python

[python]微信公众号JS逆向

2021/2/7 10:24:37 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

目录一、前言二、网站代码分析三、环境安装四、代码部分导库完整代码方法1方法2五、总结一、前言 对于爬虫来说除了抓取数据以外, 还有的就是面对各种网站的反爬机制, 有图片验证码, 滑块, 问题类等等的反爬机制, 而js逆向也是最常见的一种, 而微信公众号登录的请求也是对密码…

目录

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

一、前言

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

二、网站代码分析

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

在这里插入图片描述

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

三、环境安装

  • 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)

五、总结

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

本文链接: http://www.dtmao.cc/news_show_2000228.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?