Debugging 修补可执行文件

Debugging 修补可执行文件,debugging,assembly,x86,exe,patch,Debugging,Assembly,X86,Exe,Patch,简言之 通过替换exe文件中的以下指令,确保ecx的高位字包含0的最简单方法是什么 004044be 0fbf4dfc movsx ecx,word ptr [ebp-4] 执行adress004044be后,我希望ecx包含00009298而不是包含FF9298 004044ac 0fbf05e8025100 movsx eax,word ptr [Encore32!SystemsPerPageDlogProc+0x10e4a1 (005102e8)] 004044b

简言之

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

004044be 0fbf4dfc        movsx   ecx,word ptr [ebp-4]
执行adress
004044be
后,我希望
ecx
包含
00009298
而不是包含
FF9298

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
我试过什么

我曾尝试用一个简单的
mov
替换
movsx
,将可执行文件中的操作码
0fbf
替换为
8b0c
,但没有按计划进行(使用调试器验证更改,我确信它位于正确的位置)

一些背景

我有一个相当旧的程序,当我试图打印到我的HP打印机时,出于某种原因或其他AV。当我打印到CutePDF时,一切正常,因此当前的解决方法是生成一个PDF文件并打印PDF

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

我可以尝试找出返回负值的原因,但在调试过程中,我注意到将
ecx
中的高位字归零完成了这项工作(即打印文件)

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

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

使用
movzx
,它可以完全满足您的需要


(对于16->32版本)是B7/r的
0F,所以只需将BF修补到B7就可以了。

使用
movzx
,它完全满足您的需要

(对于16->32版本)是B7/r的
0F,所以只需将BF修补到B7就可以了。

意思是“带扩展符号移动”。这意味着src的高位被复制到dest的所有高位。你不会想要的

用0填充顶部位

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

意思是“带符号扩展移动”。这意味着src的高位被复制到dest的所有高位。你不会想要的

用0填充顶部位


movzx-ecx,单词ptr[ebp-4]
是您所需要的。在您的示例中使用32位代码,它可以被编码为B7 4D FC的
0F

+1-我真的很愿意接受这两个答案。你的更详细,但伊戈尔的是第一个。谢谢你们两位。我真的很乐意接受两个答案。你的更详细,但伊戈尔的是第一个。谢谢,向你们俩致敬。