mtgsig 1.2 完整逆向拆解美团小程序 H5guard 加密一、先明确核心结论你现在用的 9521 端口服务 官方封装好的黑盒 RPC 加密服务本质是内置了完整逆向还原后的 H5guard 1.2 算法输入请求参数直接输出可用 mtgsig不用自己写加密逻辑纯逆向脱离 RPC 服务本地复现算法分两大路径JS 端原生逆向、纯数学公式还原mtgsig1.2 不是单纯请求签名是设备指纹 请求报文 时间戳混合加密的风控校验串包含多层 AES、MD5、位运算、HKDF 密钥派生。二、mtgsig 1.2 各字段含义逆向基础jsonmtgsig: {a1:1.2,a2:时间戳,a3:WEBDFPID,a5:AES加密环境串,a6:设备指纹密文,a8:MD5哈希,a9:SDK版本,a10:固定随机因子,x0:4,d1:全局请求校验哈希}表格字段生成逻辑逆向关键点a1固定字符串1.2版本标识a2毫秒级 Unix 时间戳Date.now()防重放a3入参传入的 WEBDFPID设备指纹 Cookiex0固定常量4算法版本标记a6采集小程序环境wx api、屏幕、系统→ AES-CBC 加密 → Base64 输出密钥动态派生自 a2a3a8多段环境数组异或运算后转 16 进制 MD5 摘要a5请求报文urlmethodbody拼接盐值HKDF-SHA256 派生密钥后 AES 加密 Base64d1全量 mtgsig 字段有序拼接后的 SHA256 哈希最终校验值a9/a10SDK 固定版本、固定混淆因子可静态写死三、完整逆向分步流程两种方案方案 1抓小程序 JS 原生逆向最标准还原完整方程式步骤 1定位加密入口H5guard.js微信小程序调试抓包加载的h5guard.min.js格式化混淆代码HookJSON.stringify、XMLHttpRequest断点拦截生成 mtgsig 的函数特征同时存在 a1、a2、a3 变量找到顶层自执行加密函数gU()这是 mtgsig 生成总入口。步骤 2分层拆解加密方程式核心数学逻辑密钥派生方程HKDFMasterKeySHA256(mtgsig1.2a2a3)SessionKeyHKDF−SHA256(MasterKey,saltwxmtg) 所有 AES 加密统一使用该会话密钥CBC 模式固定 IV 向量。a6 环境加密方程式plaintextenv_raw JSON.stringify(小程序wx环境信息数组) a6 Base64(AES_CBC_Encrypt(env_raw, SessionKey, iv))a5 请求报文加密方程式plaintextsrc method | url | data | a2 a5 Base64(AES_CBC_Encrypt(src, SessionKey, iv))a8 异或哈希方程三段内置固定大数字数组循环逐位异或合并后转 16 进制小写 MD5a8MD5(arr1⊕arr2⊕arr3).toString(16) 5.d1 最终校验哈希顶层签名方程将所有 mtgsig 字段按a1,a2,a3,a5,a6,a8,a9,a10,x0字典序拼接字符串d1SHA256(concatAllFields).toString(16)步骤 3去混淆、扣完整可运行 JS 代码使用 Babel/AST 工具解密十六进制混淆变量_0xXXxx类数组字符串剥离小程序 wx 环境检测代码补全缺失全局变量模拟 wx、window、localStorage提取纯加密数学函数AES、MD5、位运算、HKDF剥离环境检测垃圾代码。方案 2脱离 JS纯 Python 数学逆向复现不用补小程序环境固定常量提取x04、a9 写死3.1.0,7,61、a10 固定c5复现 HKDF-SHA256 密钥派生函数复现 AES-CBC 加解密固定 IV复现三段数组异或逻辑生成 a8拼接全字段计算 SHA256 得到 d1入参仅需method、url、data、dfpId (a3)、当前时间戳。四、你当前 RPC 服务9521 端口本质说明你调用的/api/get_16_mtgsig是别人已经完成完整逆向封装的成品服务内部已经实现了上面全部加密方程式、HKDF/AES/ 位运算逻辑屏蔽了复杂的小程序环境采集外部只需要传入 4 个业务参数内部自动生成 a2 时间戳、计算 a5/a6/a8/d1 全套字段直接返回组装好的 mtgsig 对象健康检查/health仅用于探测服务存活无加密逻辑。五、逆向难点 避坑点动态密钥坑AES 密钥由 a2 时间戳 dfpId 实时派生固定密钥无法长期生成有效签名每一次请求密钥都不同小程序环境校验坑原生 JS 会校验 wx 全局对象纯 Python 复现时可以直接写死模拟环境字符串不影响签名校验字段排序坑计算 d1 哈希时必须严格固定字段顺序乱序会导致 d1 校验失败服务端直接 403 拦截时间戳防重放a2 时间戳和服务器时差不能超过 30 秒否则 mtgsig 直接失效混淆代码陷阱H5guard 每次小程序版本更新会刷新变量名混淆但是底层加密数学方程式完全不变只需要重新定位入口函数。六、两种使用选择省事方案你现在在用继续调用 9521 端口 RPC 接口不用自己逆向数学公式业务层仅处理请求转发完全自主逆向脱离第三方服务按上面 JS 逆向流程扣出加密函数用 Python 重写全套 HKDF、AES、位运算方程本地独立生成 mtgsig。