修补 PE 文件 - 添加数据

逆向工程 聚乙烯
2021-06-26 14:42:28

用反汇编器打开PE文件后,我知道我必须修补哪些指令。如果我必须添加一些数据,我可以手动调整 PE 文件结构,以便正确解析并执行。

示例,替换EB 1CE9 1C FD

现在,问题。我必须修改多个位置,手动调整值让我很沮丧。我可以使用python 中的code.google.com/p/pefile做到这一点,我认为这将有助于调整吗?或者我可以使用任何其他模块吗?我能找到一些示例代码吗?

1个回答

这并不容易,或者很容易出错。如果要插入 3 个字节而不是 2 个字节,最好执行以下操作trampoline:跳转到其他位置,执行所需操作,然后跳回下一条指令。通过使用蹦床,您还可以保存寄存器。

一个小样本可能是这样的:

jmp SomePlace  <---destroy old bytes and insert an unconditional jump  
NextInst:      <----|_________________________  
 ..                                           |    
SomePlace:                                    |   
"dancing with wolves"                         |  
jmp NextInst <------- this will jump back to->|  

在这种情况下,如果您有兴趣用两个字节替换两个字节,那么几乎所有的十六进制编辑器都有某种形式的搜索和替换功能。

或者您可以在您喜欢的实用程序中编写一个简单的脚本。

一个简单的 Windbg 示例脚本,用于将所有push XXXX 68 XXXXXX字节替换EB FE. 这个例子是一个原型,你需要根据你得到的模式来调整它:

.foreach /pS4 /ps 9 ( place { # 68?? 401000 l?0x20} ) {u place L1;ew place feeb;u place L1 } 

这所做的只是searchpattern 68??(盲目搜索可能会改变非预期数据,谨慎使用)的反汇编

当它被发现时,它使用在那里发现更换两个字节的地址68XXEB FE

它对在给定范围内找到的所有字节执行此操作。除此之外,它还打印出修改前和修改后的组件:

# 68??  pattern search command in windbg 
401000 l?0x20  start search from 0x401000 end at 401020 
u place l1 disassemble one instruction when pattern found
ew place feeb  write word 0xfeeb at found address  
dis assemble again
loop with foreach where ps and pS are skip before and skip after bytes 

上述脚本的示例输出:

0:000> .foreach /pS4 /ps 9 ( place { # 68?? 401000 l?0x20} ) {u place L1;ew place feeb;u place L1 } 
msgbox!start+0x2 [msgbox.asm @ 17]:
00401002 6800304000      push    offset msgbox!MsgCaption (00403000)
msgbox!start+0x2 [msgbox.asm @ 17]:
00401002 ebfe            jmp     msgbox!start+0x2 (00401002)
msgbox!start+0x7 [msgbox.asm @ 17]:
00401007 6819304000      push    offset msgbox!MsgBoxText (00403019)
msgbox!start+0x7 [msgbox.asm @ 17]:
00401007 ebfe            jmp     msgbox!start+0x7 (00401007)