1

简而言之

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

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

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

我试过什么

我尝试通过将可执行文件中的操作码替换movsx为简单mov的替换,但这并没有按计划进行(使用调试器来验证更改,我确定它在正确的位置)0fbf8b0c

一些背景

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

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

我可以尝试找出返回负值的原因ecx,但是在调试会话期间,我注意到将高字归零完成了这项工作(也就是打印了文件)

因此,我不想FFFF9298在执行后包含地址,而是包含.004044beecx00009298

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
4

2 回答 2

3

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

操作码(适用于 16->32 版本)0F B7 /r只需将 BF 修补到 B7 就可以了。

于 2013-01-23T18:50:30.877 回答
3

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

movzx用 0 填充最高位。

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

于 2013-01-23T18:50:39.730 回答