前言

JS逆向学习,根据教程进行案例实战并记录过程,本次案例为微信公众号登录密码字段加密逆向。

逆向分析

在登录界面输入账号和密码点击登录获取到数据请求包,这里实验随便输入账号密码。

按f12使用开发者工具,在网络选项中查看请求,查看我们请求所提交的表单数据,发现pwd也就是我们的密码字段已经做了加密。

image-20221223141635030

加密字段是pwd,这时直接srtl+shift+f全局搜索关键字pwd

这时搜索到很多含有pwd关键字的文件,一般加密都是通过js文件来进行加密,直接查看js文件中的pwd关键字

image-20221223142356297

直接点击js文件,这时的js文件是压缩的,直接点击{}进行格式化

image-20221223142709223

然后在查看js文件中的20条匹配结果,对有pwd关键字的地方或者是看起来像加密的地方下断点。

image-20221223143028979

打上断点之后重新点击登录按钮进入调试状态,运行到第一个断点,发现pwd值为123。

image-20221223143405129

选中全部会发现这个字符串就是加密后的值,说明此处对pwd进行了加密处理

image-20221223143647010

进入下一步函数调用

image-20221223144032998

进入到return这里,发现调用了很多函数,然后返回了加密值

image-20221223144318614

找到这里所有的js代码,对这最后这个}往上的所有函数,也就是靠着左边红线的所有函数

image-20221223145435328

image-20221223145626066

把这部分复制进js调试工具,第一步首先格式化代码,然后加载代码发现n 未定义,这里重新定义一下n

image-20221223145816830

在首行定义n为一个空对象

1
var n = {}

image-20221223145951410

然后再次加载代码成功

image-20221223150242096

重写一下匿名函数

1
2
3
n.exports = function(e, t, n) {
return t ? n ? i(t, e) : o(i(t, e)) : n ? r(e) : o(r(e))
}

改写后

1
2
3
function getPasswd(e, t, n) {
return t ? n ? i(t, e) : o(i(t, e)) : n ? r(e) : o(r(e))
}

然后调用函数计算结果,对比之前的值一样。

image-20221223150732911

使用nodejs+python执行

安装PyExecJs

1
pip install PyExecJs

在Pycharm中安装nodejs插件,然后配置nodejs

image-20221223151121259

编写python文件执行js

1
2
3
4
5
6
7
8
9
10
11
12
import execjs

# 实例化对象
node = execjs.get()

# # js源文件编译
ctx = node.compile(open('test.js',encoding='utf-8').read())

# # 执行js函数
funcName = 'getPasswd("{}")'.format('123')
pwd = ctx.eval(funcName)
print(pwd)

image-20221223151319030