frida 的钩子函数

逆向工程 补丁反转 函数挂钩 勾搭 弗里达
2021-07-08 09:18:36

我如何使用 frida 挂钩函数?有人可以给我一个例子吗?

钩在 0x412312 并将汇编代码更改为“mov eax, 999”

我 Arleady 尝试过类似的东西:https ://pastebin.com/eGPf5k0R

但它对我不起作用,谢谢帮助!

1个回答

尝试使用Memory.patchCode来实现这一点。这是一个简短的例子。

int test() { return 1024; }

int main(int argc, char **argv) {
    printf("%d\n", test());
    return 0;
}

编译后,这看起来像

[0x00400560]> s sym.test
[0x00400656]> pdf
┌ (fcn) sym.test 11
│   sym.test ();
│           ; CALL XREF from main @ 0x400670
│           0x00400656      55             push rbp
│           0x00400657      4889e5         mov rbp, rsp
│           0x0040065a      b800040000     mov eax, 0x400              ; 1024
│           0x0040065f      5d             pop rbp
└           0x00400660      c3             ret
[0x00400656]> s sym.main
[0x00400661]> pdf
┌ (fcn) main 44
│   int main (int argc, char **argv, char **envp);
│           ; var char **var_10h @ rbp-0x10
│           ; var int32_t var_4h @ rbp-0x4
│           ; arg int argc @ rdi
│           ; arg char **argv @ rsi
│           ; DATA XREF from entry0 @ 0x40057d
│           0x00400661      55             push rbp
│           0x00400662      4889e5         mov rbp, rsp
│           0x00400665      4883ec10       sub rsp, 0x10
│           0x00400669      897dfc         mov dword [var_4h], edi     ; argc
│           0x0040066c      488975f0       mov qword [var_10h], rsi    ; argv
│           0x00400670      e8e1ffffff     call sym test()             ; sym.test
│           0x00400675      89c6           mov esi, eax
│           0x00400677      bf24084000     mov edi, 0x400824           ; const char *format
│           0x0040067c      b800000000     mov eax, 0
│           0x00400681      e89afeffff     call sym.imp.printf         ; int printf(const char *format)
│           0x00400686      b800000000     mov eax, 0
│           0x0040068b      c9             leave
└           0x0040068c      c3             ret

在 0x0040065a 处,常量 1024(0x400) 被复制到 eax。运行时,这看起来像

$ ./test
1024

这可以在运行时由 frida 使用 patchCode

var pc = new NativePointer(0x0040065a)
Memory.patchCode(pc, 5, function (code) {
  var cw = new X86Writer(code, { pc: pc });
  cw.putMovRegU32('eax', 999);
  cw.flush();
});

运行时

$ frida -q -l patch_code.js -f ./test --no-pause
Spawned `./test`. Resuming main thread!                                  
999
Process terminated