本文章只做技术探讨, 请勿用于非法用途。
引言
之前答应大家的 Akamai 加密逆向, 东西确实是比较多, 尝试写在一起确实不容易说清楚, 所以只能是分几期来做了, 这次先说一些相关特征, 和如何通过补环境来过掉加密。
后边尽可能出几期拆的细一点, 讲一下纯算来过, 把加密的过程详细说一遍。
目标网站的话, 我们用这个 www.dhl.com/cn-zh/home/...
网站分析
流程分析
目标网站是一个查询国际物流信息的网站, 我们清空 cookie , 刷新网站来观察它发送的请求。
搜索结果示例
请求头信息
请求携带参数
可以发现携带参数中并无加密参数, 我们接着来测试携带的 Cookie 信息, 可以很容易发现核心的加密参数其实是 Cookie 中的 _abck 参数(有时也需要携带其他 Cookie 参数)。接下来我们分析 Cookie 的生成过程。
请求流程示例
请求一响应示例一
请求一响应示例二
可以看到首先对我们的目标网站发起了请求, 获取了一份 Cookie , 并在响应中携带了后续的请求地址。我们继续分析后续的请求。
请求二响应示例
携带 Cookie 对从请求一中获取到的地址发起 GET 请求, 可以得到如图所示的 Js 代码(会变)。然后继续分析。
请求三示例
携带之前的 Cookie 以及参数 sensor_data, 对之前的地址再发送一次 POST 请求, 就能得到我们最终需要的 Cookie 值。
粗略的还原了一下 Akamai 加密的特征流程, 通过这三个步骤来实现 Cookie 的生成。实际分析中, 大家可以通过灵活运用搜索栏, 搜索需要的值, 来还原这个加密过程。
总结一下, Akamai 的加密流程如下:
- 请求初始链接获取 Cookie(_abck、bmsz、ak_bmsc) 以及一份 HTML(包含后续 JS 地址)。
- 携带 Cookie 对 JS地址 发起 GET 请求, 获取详细的 JS 代码。
- 继续携带 Cookie 以及根据 JS代码生成的参数 sensor_data 对 JS地址发起 POST 请求, 得到最终的 Cookie。
由此, 可以确定, 真正需要我们进行逆向的参数就是 sensor_data 了。
堆栈分析
确定了需要逆向的参数, 我们重点关注的就是请求三, 打开他的堆栈信息, 我们来找一下加密参数的生成。
堆栈信息示例
加密参数示例
根据堆栈信息, 点进去我们可以看到一份混淆相当严重的 JS 代码, 在第一个堆栈的位置打上断点, 就可以找到我们的加密参数, 稍微分析下, 我们就可以发现这里其实是 XMLHttpRequest.send 的地方, 这样我们只需要在补 XMLHttpRequest.send 方法时将参数导出到全局就行了。
解混淆示例
放上一份解混淆的代码, 图中的三行就是调试时候那三行, Q3H 即为调试时的 bTQ。 (JS 代码一直在变, 我解密的版本和调试的版本不一样, 但是整体的逻辑是相同的)。
开整
Python 部分
我们需要通过 Python 部分来还原整个加密流程, 多次请求可以使用 session 对象来实现, 另外, 这里还有个 tls 指纹校验的问题, 可以使用 curl_cffi 库来处理(具体的原理可以参考我的上一期文章)。
Python 代码示例
JS 部分
JS 部分根据之前的思路, 在 XMLHttpRequest.send 时将 sensor_data 导出即可。
JS 代码示例一
JS 代码示例二
补环境
这里还是没什么好说的, 细致活罢了, 不过可以提一些建议。
- 补环境过程中, 调试时候可以用解混淆后的代码, 解混淆的思路见往期的文章。
- 某些返回的 JS 代码中, 会有 window["window"] 这种方式来取 window 对象(node 中会报错, 浏览器正常), 需要注意一下。
- 环境中需要传入一些 url、cookie 参数, 可以通过字符串拼接的方式来实现, 参考 Python 部分。
结果示例
最后补一张成功的结果, 做的时候多测。

总结
混淆的程度确实很高, 建议配合解混淆来使用。
代码确实经常在变, 用 fiddler 来固定一下, 会方便很多。
juejin.cn/post/757633... tls 指纹检验问题。 juejin.cn/post/757319... 反混淆处理。
请洒潘江,各倾陆海云尔。