ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

签名算法逆向常见套路总结

签名算法逆向常见套路总结 在客户端与服务端的交互链路中签名算法是防篡改、防重放、鉴权校验的核心防线也是逆向工程、协议分析领域最常遇到的防护手段。无论是 Web 前端的 JS 签名、移动端 App 的 Native 签名还是小程序、桌面端的加密逻辑其逆向思路都存在高度通用的套路与方法论。本文系统梳理签名算法逆向的全流程技巧覆盖定位、识别、还原、对抗四大阶段总结可复用的实战套路。一、签名算法快速定位从入口到核心函数逆向的第一步永远是定位找不到签名生成的代码位置后续分析无从谈起。主流定位手段按优先级排序如下1. 全局特征字符串搜索这是成本最低、见效最快的定位方式绝大多数签名代码都会留下可检索的特征。直接搜索关键字sign、signature、encrypt、hash、md5、sha、hmac、token、timestamp、nonce、appkey、secret等覆盖函数名、变量名、常量字符串。搜索参数名抓包获取请求参数后直接搜索签名对应的字段名如sign、sig、_sign顺着参数赋值回溯生成函数。搜索算法常量标准加密算法自带固定魔数例如 MD5 的0x67452301、SHA1 的0x67452301/0xEFCDAB89、AES 的 S 盒常量、RSA 的大质数特征直接搜十六进制常量可秒级定位算法实现。2. 网络请求堆栈回溯签名一定生成在请求发出之前顺着网络调用栈向上追溯是最精准的路径。Web 端在浏览器 DevTools 的 Network 面板给目标请求下断点查看 Call Stack逐层向上找到参数组装、签名计算的函数。移动端用 Frida Hook 网络库OkHttp、NSURLSession、curl 等在请求发送前打印调用栈定位签名生成的上层函数。通用技巧给常见的请求发送函数下断如fetch、XMLHttpRequest.send、okhttp3.Request.Builder.build回溯参数构造逻辑。3. 输入输出断点法当代码混淆严重、字符串不可搜时用已知输入反推位置。构造固定输入如固定的timestamp、固定参数在内存中搜索该字符串的引用找到被传入的加密函数。计算已知签名结果在内存中搜索结果值反向定位生成该结果的函数返回处。二、算法类型识别判断用了哪种签名方案定位到函数后第二步是快速判断算法类型避免逐行分析汇编 / 混淆代码。1. 经典哈希类签名最常见的签名方案通常是参数拼接 密钥 哈希计算。MD5/SHA1/SHA256输出长度固定32/40/64 位十六进制输入相同则输出完全一致无密钥时为纯哈希带密钥则为 HMAC。识别技巧观察输出长度查看代码中是否有 64 字节HMAC的密钥填充逻辑是否存在标准的四轮循环、常量数组。常见变体参数按字典序排序后拼接、首尾拼接密钥、多次哈希如 MD5 两次、截取部分位数。2. 非对称加密类签名安全性更高常用于核心接口、支付、登录等场景。RSA 签名通常是 SHA1/RSA 或 SHA256/RSA签名结果长度较长128/256 字节对应 1024/2048 位密钥公钥通常内置在客户端。ECC/ECDSA椭圆曲线签名密钥更短常见于移动端、物联网设备代码中会出现椭圆曲线参数、点运算逻辑。识别技巧查找大整数运算、模幂运算、曲线参数常量搜索公钥字符串如-----BEGIN PUBLIC KEY-----。3. 对称加密与编码类签名部分场景会用 AES、DES 加密后做签名或 Base64 / 自定义编码混淆。特征输出可解码密钥固定输入变化时输出呈块级变化常伴随 Base64、URL 编码、十六进制转换。注意区分编码不是加密Base64、Hex 只是编码格式真正的签名逻辑在编码之前。4. 自定义混淆算法厂商自研的签名逻辑无标准常量通常是位运算、置换、查表、循环哈希的组合。识别特征找不到标准算法常量逻辑琐碎、大量异或移位伴随自定义 S 盒、置换表。应对思路提取核心函数输入多组样本观察输入输出映射关系逐步还原运算逻辑。三、通用还原套路从定位到可复现定位并识别算法后目标是完整还原签名逻辑写出可独立运行的签名生成代码。1. 参数提取与拼接规则还原签名的核心往往不是算法本身而是参数的选取、排序、拼接规则和密钥。固定变量确认哪些参数参与签名是否包含时间戳、随机数、设备信息、版本号。排序规则是否按 key 字典序排序、是否剔除空值、是否剔除 sign 字段本身。拼接格式键值对用还是直接拼接、是否用分隔、首尾是否追加固定密钥。实战技巧Hook 签名函数的入参直接打印拼接完成的原始字符串是最快的还原方式。2. 密钥与盐值提取绝大多数签名都依赖固定密钥或盐值找到密钥就完成了 80% 的工作。硬编码密钥直接在代码常量、字符串资源、配置文件中搜索JS 中常写死在配置对象里Native 中常存于常量段。动态生成密钥密钥由设备信息、包签名、时间戳等派生需追踪密钥的生成链路。密钥分片密钥拆分成多段存储运行时拼接需在内存中 Hook 最终拼接结果。3. 动态 Hook 抓中间值静态分析困难时动态 Hook 是最高效的还原手段。Web 端用 Tampermonkey 注入脚本Hook 签名函数打印入参、中间值、返回结果对混淆 JS 可在关键位置插桩。Android 端Frida Hook 目标方法打印参数和返回值Native 层 Hook 加密函数地址抓取明文输入和密文输出。iOS 端Frida / Monolith Hook 加密相关函数利用 Mach-O 符号表或字符串交叉引用定位。核心思路不纠结内部实现先抓输入输出验证算法类型再补全细节。4. 等价移植与验证还原后必须做一致性验证确保和原生结果完全一致。取多组相同输入分别用原生和还原代码计算对比输出是否完全一致。注意大小写、编码格式UTF-8/GBK、填充方式PKCS5/PKCS7、字节序等细节差异。存在随机数、时间戳时固定随机种子和时间验证确定性部分是否一致。四、常见对抗场景与破解套路实际逆向中很少遇到裸奔的标准算法通常伴随代码混淆、反调试、环境检测等防护。1. JS 签名对抗Web 端签名常见混淆手段控制流平坦化、字符串加密、无限 debugger、域名绑定、虚拟机保护。无限 debugger替换 debugger 关键字、HookFunction.prototype、禁用断点、定时器置空。控制流平坦化使用 AST 工具还原结构或直接 Hook 关键函数跳过内部逻辑。JS 虚拟机如 JSC、VM2、自定义解释器定位解释器入口Hook 字节码执行抓取关键运算的输入输出。webpack 打包场景定位__webpack_require__通过模块导出特征找到签名模块直接导出函数调用。2. Native 签名对抗移动端 SO 库常见防护加壳、UPX 压缩、反调试、指令混淆、VMP 虚拟化。脱壳先行先处理加固壳梆梆、爱加密、360 加固等拿到原始 SO 再分析。反调试绕过Hookptrace、syscall、android.os.Debug.isDebuggerConnected等检测点。指令混淆 / VMP优先 Hook 函数出入口抓参数不硬杠内部逻辑必要时用 Unicorn 模拟执行。JNI 动态注册通过RegisterNativesHook 获取函数地址映射到 Java 层方法。3. 签名校验对抗部分服务端不仅校验签名还会校验客户端环境、证书、设备指纹。优先还原纯签名逻辑不要上来就改客户端避免触发风控。遇到签名与设备绑定的情况提取设备指纹参数模拟固定设备信息。存在签名时效时同步校准时间戳确保请求时间在合法窗口内。五、效率提升工具链与惯用技巧1. 常备工具集Web 逆向Chrome DevTools、Fiddler/Charles、AST Explorer、js-beautify、Tampermonkey。移动端逆向Frida、Objection、IDA Pro、Ghidra、jadx、Apktool、LLDB。通用辅助CyberChef加解密编码转换、Python复现算法、写脚本、Unicorn模拟执行。2. 优先级原则先抓包看参数再定位代码不盲目反编译全量分析。先搜字符串常量再看函数名最后才读汇编 / 混淆代码。先动态 Hook 抓输入输出再静态还原细节能 Hook 就不硬读。先验证算法类型再抠具体实现避免南辕北辙。3. 常见坑点提醒注意编码差异UTF-8 与 GBK、字节与字符串、Hex 与 Base64。注意字节序大端小端在跨平台移植时极易出错。注意填充规则哈希类的填充、对称加密的填充方式直接影响结果。注意多轮加密一次签名可能包含多次哈希、多次加密、编码嵌套。六、总结签名算法逆向的本质是在层层防护中找到「输入参数 密钥 算法 编码」四个要素再通过等价复现实现签名逻辑的移植。整个过程遵循「定位 → 识别 → 提取 → 验证」的标准化流程绝大多数场景都可以套用上述套路解决。对于逆向从业者而言熟练掌握通用套路、建立工具化思维远比死磕单个算法更重要。真正的难点往往不在加密本身而在混淆对抗、环境检测、风控策略等外围防护这也是后续持续深入的方向。
返回列表