案例地址:贝壳网登录
找加密参数+加密位置
这里有四个密文,但是不是所有密文都需要js逆向(不是所有参数都是js代码中的):
我们可以先清空所有接口数据然后开着控制台重新刷新网页然后到我们要的接口触发,说白了就是抓到从网页加载到我们要的接口过程中的所有包,然后看看某些参数是否是其他接口的响应结果:
所有数据包如下:
然后全局搜索(响应内容的全局):
说明这个密文是另一个接口返回的,再搜:
看一下此接口负载:
此接口负载是密文,想要拿到此密文,这个负载可能还需要逆向,先不管,再搜:
这个搜不到,可能需要逆向了,但是本文先不讲这两个参数怎么获取(第一个参数是请求另一个接口获取响应,但是另一个接口也有加密参数,逆向了那些加密参数才能拿到这个接口的密文值),本文主要讲password:
xhr定位:
此处已经有了,向上跟栈(这里是异步后第一个栈):
说明加密在异步中或者异步前,打断点看看:
说明就是在异步中,进去:
观察密文时发现运行到这一行直接就跳到xhr断点那里了:
所以再次过来后点第三个按钮进去看看:
继续点第二个按钮观察密文:
发现经过上面图片这一行之后就变成密文了,所以加密就在这里,这里是三个and,所以要看&&两端是否是true来判断运行的是哪一行代码:
第三个并列换行了,只能在控制台看,然后发现了加密,所以进第三个里面,第三个很长需要慢慢分析,从里到外分析,直接运行整个代码后,某些参数就会被污染,一直呈现加密状态,不利于我们分析(刚刚我们在控制台运行了整个代码,所以也需要打上断点重新过来,不然你会发现单一个r入参就是密文,但是你重新运行过来就又不是了):
这里从里到外分析后会发现经过E.a函数后加密了,进去看看:
很像RSA吧,设置密钥然后加密,打断点看看n是啥:
密钥长度1024,应该是标准的RSA,但是当时我们看出来,所以我进去扣代码了,那我们就讲一下扣代码的吧
扣代码复现加密逻辑
进一个类(这个就是加密的类):
我进了初始化函数中:
这里面好多关键字,所以我选择全扣pt函数:
然后调用尝试加密:
去浏览器拿一下lt:
发现还少,再扣:
还扣:
但是这里我觉得不对劲了,像这种单字母赋值函数这里有一大坨,f中还调用了p函数,这时候我见想着全扣了:
我们全给他拿到本地看看:
这是整个文件,然后我们发现一个熟悉的东西:
看一下:
加载器,下面好多模块,那我们加密的模块是哪个呢,我们应该用不了这么多模块,所以搜索一下:
将前后的模块先全删掉:
只剩这个模块:
然后将webpack单扣出来:
webpack前面是环境判断,带上需要补环境,麻烦,一会儿不行再换方法,抠出来之后补成自执行方法:
并写上这句话方便补模块:
但是这里我觉得不用补,因为:
啥都有了,将关键代码补上,然后导出加载器(导出要注意后面有return,补return前面):
运行一下看看:
少模块,看看怎么个事儿:
这里一般就是webpack加载用的东西,调用了86模块,注释之后运行看看:
ok了,那么就是这个类是一个加密的类,无需补充其他模块
文章补充
其实这个模块是个构造函数(老js的类),一般来说一种加密封装成一个类,所以我就保留了这一个模块,然后怎么看是否是构造函数呢——有this.xxx就是:
小结
本文扣了一个webpack,看着有点儿难,其实就是类似魔改的解决方法,全扣代码而已,当然这里可以直接当作标准RSA处理,ok,文章到此结束,如有问题请及时提出,加油加油