修补可执行文件

时间:2013-01-23 18:36:53

标签: debugging assembly x86 exe patch

简而言之

通过替换exe文件中的以下指令,确保ecx的高位字包含0的最简单方法是什么?

004044be 0fbf4dfc        movsx   ecx,word ptr [ebp-4]

在执行地址FFFF9298后,我不想包含004044be,而是希望ecx包含00009298

我尝试了什么

我已尝试将movsx替换为简单的mov,将可执行文件中的操作码0fbf替换为8b0c,但无法按计划执行 (使用调试器来验证更改,我确定它位于正确的位置)

一些背景

当我尝试打印到HP打印机时,我有一个相当旧的程序出于某种原因出现这种情况。当我打印到CutePDF时,一切正常,所以当前的解决方法是生成PDF文件并打印PDF。

用WinDbg弄湿我试图找出原因发生的原因。 虽然这不是我的问题的根本原因,但似乎ecx在某个时刻得到一个负值,用于分配内存,最终导致异常。

我可以尝试找到为什么返回负值但是在我的调试会话期间,我注意到将ecx中的高位字清零并完成了作业(又名打印)文件)

因此,在执行地址FFFF9298后,我不想包含004044be,而是希望ecx包含00009298

004044ac 0fbf05e8025100  movsx   eax,word ptr [Encore32!SystemsPerPageDlogProc+0x10e4a1 (005102e8)]
004044b3 05416f0000      add     eax,6F41h
004044b8 668945fc        mov     word ptr [ebp-4],ax
004044bc 6a40            push    40h
004044be 0fbf4dfc        movsx   ecx,word ptr [ebp-4] --> replace with ?
004044c2 51              push    ecx
004044c3 8b55f8          mov     edx,dword ptr [ebp-8]
004044c6 52              push    edx

2 个答案:

答案 0 :(得分:3)

使用movzx,它完全符合您的需要。

The opcode(对于16-> 32版本)是0F B7 /r所以只需将BF修补到B7即可。

答案 1 :(得分:3)

movsx表示“带符号扩展”。这意味着src的最高位被复制到dest的所有高位。你不希望这样。

movzx用0填充最高位。

movzx ecx,word ptr [ebp-4]就是您所需要的。使用示例中的32位代码,可以将其编码为0F B7 4D FC