步骤

  1. 在空白区构建一段代码

  2. 修改入口地址为新增代码

  3. 新增代码执行后,跳回入口地址

添加代码

如上图,在0x830处添加代码,6A 00 执行4次压入MessageBox的参数,在反汇编工具中获取MessageBoxA的地址为0x771E34D0
E8和E9指令不能直接写入地址,计算公式为:要跳转的地址 - E8指令(CALL)当前的地址 - 5 = E8指令实际代码地址

计算E8指令的地址

0x00000838 VA = 0x00411438
MessageBoxA = 0x771E34D0
0x771E34D0 - 0x00411438 - 5 = 0x76DD2093

计算E9指令的地址

0x0000083D VA = 0x0041143D
0x00411023 - 0x0041143D - 5 = 0xFFFFFBE1

将计算后的结果按小端储存写入,E9跳转地址计算出来是一个负数,按补码形式写进去就行了。


修改程序入口

找到IMAGE_OPTIONAL_HEADER下的AddressOfEntryPoint(拓展PE头往后偏移16个字节),修改为0x830在内存中的偏移地址(RVA),此例中为0x411430


在OD中查看可以正常执行,执行完毕后再跳转到程序原本的入口函数