URL aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQWdxOGNiN2NuOUJ5aFpibXgtWFFEZFJUdkZ6bUplQkJYT1VPNFFmbFA5Nk0/ZnJvbV90YWJfbmFtZT1tYWlu电脑端某音的签名逻辑一直是老生常谈的问题其核心仍然围绕 VMP 虚拟机保护 展开。我们可以先在浏览器开发者工具中针对 a_bogus 参数下一个 XHR 断点当请求中出现该参数时程序会自动断住在文件 bdms_1.0.1.19_fix.js通过断点可以观察到a_bogus 并不是在普通明文 JavaScript 逻辑中直接生成的而是在 VMP 虚拟机内部完成计算的。因此后续分析重点需要放在 VMP 执行流程、指令分发逻辑、虚拟栈变化以及关键参数进入和输出的位置上。我们看堆栈 记得把日志打全包含数组的操作还有计算-*/^ 等我们直接下日志断点发现在这里生成的下面我们来分析下怎么生成的a_bogus。1.1生成3个32位数组两次sm3加密URL拼接 dhzx dhzx进行两次sm3加密 经过了ua base64编码 然后进行sm3加密1.2生成 50 位数组上面的32位数组的取值时间戳等 50位生成比较远必须日志下全看在哪里设置进去的1.3 生成 43 位数组浏览器屏幕尺寸编码得到 43 位数组560|919|1920|1040|1920|1040|1920|1080|Win32这些参数通过ord()函数转换为 ASCII 值并构成一个长度为 43 的数组。1.4 生成 3 位数组通过以下方式生成3 位数组它基于timestamp参数生成timestamp3进行计算得到1.5 生成 8 位数组生成8 位数组通过随机数进行计算生成1.6 生成 1 位数组8 位数组和50 位数组进行 XOR 运算并合成一个新的数组array_11.7 合并 97 位数组将array_50、array_43、array_3和array_1数组合并为一个新的97 位数组环境不同长度不同array_97array_50array_43array_3array_12. 生成 129 位数组通过以下方式将97 位数组转换为129 位数组传入之前拼接的97位数组 进行计算计算得到3. 合并最终数组将8 位数组和129 位数组计算得到一个大的数组4. 数组转换为乱码接下来将合并后的137位数组 转换为乱码格式4.1 补充前四位为了确保生成的数据符合要求我们后面会乱码前面去拼接了这个四位数组作为前缀通过随机数生成4.2 RC4 加密日志打全就会看到对数组的操作看到一个256的数组可以问下AI就会知道是rc4加密我们分析日志发现使用 RC4 加密算法对乱码数据 进行加密并将4位 作为加密的前缀拼接该函数用于生成后续加密流程所需的 S-box 置换表。 与标准 RC4 KSA 不同经过256轮后得到最终的 S-box。 RC4 加密会使用一个密钥流对数据进行加密确保数据的安全性。 日志里最终结果前面多了4字节 headerbytes(four_array)headerbody就是结果5. 自定义 Base64 编码分析日志最后得知将经过 RC4 加密后的数据进行自定义 Base64 编码。Base64 字母表是自定义的。6. 输出最终结果最终输出经过加密和 Base64 编码后的结果Encrypted Base64 Result:bvYa8B9y/VKXigkZeCsEjGXN8grOjvHK97mQu/hYqB7D1AV8RL7p2QZZ46xR1Mx0QfJST0aXlvk0l2QJS1b/KL02/rurTbDVqgfQHgOfUVzFNFTGHWFAwNVlvQCpjOZevF39P/eiHGtWA7hniYml声明本文章中所有内容仅供学习交流使用不用于其他任何目的不提供完整代码抓包内容、敏感网址、数据接口等均已做脱敏处理严禁用于商业用途和非法用途否则由此产生的一切后果均与作者无关本文章未经许可禁止转载禁止任何修改后二次传播擅自使用本文讲解的技术而导致的任何意外作者均不负责若有侵权请联系作者立即删除