1

要するに

ecxexeファイルの次の命令を置き換えることにより、上位ワードに0が含まれていることを確認する最も簡単な方法は何ですか?

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

FFFF9298address を実行した後に含むのではなく、 を含め004044beたいと思いecxます00009298

私は何を試しましたか

実行可能ファイルのオペコードを置き換えることmovsxで単純なものに置き換えようとしましたが、計画どおりに機能しませんでした(デバッガを使用して変更を確認しましたが、正しい場所にあったと確信しています)mov0fbf8b0c

いくつかの背景

HPプリンターに印刷しようとすると、何らかの理由でAVが発生するかなり古いプログラムがあります。CutePDF に印刷するとすべて正常に動作するため、現在の回避策は PDF ファイルを生成して PDF を印刷することです。

WinDbg で足を濡らして、なぜこれが起こっているのか理由を見つけようとしました。これは私の問題の根本的な原因ではありませんが、ecxある時点で get がメモリの割り当てに使用される負の値になり、最終的に例外が発生するようです。

負の値が返される理由を見つけようとすることはできましたが、デバッグ セッション中に、上位ワードをゼロにすると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
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 に答える