文章目录
- 1. 写在前面
- 2. 过debugger
- 3. 抓包分析
- 4. 断点分析
- 5. Python实现解密算法
1. 写在前面
最近华为各方面传递出来的消息无不体现出华为科技实力与技术处于遥遥领先的地位。所以出于好奇想要了解一下咱们国内这些互联网科技企业有哪些技术专利,于是就有了这篇文章!
分析目标:
aHR0cHM6Ly9wYXRlbnRzLnFpemhpZGFvLmNvbS8=
作者声明:
本文章中所有内容仅供学习交流使用!严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,若有侵权,请联系作者立即删除!
2. 过debugger
这个网站的debugger是带参的,直接设置跳过会导致返回不了结果卡死。这里我们最好需要通过脚本返回空的值(加载完之后执行即可)
现在很多网站,基本我们在调试的时候都会出现debugger,具体要如何绕过debugger现在网上的教程也是很多。通常的方法就是移除、禁用、Hook都是可以的
以上这段代码的目的是拦截尝试构造函数时传入参数为debugger的情况,并将其替换为一个空函数!这样,如果有代码尝试构造一个debugger函数,它将返回一个空函数,而不会触发浏览器debugger
3. 抓包分析
来到专利板块下,随便搜索某些关键词看看请求。data1是接口返回的搜索数据,这里是以密文的形式展示,在前端渲染的时候肯定是再解密的。hasUse这个字段目前暂不明确具体用处
还有另外一种方式,这里我简单的写了一个Hook脚本,拦截一下请求接口加载出来的密文数据,如下所示:
params就是接口响应成功的JSON数据。可以看到data1字段是加密之后的数据
4. 断点分析
这里大家调试的时候,按照实际为准!因为JS代码都是动态生成的。断点调试到此处,可以发现_0x242701是加密数据,_0x3cd512是加密使用的key
断点继续跟下来,发现_0x5a2e64[‘a’][_0x2961f0(0x268)][_0x2961f0(0x27c)…这一行代码就是解密调用,我们在控制台看一下:
控制台拥有最高解释权,调试的时候对于可疑的代码我们可以直接执行验证。JS逆向新手最好不要硬扣代码,调试一步步还原混淆的代码来走一遍是很有好处的!
// AES加密
_0x12c6d7 = function(_0x4ec08d, _0x5f52ad) {
return function(_0x242701, _0x3cd512) {
var _0x2961f0 = a0_0x5cb2
, _0x46978c = _0x5a2e64['a'][_0x2961f0(0x268)][_0x2961f0(0x27c)][_0x2961f0(0x21c)](_0x3cd512 || _0x2961f0(0x24b) + _0x2961f0(0x241))
, _0x4d8f3f = _0x5a2e64['a'][_0x2961f0(0x24e)][_0x2961f0(0x294)](_0x242701, _0x46978c, {
'mode': _0x5a2e64['a']['mode'][_0x2961f0(0x22c)],
'padding': _0x5a2e64['a'][_0x2961f0(0x234)][_0x2961f0(0x2a0)]
});
return _0x5a2e64['a'][_0x2961f0(0x268)][_0x2961f0(0x27c)][_0x2961f0(0x24d)](_0x4d8f3f)['toString']();
}(_0x4ec08d, _0x2d37b7[_0x5f52ad]);
};
接下来我们继续跟栈调试,根据上面的这段代码来还原分析一下。可以看到_0x2d37b7是一个加密Key字典!_0x5f52ad是一个index的索引
等于说加密选择的Key每一次并不是固定的,回到上面接口响应的的JSON字段中,有一个字段hasUse,这个字段的值就是用来调用对于Key的!
通过一步步的还原,可以看到mode的加密模式是ECB,ECB(Electronic CodeBook):将明文分组加密后结构直接加密成密文
我上面的这种还原方式虽然耗费时间,但是对于新手朋友还是非常友好的~
对于扣加密代码还原加密逻辑方式有很多种,结合使用更佳!
5. Python实现解密算法
到此!知道了加密使用的是AES,加密使用的Key也知道了,调用方式与参数我们在搜索的响应接口数据中都能获取到,现在就开始编写Python代码来实现解密:
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 准备密钥列表
KEYS = [b"xc46VoB49X3PGYAg", b"KE3pb84wxqLTZEG3", b"18Lw0OEaBBUwHYNT", b"jxxWWIzvkqEQcZrd", b"40w42rjLEXxYhxRn",
b"K6hkD03WNW8N1fPM", b"I8V3IwIhrwNbWxqz", b"3JNNbxAP4zi5oSGA", b"7pUuESQl8aRTFFKK", b"KB4GAHN6M5soB3WV"]
def decrypt_aes(data, has_use: int):
try:
html = base64.b64decode(data)
# 使用ECB模式的AES解密
cipher = AES.new(KEYS[has_use - 1], AES.MODE_ECB)
# 解密
info = cipher.decrypt(html)
# 去除填充
decrypted_data = unpad(info, AES.block_size).decode()
return decrypted_data
except Exception as e:
# 处理异常情况
print(f"Error during AES decryption: {e}")
return None
KEYS是我们调试所看到的解密Key,把它拿下来即可。它跟hasUse是配合取值使用的。然后我们先通过base64对密文进行一个解码再加密最后解密!
最后我们可以针对搜索请求构造完整的Python代码,它这个网站headers参数比较多,记得带全!!!那些参数很多也都是动态生成的,是值得研究分析的。
解决加密往往只是爬虫开始的第一步!体量越大价值越大的网站风控系统都是相对比较完备的,做爬虫就看谁的伪装技术更胜一筹:
最后我写了一个完整的Python爬虫代码,运行测试了一下效果,得到的加密与解密数据如下所示:
好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章