逆向目标
- 网址:
aHR0cHM6Ly93d3cubGFuZGNoaW5hLmNvbS8jLw==
- 目标:反调试及请求头
Hash
反调试
进入网站,我们会发现F12
无法打开控制台。那就换一种方式,以谷歌浏览器为例设置 -> 更多工具 -> 开发者工具
,然后网页就会跳到空白页了,这是除了debugger
外一种经典的反调试手段。
那么我们如何过掉这个反调试呢?目前,我遇到的就两种情况,第一种就是window.close()
,第二种就是location.href = ''
,还有其他情况的话欢迎各位大佬补充。
下面直接开始分析:
我们用无痕浏览器分析(因为在Script
断点时不会加载插件的JS代码),打开控制台,勾上Script
断点,输入网址,成功断住。
然后我们先搜索window.close
,F8
一直走,之后某个文件出现了相关代码,直接下断。
然后放开Script
断点,直接F8
过掉,成功在断点处停住。
我们往前跟栈,看网站通过什么手段进行的反调试。可以看到,是e > 10 * this.maxPrintTime
这个条件成立才触发this.onDevToolOpen
,从而触发后续的window.close
那我们就看看代码具体做了什么,我们在前面的e
和r
处下断,重新请求,成功断住。
然后我们单步跟进去m
函数,可以看到,先取了一下时间戳,然后调用传进的参数,最后再返回参数调用的时间差,那猫腻肯定是出现在传入的函数中了。
我们直接进入被调用的参数函数中,可以看到t.largeObjectArray
是一个大对象,b
其实是console.table
函数,也就是在控制台打印一个大对象。
那反调试的逻辑大体清楚了:如果打开了控制台,就会通过console.table
打印一个很大的对象,这就需要消耗时间,后续e > 10 * this.maxPrintTime
就成立,就会进入最终window.close
的逻辑。
我们可以通过hook
,返回一个固定的时间戳来过掉反调试(油猴或者直接在控制台注入都可以)。
Date.prototype.getTime = function(){
return 1741067137856
}
hook
掉时间戳之后,我们会发现控制台一直会被清空,也不利于调试,我们直接把清空控制台的代码置为空函数E = function(){}
。
同理,再把和控制台打印相关的b
和w
函数也置空(在对应函数断住的时候去置空)。
最后,能够在控制台输入并输出表示我们成功过掉了反调试。
抓包分析
我们直接点击土地供应 -> 供地计划
,会发一个list
的包,请求头中的Hash
参数就是需要逆向的参数。
逆向分析
一般请求头参数加密,我们可以通过hook
的手段去找加密位置(可以去找现成的hook
代码)。我选择直接从启动器去找了,一般都会看异步之前的request
。
下断,发包,然后找请求拦截器。
很显然,下图大概率就是加密参数的生成位置。
我们在控制台输出一下结果,可以看到密文的长度为64
,看起来很像SHA256
。
那我们就去尝试一下,看是否为标准的SHA256
,字符串'1'
的摘要为6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
。
再去控制台对字符串'1'
进行摘要,经对比,算法是标准的,没有魔改。
那加密过程大概清楚了,对userAgent
、今天的日期(日)
以及list
进行SHA256
得到Hash
。
那我们直接对接口进行请求模拟。
成功!!!