Windows 7、32ビットホームプロで実行
Visual Studio 2008で非常にシンプルな数行のアプリを作成し、コンパイルして、リリースモードの標準ライブラリと実行可能test.exeにリンクしました。
cのコードは次のとおりです。
char* test = "h";
int main()
{
_asm
{
push 0xFEEDBACC;
}
MessageBoxA(0,test,test,0);
}
これにより、VS2008で表示される次のマシンコードと対応するアセンブリが生成されます(アドレスは以下にリベースされ、通常の開始仮想アドレスは0x4001000)
char* test = "h";
int main()
{
_asm
{
push 0xFEEDBACC;
00261000 68 CC BA ED FE push 0FEEDBACCh
}
MessageBoxA(0,test,test,0);
00261005 6A 00 push 0
00261007 68 F4 20 26 00 push offset string "h" (2620F4h)
0026100C 68 F4 20 26 00 push offset string "h" (2620F4h)
00261011 6A 00 push 0
00261013 FF 15 A4 20 26 00 call dword ptr [__imp__MessageBoxA@16 (2620A4h)]
}
ここで、MessageBoxを呼び出す代わりに、プッシュ0の直後に別の文字列 "h"をプッシュしたいので、hexeditを使用して、FF15A420 ...を含むセクションを検索し、上書きして次のようにします。
90 68 CC BA ED FE
IDAで実行可能ファイルを無料で開くと、.textセクションに次のように表示されます。
.text:00401000 push 0FEEDBACCh
.text:00401005 push 0
.text:00401007 push offset unk_4020F4
.text:0040100C push offset unk_4020F4
.text:00401011 push 0FFFFFF90h
.text:00401013 nop
.text:00401014 push 0FEEDBACCh
.text:00401019 retn
これは今のところ良さそうです、私は0x401014で私の新しいプッシュステートメントを見る。
ここで、IDAフリーでexeを突然デバッグすると、コードが変更されます(以下を参照)。プッシュ0FEEDBACCがプッシュ0FFA4BACCになり、最初の2バイトが変更された理由がわかりません。
.text:00F71000 push 0FEEDBACCh
.text:00F71005 push 0
.text:00F71007 push offset unk_F720F4
.text:00F7100C push offset unk_F720F4
.text:00F71011 push 0FFFFFF90h
.text:00F71013 nop
.text:00F71014 push 0FFA4BACCh // im puzzled!
ここで何が起こっているのか、なぜ私がプッシュしている番号が変更されているのかを誰かが説明できますか?このアドレスの開始物理バイトを変更しようとしましたが(何らかのアライメントの問題が疑われます)、違いは見られませんでした。
ありがとう、
スキモン