闲来无事想复习一下js逆向,就以一个在线翻译页面为例。
这个工具是提供翻译API的,但是要收费,想要自己搞API,不去付费使用。
具体思路就是两步:
1、模拟浏览器去向服务端发起请求,并接收返回来的数据。
2、解密返回来的数据
------------------------------------------------------------------------
-
模拟浏览器去向服务端发起请求,并接收返回来的数据
这里的三个键是动态的值,如果直接写死发送会返回error,所以需要看如何构造。
首先:进入开发者模式(F12),并刷新浏览器抓包,一共发了两个请求:
第一个请求返回了数据
第二个请求返回的状态
所以肯定是第一个请求,分析第一个请求,并查看载荷(请求体)。
-
i为我输入的内容,
-
sign是js文件生成的,看着像是MD5(需要知道对谁做了MD5?)
-
mysticTime应该是时间戳
返回的数据应该就是翻译过来的'苹果',看着像是被魔改的base64。
也就是说要想正确请求并能够拿到返回来的数据,需要知道sign和mysticTime这两个字段是如何生成的。
第二步:开始js逆向
找发起'http://xx/webtranslate'请求的函数,ctrl+shift+f,全局搜索'webtranslate'字段去定位,找到后加断点分析
这里可以看到对js函数名做了混淆,其实也无所谓,知道函数的功能就可以了。
先查看一下a['d']函数源代码,分析函数作用。
-
tip1:可以通过控制台打印函数,并点击定位
-
tip2:另一种方法是断点悬浮去定位
看到Promise(常见的发送请求的对象),可以确定定位正确。
结合上面的图片,可以知道a['d']接收三个参数e,t,o分别对应以下三个部分
e显而易见是请求,,o是定义了一个固定的头,现在是分析t对应的参数,(记住目标是要找生成sign和mysticTime的函数)
控制台打印'Object(n["a"])(Object(n["a"])({}, e), O(t))',找到了我们想要的这两个值,确定就是这个函数,接下来就是拆开一个一个的去分析了
同之前的定位方法(通过控制台打印函数,并点击定位):
可以确定答案就是O(t)这个函数,下一步就是定位O()函数的源码做解析,同样方法定位,走你...
发现了mysticTime的值,并找到了函数源码确定为时间戳。
sign值为h(t,e)函数生成,继续找...走你...
到这就已经清晰明了了,和猜想的一样:
-
sign是MD5,并做了16进制的转换
-
mysticTime是时间戳
第三步:上chat-GPT进行python重写
(chat-gpt生成的代码并不准确,要经过自己的真实情况去修改)
第四步:完整请求代码
-
对返回的数据的进行解密
以上就是请求的分析完成了,接下来对返回的数据的进行解密
利用调用堆栈功能去看谁调用的这个请求对象
then这里看起来就是解析返回来的数据的,加断点执行...走起...
可以看到o就是返回来的数据,a是对返回来的数据进行解密之后的结果。
具体就是这行代码做的,o作为参数传给an["a"].decode(),解密后的结果给n,n做反序列化赋值给a。
之后就是查看an["a"].decode()的源码了,(同之前的定位方法,查找)
显而易见的是AES-128-cbc加密,cbc模式下需要key和iv,这两个值,也就对应着这里的a和c
要想拿到a和c的值(也就是看a和c是怎么构造的出来的)需要解析g(o),g(n),打印o和n的值,发现是一个固定值
那就是不需要看o和n怎么来的了,直接去看g()函数的源码。
上chat-GPT进行python重写
这样就可以拿到a,c的值了。然后就是把第一部分返回来的值先还原为正常的base64格式。
然后先base64解码,再AES解密就可以了(累了,不想写了)
到此结束,完整代码也就不贴了,安全第一。
原文始发于微信公众号(零威胁):基于python的js逆向(Chat-GPT快速实现)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论