前段时间我一直在研究JS逆向分析,然后逆向了好多网站,常见的几种POST加密参数的方式无非就那几种:
•RSA•AES•DES•SHA256•MD5
但是我最近碰到了一个站常用多层加密方式,很容易给人家带头晕,然后我花了一段时间研究,跟好朋友学习,最终实现了逆向的过程,在这里觉得有必要写一篇文章给大家学习一下。
首先我们先加载网站的请求包,看看有没有我们在提交POST登录包的时候需要用到的参数。
然后提交登录包查看加密参数:
再看看请求包里面有没有需要用到的参数 CN返回的包:
{"r":0,"data":{"pk":"NlYpbOcDU3zkj02ir1aBtVri4Oo2tcuR2okfLiDoutaXbEGOacL6QWy+ZuGGxfAVW7xYxVhJHEk+fNzcqLBwV7jpcLM1eqi86KJ\/5lck\/7zP0Ap3OcHMzTzjYblnzNWl6YUHqAL03WaQt4+7X12fMsZFFtYu2FAsGPPIC07co0M9DzqqLkaI7nfbbQ3v8S63S6Cp7G73e0n7TbB54jUzbhTD9Y5Pm4\/1EbutLV0AhWCI8HFL4ZPnqM6BEPqY2GzY\/owFgMWv14+Lt8qduupfqWwWYUE28T6U\/4Td9ztkr5JvdcNGRMLex8eYLgwHyzVdHUy84RTDfJaKI3DIJjcQmA==","uuid":"2826e260-e9d9-11e9-a126-154b5cafdc3f"}}
gqrc返回的包:
1qgNOXQEd9Qcbj7oMqDZx7G5z/rLiivoShRDPjrhwfL19afIhbMmgBCvYGEI3nI7Nume1OTVyWvh9/DSrs9BLaSrdKYtHxjzX8pTfJcyecPTlHAY/7tYRdwCF8sGMCoz
虽然现在看不出什么明显的标志,但是在模拟请求时,最好都看看网站加载的时候请求了什么参数,这有很可能是待会分析加密的时候需要传递的参数值。
通过请求包的关键字,查找可能发生登录请求的地方:/SC
断点进入
继续跟进
if (null === F || e === !0)
这里已经是提前存在了,所以说明秘钥是在请求之前就加载好了。
我们重新在这几处可能生成秘钥的地方断点,然后刷新网页。
成功断点进来,接着调试跟进
这里可以发现生成了的t对象递给了下面请求CN,也就是我们刚刚看到的。
继续跟进
生成的秘钥在哪里进行加密呢?我们继续跟进吧。。
跟到这里发现又有关键字了
继续跟进
这里传递了两个参数,一个是加密的参数,一个是秘钥, 我猜这里可能是加密的地方,我们继续跟进。
值得一提的是processWritable经过5次执行最终才到了加密的地方,这是比较绕的地方
第一次进入 :
processWritable: function(e, t) {
return e
}
第二次进入
processWritable: function(e, t) {
if (t.needToken && r.getProfile("tk"))
e.tk = r.getProfile("tk");
else if (t.needToken && !r.getProfile("tk"))
throw new Error("tk err");
return e
}
第三次进入:
processWritable: function(e, t) {
return (0,
o["default"])(e)
}
第四次进入:
processWritable: function(e, t) {
if (!t.needCompress)
return String(e);
var n = t.connectionType;
if (d[n])
return d[n].compress(e);
throw new Error("Unknown ConnectionType")
}
第五次进入:
processWritable: function(e, t) {
if (t.needEncrypt) {
if (t.encryptKey)
return a.encrypt(e, t.encryptKey);
throw new Error("invalid encryptKey when needEncrypt=true")
}
e是加密的参数,t.encryptKey是上面生成的64位Key通过AES加密最后转化成base64
我们下面来验证一下结果,为方便查看我们用本地加载好的JS使用FD查看。
逆向过程是一件很枯燥无味的过程,需要一步步跟进,直到找到加密的地方,有时候不只有一处加密,向这个网站有多个加密组成,需要一步步耐心的去分析,当然了,遇到不懂的可以请教一下别人,不要钻牛角尖。
登录的过程我就不在这里演示了,就是构造POST包,可以扒JS代码,也可以用已知加密库去调用加密。
最后感谢:月鸟大佬