如何在不损坏的情况下更改(添加/编辑/删除)二进制文件中的汇编指令?
我知道二进制函数保存在特定的偏移量/地址上,所以如果我更改某些内容,我将损坏所有其他函数。
如何在不损坏的情况下更改(添加/编辑/删除)二进制文件中的汇编指令?
我知道二进制函数保存在特定的偏移量/地址上,所以如果我更改某些内容,我将损坏所有其他函数。
如果我正确理解您的问题,那么您需要做的是在修补时注意您的字节。理想情况下,您的补丁将小于(在这种情况下您可以使用 NOP [字节 0x90] 代替不需要的字节)或等于您想要补丁的指令或指令组的字节数。
以这个指令为例:
application.exe+2F40 - 48 89 44 24 38 - mov [rsp+38],rax
如您所见,您有 5 个字节可以使用:48 89 44 24 38
如何修补这 5 个字节取决于您,无论是编写最多使用 5 个字节的新指令,还是对所有 5 个字节进行 NOP,等等。如果您希望该指令执行占用超过 5 个字节的操作,然后您必须查看围绕该指令的指令,看看您是否可以从本质上给自己更多的字节来使用。
例子:
application.exe+2F39 - 48 8B 05 B82C0100 - mov rax,[application.exe+15BF8]
application.exe+2F40 - 48 89 44 24 38 - mov [rsp+38],rax
application.exe+2F45 - 48 83 F8 FF - cmp rax,-01
现在也许您可以想出一种方法来使用所有这些字节(在该示例中总共 16 个字节)并且仍然保持周围数据/指令的完整性。也许您只想摆脱第一条指令。所以修补它最终可能看起来像这样(注意偏移如何更改以引用每个字节):
application.exe+2F39 - 90 - nop
application.exe+2F3A - 90 - nop
application.exe+2F3B - 90 - nop
application.exe+2F3C - 90 - nop
application.exe+2F3D - 90 - nop
application.exe+2F3E - 90 - nop
application.exe+2F3F - 90 - nop
application.exe+2F40 - 48 89 44 24 38 - mov [rsp+38],rax
application.exe+2F45 - 48 83 F8 FF - cmp rax,-01
最终由您来确定您正在修补的函数在其子例程的任何给定指令中正在做什么。只要确保您的字节数保持平衡,并且您的指令正在按照您的预期执行操作,您就应该做好准备。