Chrome反调试实战:破解x-sign参数
2026/6/15 7:53:57 网站建设 项目流程

最近正值现公司不发工资,闲来无事,试一试自己以前的功力还在不在

  1. 使用 chrome 打开网址,发现有 debugger
  2. 这里我没有使用js hook,之前自己魔改了一版chromium,无视任何 无限 debugger 反调试
  3. 打开控制台监听一下流量请求,定位到核心的x-sign参数,全局search,点击第一个
  4. 进入后可以看到是一个大的数组,headers赋值在下面,调用 r 方法取值,但是 传入的r的参数显然过大,所以在r中肯定存在对入参的一个运算,在到list中取值
  5. 可以看到 r(417) 正好是 x-sign,向上找 k 值,发现对应的代码断
  6. var b = e["a_h"](g, v) , k = b[r(379)](); // 非常明显,由 e["a_h"](g, v) 得来
  7. 进入e["a_h"], 来到 js 与wasm 交互的位置
  8. function m(n, e) { var t, r; try { var o = w(n, c.__wbindgen_malloc, c.__wbindgen_realloc) , i = l , a = w(e, c.__wbindgen_malloc, c.__wbindgen_realloc) , u = l , f = c.a_h(o, i, a, u); return t = f[0], r = f[1], v(f[0], f[1]) } finally { c.__wbindgen_free(t, r, 1) } }
  9. 在左侧 page 中将 wasm下载下来,使用 ghidra 打开,根据 w 方法以及入参,结合 ghidra 反编译,可以看出,w 的具体方法为: 将 字符串 写入 wasm 内存,然后得到他的ptr + len,以下为部分 decompile 的代码
  10. int export::__wbindgen_malloc(int param1,int param2) { int iVar1; iVar1 = core::alloc::layout::Layout::is_size_align_valid::he19191792aae0443(param1,param2); if ((iVar1 != 0) && ((param1 == 0 || (param2 = __rustc[4794b31dd7191200]::__rust_alloc(param1,param2), param2 ! = 0) ))) { return param2; } wasm_bindgen::__rt::malloc_failure::ha557bc2231d6fda2(); do { halt_trap(); } while( true ); }
  11. 整体分析一下可以得出:w 函数为 将 字符串 写入 wasm 内存,然后得到他的ptr + len,c.a_h() 为核心算法,v() 为 字节解码 ==> JS 字符串, c.__wbindgen_free 不理会,不在说明,所以我们具体看 c.a_h()
  12. 部分a_h 代码
  13. hmac::get_der_key::h8c0a5bee0a6aad7c(&stack0xfffffee0,param2,param3); iVar2 = 0; do { *(byte *)((int)&stack0xfffffee0 + iVar2) = *(byte *)((int)&stack0xfffffee0 + iVar2) ^ 0x36; (&local_11f)[iVar2] = (&local_11f)[iVar2] ^ 0x36; (&local_11e)[iVar2] = (&local_11e)[iVar2] ^ 0x36; (&local_11d)[iVar2] = (&local_11d)[iVar2] ^ 0x36; iVar2 = iVar2 + 4; } while (iVar2 != 0x40); local_218 = 0xc3d2e1f0; local_220 = 0x1032547698badcfe; local_228 = 0xefcdab8967452301; local_230 = 1; sha1::compress::compress::h5865e282bc0d80f9(&local_228,&stack0xfffffee0,1); iVar2 = 0; do { *(byte *)((int)&stack0xfffffee0 + iVar2) = *(byte *)((int)&stack0xfffffee0 + iVar2) ^ 0x6a; (&local_11f)[iVar2] = (&local_11f)[iVar2] ^ 0x6a; (&local_11e)[iVar2] = (&local_11e)[iVar2] ^ 0x6a; (&local_11d)[iVar2] = (&local_11d)[iVar2] ^ 0x6a; iVar2 = iVar2 + 4; } while (iVar2 != 0x40); local_190 = 0xc3d2e1f0; local_198 = 0x1032547698badcfe; local_1a0 = 0xefcdab8967452301; local_1a8 = 1; sha1::compress::compress::h5865e282bc0d80f9(&local_1a0,&stack0xfffffee0,1);
  14. 根据 代码 + 字段名 + 操作等可以看出为 HMAC_SHA1 方法,经过一系列技术手段可以得出
    1. 没有随机 IV
    2. 内部不依赖时间,随机数,设备信息
    3. 其他,不写了
  15. 随便打开 webstorm, 随便写点代码,然后确认下自己写的对不对

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询