一次艰难的登陆JS逆向分析
2019-10-14 21:27:35 Author: mp.weixin.qq.com(查看原文) 阅读量:4 收藏

一次艰难的登录JS逆向分析

仅限供参考学习,请勿用于非法用途,否则后果自负


前段时间我一直在研究JS逆向分析,然后逆向了好多网站,常见的几种POST加密参数的方式无非就那几种:

RSAAESDESSHA256MD5

但是我最近碰到了一个站常用多层加密方式,很容易给人家带头晕,然后我花了一段时间研究,跟好朋友学习,最终实现了逆向的过程,在这里觉得有必要写一篇文章给大家学习一下。

事情起因:

分析过程:

一.分析登录包前的准备

首先我们先加载网站的请求包,看看有没有我们在提交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代码,也可以用已知加密库去调用加密。

最后感谢:月鸟大佬


文章来源: http://mp.weixin.qq.com/s?__biz=MzU2MjM3NzEwOA==&mid=2247483865&idx=1&sn=82abc431873230134c4681f076072273&chksm=fc6b3922cb1cb034e1219e2ae798ff824f1be37d105c6158c9b25ab305c821287f90c236401d&mpshare=1&scene=24&srcid=&sharer_sharetime=1571059655504&sharer_shareid=5191b3dcb328f693d5261ba6bca8d267#rd
如有侵权请联系:admin#unsafe.sh