如果任何术语不正确,我对倒车还很陌生,所以提前道歉。
我目前正在 Windows 上使用 ghidra 来查看二进制文件的指令/反编译,我希望向现有函数添加一些指令以更改其行为。在这种情况下,这是相当简单的,因为我只想向现有函数参数添加一个固定值,但我还想了解一些有关插入代码稍微复杂的更高级情况的信息。
我做了一个小测试程序来测试这个,我设法通过在十六进制编辑器中编辑二进制文件并简单地移动函数字节并插入我自己的来添加指令。但是我意识到这只是因为函数后面有一堆空内存,所以我可以将它们全部向下移动,但情况并非总是如此。
**************************************************************
* FUNCTION *
**************************************************************
ulonglong __fastcall FUN_140011810(int param_1, int para
ulonglong RAX:8 <RETURN>
int ECX:4 param_1
int EDX:4 param_2
undefined4 Stack[0x10]:4 local_res10 XREF[3]: 140011810(W),
140011835(R),
140011848(R)
undefined4 Stack[0x8]:4 local_res8 XREF[2]: 140011814(W),
14001184e(R)
undefined1 Stack[-0x10]:1 local_10 XREF[1]: 140011867(*)
undefined4 Stack[-0xf4]:4 local_f4 XREF[4]: 140011858(W),
14001185b(R),
140011861(W),
140011864(R)
undefined1 Stack[-0xf8]:1 local_f8 XREF[1]: 140011821(*)
FUN_140011810 XREF[1]: thunk_FUN_140011810:14001104b(T),
thunk_FUN_140011810:14001104b(j)
140011810 89 54 24 10 MOV dword ptr [RSP + local_res10],param_2
140011814 89 4c 24 08 MOV dword ptr [RSP + local_res8],param_1
140011818 55 PUSH RBP
140011819 57 PUSH RDI
14001181a 48 81 ec SUB RSP,0x108
08 01 00 00
140011821 48 8d 6c LEA RBP=>local_f8,[RSP + 0x20]
24 20
140011826 48 8b fc MOV RDI,RSP
140011829 b9 42 00 MOV param_1,0x42
00 00
14001182e b8 cc cc MOV EAX,0xcccccccc
cc cc
140011833 f3 ab STOSD.REP RDI
140011835 8b 8c 24 MOV param_1,dword ptr [RSP + local_res10]
28 01 00 00
14001183c 48 8d 0d LEA param_1,[DAT_140021008] = 01h
c5 f7 00 00
140011843 e8 44 f8 CALL thunk_FUN_140011e80 undefined thunk_FUN_140011e80(ch
ff ff
140011848 8b 85 08 MOV EAX,dword ptr [RBP + local_res10]
01 00 00
14001184e 8b 8d 00 MOV param_1,dword ptr [RBP + local_res8]
01 00 00
140011854 03 c8 ADD param_1,EAX
140011856 8b c1 MOV EAX,param_1
140011858 89 45 04 MOV dword ptr [RBP + local_f4],EAX
14001185b 8b 45 04 MOV EAX,dword ptr [RBP + local_f4]
14001185e 83 c0 0a ADD EAX,0xa
140011861 89 45 04 MOV dword ptr [RBP + local_f4],EAX
140011864 8b 45 04 MOV EAX,dword ptr [RBP + local_f4]
140011867 48 8d a5 LEA RSP=>local_10,[RBP + 0xe8]
e8 00 00 00
14001186e 5f POP RDI
14001186f 5d POP RBP
140011870 c3 RET
140011871 cc ?? CCh
140011872 cc ?? CCh
140011873 cc ?? CCh
140011874 cc ?? CCh
140011875 cc ?? CCh
140011876 cc ?? CCh
140011877 cc ?? CCh
140011878 cc ?? CCh
140011879 cc ?? CCh
14001187a cc ?? CCh
14001187b cc ?? CCh
14001187c cc ?? CCh
14001187d cc ?? CCh
14001187e cc ?? CCh
14001187f cc ?? CCh
140011880 cc ?? CCh
140011881 cc ?? CCh
140011882 cc ?? CCh
具体来说,14001185e 83 c0 0a ADD EAX,0xa
我可以复制此指令并更改0xa以更改输出值。
在更复杂的二进制文件中,我有一个具有类似参数的更大函数,只是在函数末尾没有额外的内存,因此这种移动剩余字节的方法不起作用,因为下面有另一个函数。我也不能删除任何当前的指令来腾出空间,因为这可能会破坏现有的功能。二进制文件的其他地方有很多空内存,所以我想添加一条 jmp 指令来执行一些指令,然后跳回去,但有些指令使用局部变量,所以我不确定这是否可行。
因此,鉴于上面的示例,并且函数末尾没有额外的内存,我该如何插入一些自定义指令?