1. 逆向工程实战AKM 3.0风控体系解析最近在研究某物流网站的AKM 3.0风控系统时发现其sensor_data参数的生成机制相当有意思。这个参数在整个风控流程中扮演着关键角色特别是在获取_abck这个重要cookie值时。对于刚接触逆向工程的朋友来说可能会觉得这个过程很复杂但其实只要掌握了核心思路就能轻松应对。AKM 3.0的风控流程主要分为三个关键阶段首次访问获取基础cookie、二次请求获取js文件、三次提交sensor_data参数。每个阶段都有其特定的检测点和验证机制。在实际操作中我发现使用Python的curl_cffi库可以很好地模拟浏览器环境特别是它能够绕过TLS校验这一点非常实用。2. 环境准备与基础配置2.1 工具选择与安装在开始之前我们需要准备好必要的工具。我强烈推荐使用Python 3.8版本因为它在兼容性和性能方面表现都很稳定。核心库方面curl_cffi是必不可少的它能够完美模拟真实浏览器的TLS指纹。pip install curl_cffi除了这个核心库我还建议安装一些辅助工具Chrome开发者工具用于实时监控网络请求Wireshark用于抓包分析Fiddler用于调试HTTP/HTTPS请求2.2 基础请求配置第一次访问目标网站时我们需要配置合理的请求头。这里有个小技巧直接从你的Chrome浏览器复制User-Agent和Accept等头部信息这样看起来更像真实用户访问。headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 }3. 三阶段请求流程详解3.1 首次访问获取基础cookie第一次请求目标网站首页时服务器会返回三个重要的cookie_abck、ak_bmsc和bm_sz。这里需要注意首次获取的_abck值是以~-1~-1~-1结尾的这表示尚未通过验证。from curl_cffi import requests url https://www.dhl.com/cn-zh/home.html response requests.get(url, headersheaders, impersonatechrome101) cookies response.cookies.get_dict() print(cookies)这个阶段相对简单但要注意保存好这些cookie值因为在后续请求中都需要带上它们。3.2 二次请求获取js文件第二次请求是从首页中解析出的一个js文件。这个阶段服务器会进行更严格的环境检测包括TLS指纹、浏览器特性等。使用curl_cffi的impersonate参数可以很好地模拟Chrome浏览器的行为。js_url https://www.dhl.com/static/js/main.xxxxxx.js # 实际URL需要从首页解析 response requests.get(js_url, headersheaders, cookiescookies, impersonatechrome101)这个阶段返回的_abck仍然是以~-1~-1~-1结尾但服务器已经收集了更多环境信息。3.3 三次提交sensor_data参数第三次请求是最关键的阶段需要构造并提交sensor_data参数。这个参数包含了大量环境信息服务器会根据这些信息判断请求是否来自真实浏览器。sensor_data { # 这里需要填充真实的sensor_data参数 key1: value1, key2: value2 } api_url https://www.dhl.com/api/sensor response requests.post(api_url, jsonsensor_data, headersheaders, cookiescookies, impersonatechrome101)如果验证成功返回的_abck值会是~-1~||0||~-1这样的格式如果失败则仍然是~-1~-1~-1结尾。4. sensor_data参数生成机制4.1 核心生成原理sensor_data参数的生成依赖于对浏览器环境的完美模拟。在实际操作中我发现这个参数主要包含以下几类信息浏览器指纹信息硬件配置信息网络环境信息交互行为特征这些信息会被编码成一个特定的JSON结构通过XMLHttpRequest发送到服务器端。4.2 关键检测点模拟要成功生成sensor_data必须处理好以下几个关键检测点DOM操作检测document.getElementsByTagName(input); document.createElement(div);Window对象属性检测window.innerWidth; window.innerHeight; window.devicePixelRatio;WebRTC相关检测RTCPeerConnection.prototype.createOffer; RTCPeerConnection.prototype.setLocalDescription;Canvas指纹检测const canvas document.createElement(canvas); const ctx canvas.getContext(2d); ctx.fillText(test, 10, 10);4.3 完整补环境示例下面是一个相对完整的补环境示例代码// 模拟XMLHttpRequest XMLHttpRequest function XMLHttpRequest() {} XMLHttpRequest.prototype.open function() {} XMLHttpRequest.prototype.send function() { console.log(sensor_data:, JSON.parse(arguments[0])[sensor_data]); } // 模拟WebRTC RTCPeerConnection class {} RTCPeerConnection.prototype.createOffer function() { return new Promise((resolve) { resolve({ sdp: v0\r\no- 7557661829766968651 2 IN IP4 127.0.0.1\r\ns-\r\nt0 0\r\naextmap-allow-mixed\r\namsid-semantic: WMS\r\n, type: offer }); }); }5. 常见问题与解决方案5.1 TLS校验失败问题AKM 3.0对TLS指纹有严格的校验使用普通requests库很容易被识别。这就是为什么我们要使用curl_cffi库它能完美模拟Chrome的TLS指纹。# 错误的做法 import requests response requests.get(url) # 这样会被识别 # 正确的做法 from curl_cffi import requests response requests.get(url, impersonatechrome101)5.2 cookie同步问题在整个流程中cookie的同步非常重要。特别是在补环境时需要动态注入之前获取的cookie值。cookies response.cookies.get_dict() cookie_str ; .join([f{key}{value} for key, value in cookies.items()]) # 在补环境时需要注入这些cookie document { cookie: cookie_str }5.3 环境检测不通过如果发现_abck总是返回~-1~-1~-1说明环境检测没有通过。这时候需要检查以下几个方面是否完整模拟了所有必要的DOM APIWebRTC相关对象是否正确定义浏览器指纹信息是否合理请求时序是否符合正常浏览行为6. 实战技巧与经验分享在实际操作中我发现有几个小技巧特别有用使用真实的浏览器信息直接从你的Chrome浏览器复制User-Agent、Accept-Language等头部信息。渐进式补环境不要试图一次性补全所有环境而是先补最基本的然后根据服务器响应逐步添加其他检测点。日志记录在补环境的代码中加入详细的日志记录这样当出现问题时可以快速定位。环境隔离建议在独立的虚拟环境中进行测试避免影响其他项目。版本控制AKM 3.0可能会更新检测机制所以要保持代码的灵活性便于快速调整。最后要提醒的是逆向工程虽然有趣但一定要遵守相关法律法规仅用于学习和研究目的。在实际操作中我发现每次遇到问题都是学习的好机会通过不断尝试和调试最终总能找到解决方案。
逆向实战:某物流AKM 3.0 sensor_data参数补环境与_abck获取全解析
1. 逆向工程实战AKM 3.0风控体系解析最近在研究某物流网站的AKM 3.0风控系统时发现其sensor_data参数的生成机制相当有意思。这个参数在整个风控流程中扮演着关键角色特别是在获取_abck这个重要cookie值时。对于刚接触逆向工程的朋友来说可能会觉得这个过程很复杂但其实只要掌握了核心思路就能轻松应对。AKM 3.0的风控流程主要分为三个关键阶段首次访问获取基础cookie、二次请求获取js文件、三次提交sensor_data参数。每个阶段都有其特定的检测点和验证机制。在实际操作中我发现使用Python的curl_cffi库可以很好地模拟浏览器环境特别是它能够绕过TLS校验这一点非常实用。2. 环境准备与基础配置2.1 工具选择与安装在开始之前我们需要准备好必要的工具。我强烈推荐使用Python 3.8版本因为它在兼容性和性能方面表现都很稳定。核心库方面curl_cffi是必不可少的它能够完美模拟真实浏览器的TLS指纹。pip install curl_cffi除了这个核心库我还建议安装一些辅助工具Chrome开发者工具用于实时监控网络请求Wireshark用于抓包分析Fiddler用于调试HTTP/HTTPS请求2.2 基础请求配置第一次访问目标网站时我们需要配置合理的请求头。这里有个小技巧直接从你的Chrome浏览器复制User-Agent和Accept等头部信息这样看起来更像真实用户访问。headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.8,zh-TW;q0.7,zh-HK;q0.5,en-US;q0.3,en;q0.2 }3. 三阶段请求流程详解3.1 首次访问获取基础cookie第一次请求目标网站首页时服务器会返回三个重要的cookie_abck、ak_bmsc和bm_sz。这里需要注意首次获取的_abck值是以~-1~-1~-1结尾的这表示尚未通过验证。from curl_cffi import requests url https://www.dhl.com/cn-zh/home.html response requests.get(url, headersheaders, impersonatechrome101) cookies response.cookies.get_dict() print(cookies)这个阶段相对简单但要注意保存好这些cookie值因为在后续请求中都需要带上它们。3.2 二次请求获取js文件第二次请求是从首页中解析出的一个js文件。这个阶段服务器会进行更严格的环境检测包括TLS指纹、浏览器特性等。使用curl_cffi的impersonate参数可以很好地模拟Chrome浏览器的行为。js_url https://www.dhl.com/static/js/main.xxxxxx.js # 实际URL需要从首页解析 response requests.get(js_url, headersheaders, cookiescookies, impersonatechrome101)这个阶段返回的_abck仍然是以~-1~-1~-1结尾但服务器已经收集了更多环境信息。3.3 三次提交sensor_data参数第三次请求是最关键的阶段需要构造并提交sensor_data参数。这个参数包含了大量环境信息服务器会根据这些信息判断请求是否来自真实浏览器。sensor_data { # 这里需要填充真实的sensor_data参数 key1: value1, key2: value2 } api_url https://www.dhl.com/api/sensor response requests.post(api_url, jsonsensor_data, headersheaders, cookiescookies, impersonatechrome101)如果验证成功返回的_abck值会是~-1~||0||~-1这样的格式如果失败则仍然是~-1~-1~-1结尾。4. sensor_data参数生成机制4.1 核心生成原理sensor_data参数的生成依赖于对浏览器环境的完美模拟。在实际操作中我发现这个参数主要包含以下几类信息浏览器指纹信息硬件配置信息网络环境信息交互行为特征这些信息会被编码成一个特定的JSON结构通过XMLHttpRequest发送到服务器端。4.2 关键检测点模拟要成功生成sensor_data必须处理好以下几个关键检测点DOM操作检测document.getElementsByTagName(input); document.createElement(div);Window对象属性检测window.innerWidth; window.innerHeight; window.devicePixelRatio;WebRTC相关检测RTCPeerConnection.prototype.createOffer; RTCPeerConnection.prototype.setLocalDescription;Canvas指纹检测const canvas document.createElement(canvas); const ctx canvas.getContext(2d); ctx.fillText(test, 10, 10);4.3 完整补环境示例下面是一个相对完整的补环境示例代码// 模拟XMLHttpRequest XMLHttpRequest function XMLHttpRequest() {} XMLHttpRequest.prototype.open function() {} XMLHttpRequest.prototype.send function() { console.log(sensor_data:, JSON.parse(arguments[0])[sensor_data]); } // 模拟WebRTC RTCPeerConnection class {} RTCPeerConnection.prototype.createOffer function() { return new Promise((resolve) { resolve({ sdp: v0\r\no- 7557661829766968651 2 IN IP4 127.0.0.1\r\ns-\r\nt0 0\r\naextmap-allow-mixed\r\namsid-semantic: WMS\r\n, type: offer }); }); }5. 常见问题与解决方案5.1 TLS校验失败问题AKM 3.0对TLS指纹有严格的校验使用普通requests库很容易被识别。这就是为什么我们要使用curl_cffi库它能完美模拟Chrome的TLS指纹。# 错误的做法 import requests response requests.get(url) # 这样会被识别 # 正确的做法 from curl_cffi import requests response requests.get(url, impersonatechrome101)5.2 cookie同步问题在整个流程中cookie的同步非常重要。特别是在补环境时需要动态注入之前获取的cookie值。cookies response.cookies.get_dict() cookie_str ; .join([f{key}{value} for key, value in cookies.items()]) # 在补环境时需要注入这些cookie document { cookie: cookie_str }5.3 环境检测不通过如果发现_abck总是返回~-1~-1~-1说明环境检测没有通过。这时候需要检查以下几个方面是否完整模拟了所有必要的DOM APIWebRTC相关对象是否正确定义浏览器指纹信息是否合理请求时序是否符合正常浏览行为6. 实战技巧与经验分享在实际操作中我发现有几个小技巧特别有用使用真实的浏览器信息直接从你的Chrome浏览器复制User-Agent、Accept-Language等头部信息。渐进式补环境不要试图一次性补全所有环境而是先补最基本的然后根据服务器响应逐步添加其他检测点。日志记录在补环境的代码中加入详细的日志记录这样当出现问题时可以快速定位。环境隔离建议在独立的虚拟环境中进行测试避免影响其他项目。版本控制AKM 3.0可能会更新检测机制所以要保持代码的灵活性便于快速调整。最后要提醒的是逆向工程虽然有趣但一定要遵守相关法律法规仅用于学习和研究目的。在实际操作中我发现每次遇到问题都是学习的好机会通过不断尝试和调试最终总能找到解决方案。