声明
本文章中所有内容仅供学习交流使用,不得用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。
若擅自使用本文讲解的技术而导致的任何意外,作者均不负责。文中若有侵权内容,请立即联系作者删除!
〇:友情提示
- 本文章已在微信公众号【逆向学习日记】发布,若在【CSDN】中无法全部查看,可以直接点击【js逆向–某会展中心–请求参数data加密以及响应体解密逆向分析(脱敏版)】查看。
- 在微信公众号【逆向学习日记】也可以阅读更多文章。
- 感谢关注微信公众号和阅读文章的朋友!
Ⅰ:目标
- 网址:aHR0cHM6Ly93d3cuZGVtby5jb20vc2NoZWR1bGUj
- 接口:aHR0cHM6Ly93d3cuZGVtby5jb20vcHJvZC1hcGkvaGZoei1leGhpYml0aW9uL2JhY2svZGVtby9saXN0RXhoaWJpdGlvbk5vdFBhZ2U=
- 目标:请求参数data加密 、响应体解密
Ⅱ:抓包分析
-
首先通过抓包分析接口参数以及响应体,并观察其调用栈。
-
可以看到请求参数data以及响应体是加密了的,此时要分析data的加密逻辑以及响应体的解密逻辑。根据以往的经验,我们可以调用栈逐步向上分析,我们可以看到它含有Promise.then关键字,此时我们可以猜想是否使用了拦截器加解密呢?此时在Promise.then的调用栈打上断点,并重新请求。
-
看到这里,我们可以进一步猜想大概率是拦截器,但是它和之前的拦截器不一样,怎么办呢?此时可以搜索 responseInterceptors 和 requestInterceptors关键字,主要是观察断点处拦截器方法的名称特点,当然也可以搜索 Interceptors 关键字,搜索之后,直接断点,如下图,并刷新网页。
-
我们可以看到程序断在断点处,其中Ce对象就包含所有的拦截器对象。我们直接单步调试,触发请求拦截器的初始化操作,并在控制台打印输出,并在拦截器函数中打上断点。
-
同样的,直接释放断点到响应拦截器中,并单步调试,重复请求拦截器的操作。
-
此时我们把拦截器的初始化的函数的断点取消掉,并且停用断点,让整个程序正常运行,当网页加载完毕,则取消停用断点,使我们的断点正常使用。并重新发送请求。
-
可以看到 re 变量存放了请求明文,但是观察发现整个函数中没有对re变量操作,所以说该函数没有加密操作,此时可以释放该断点,并且把该断点取消。
-
可以看到断点听到第二个请求拦截器函数上,并且本地作用域中Xe对象存在我们的明文参数,此时需要逐一的分析代码,看明文是在哪一步操作加密的。
-
当走到这一步,并且控制测试发现,就是sr为加密函数,此时直接进入sr函数。
-
可以看到这是一个类似AES加密的算法,此时我们直接在线测试。
-
可以看到确实是AES标准的CBC模式的加密,此时data加密方式就搞定了,我们直接看响应体的解密,我们此时直接释放断点。
-
此时关键函数为cr,我们直接进入cr函数内部。可以看到他返回了一个Promise对象,那么就执行 var f = i.apply(a, l);函数,我们直接断点到此处。
-
此时直接进入i函数,通过代码观察以及经验,可以看到其中kt就是加密的结果,mr就是解密函数,当然,在这一步中,我们也可以单步调试。我们直接再控制看mr的函数体。
-
可以看到mr的函数其实就是AES解密,当然,也需要在线测试。
-
可以看到响应体的解密也是标准的AES中CBC模式。
-
之前文章也说了,我们要善于观察控制台的输出,因为程序可能存在埋点的现象
-
通过看后面的调用栈也可以定位位置。
Ⅲ:总结
好了,本次的分析过程到此结束,如果说从最后发送请求的调用栈开始分析,可能存在难度,这时我们就要根据现象来采用不用的方式来定位位置。需要具体调试,微信公众号【逆向学习日记】回复【某会展中心】获取地址。