Chrome反调试实战:破解x-sign参数

发布时间:2026/6/15 7:54:04
Chrome反调试实战:破解x-sign参数 最近正值现公司不发工资闲来无事试一试自己以前的功力还在不在使用 chrome 打开网址发现有 debugger这里我没有使用js hook之前自己魔改了一版chromium无视任何 无限 debugger 反调试打开控制台监听一下流量请求定位到核心的x-sign参数全局search点击第一个进入后可以看到是一个大的数组headers赋值在下面调用 r 方法取值但是 传入的r的参数显然过大所以在r中肯定存在对入参的一个运算在到list中取值可以看到 r(417) 正好是 x-sign向上找 k 值发现对应的代码断var b e[a_h](g, v) , k b[r(379)](); // 非常明显由 e[a_h](g, v) 得来进入e[a_h], 来到 js 与wasm 交互的位置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) } }在左侧 page 中将 wasm下载下来使用 ghidra 打开根据 w 方法以及入参结合 ghidra 反编译可以看出w 的具体方法为 将 字符串 写入 wasm 内存然后得到他的ptr len,以下为部分 decompile 的代码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 ); }整体分析一下可以得出w 函数为 将 字符串 写入 wasm 内存然后得到他的ptr lenc.a_h() 为核心算法v() 为 字节解码 JS 字符串, c.__wbindgen_free 不理会不在说明所以我们具体看 c.a_h()部分a_h 代码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);根据 代码 字段名 操作等可以看出为 HMAC_SHA1 方法经过一系列技术手段可以得出没有随机 IV内部不依赖时间随机数设备信息其他不写了随便打开 webstorm 随便写点代码然后确认下自己写的对不对