从任何函数返回静态值非常容易。我假设您的调用约定在 (e|r)ax 寄存器中采用返回值。
所以要返回一些值,只需修补你的函数看起来像
mov rax, <value>
ret
让我们考虑一个例子。
#include <stdio.h>
int test(int n) {
int i, sm = 0;
for (i = 1; i <= n; i++)
sm += (i * i);
return sm;
}
int main(int argc, char **argv) {
int n;
scanf("%d", &n);
printf("%d\n", test(n));
return 0;
}
运行时,这看起来像
$ ./test
9
285
$ ./test
10
385
编译后,这看起来像
.text:0000000000000720 public test
.text:0000000000000720 test proc near ; CODE XREF: main+2C↓p
.text:0000000000000720
.text:0000000000000720 var_14 = dword ptr -14h
.text:0000000000000720 var_8 = dword ptr -8
.text:0000000000000720 var_4 = dword ptr -4
.text:0000000000000720
.text:0000000000000720 ; __unwind {
.text:0000000000000720 push rbp
.text:0000000000000721 mov rbp, rsp
.text:0000000000000724 mov [rbp+var_14], edi
.text:0000000000000727 mov [rbp+var_8], 0
.text:000000000000072E mov [rbp+var_4], 1
.text:0000000000000735 jmp short loc_745
.text:0000000000000737 ; ---------------------------------------------------------------------------
.text:0000000000000737
.text:0000000000000737 loc_737: ; CODE XREF: test+2B↓j
.text:0000000000000737 mov eax, [rbp+var_4]
.text:000000000000073A imul eax, [rbp+var_4]
.text:000000000000073E add [rbp+var_8], eax
.text:0000000000000741 add [rbp+var_4], 1
.text:0000000000000745
.text:0000000000000745 loc_745: ; CODE XREF: test+15↑j
.text:0000000000000745 mov eax, [rbp+var_4]
.text:0000000000000748 cmp eax, [rbp+var_14]
.text:000000000000074B jle short loc_737
.text:000000000000074D mov eax, [rbp+var_8]
.text:0000000000000750 pop rbp
.text:0000000000000751 retn
.text:0000000000000751 ; } // starts at 720
.text:0000000000000751 test endp
单击从 0x720 开始的函数。转到编辑 -> 补丁程序 -> 组装。
在打开的窗口写
mov eax, 99
并按确定。
它将修补当前的push rbp.
最后写
ret
按 OK 然后按 Cancel 停止修补。
转到编辑 -> 补丁程序 -> 将补丁应用到输入文件
使用更新的更改保存二进制文件。现在它运行就像
$ ./test
9
99
$ ./test
10
99
$ ./test
99
99