1

関連するアセンブリ:

$        > 94D3A705         PUSH hw.05A7D394                         ; ASCII "glBegin"
$+5      > E8 99C80500      CALL <JMP.&SDL2.SDL_GL_GetProcAddress>
$+A      > 83C4 04          ADD ESP,4
$+D      > A3 04E03B06      MOV DWORD PTR DS:[63BE004],EAX
$+12     > 8B0D 04E03B06    MOV ECX,DWORD PTR DS:[63BE004]           ; OPENGL32.glBegin
$+18     > 890D 38E83B06    MOV DWORD PTR DS:[63BE838],ECX

最初の行は、文字列アドレスを関数の引数としてスタックにプッシュします。そして最後の行は、ECX からこの DWORD データ オブジェクトに値をコピーします。この住所が私の目標です。含まれている DWORD 値を置き換えたい。

私の C++ コードでは、最初の行のプッシュ関数のアドレスを取得してから、オフセットを追加します。オフセット 0x1A を追加するとコードは機能しますが、+ 0x18 を追加しようとすると機能しません。

すべての機能についてこれをテストするのは好きではありません。私が見逃している根本的な考えは何ですか?

4

1 に答える 1

0
$+18     > 890D 38E83B06    MOV DWORD PTR DS:[63BE838],ECX

命令MOV DWORD PTR DS:[63BE838],ECXは開始点から +18h で始まりますが、命令でハードコーディングされているアドレス自体は 2 バイト後に始まります。

890D 38E83B06

38E83B06逆バイト順: 063be838. Ollydbg は、これを視覚的に分離します。

命令で定数のオフセットを取得しようとする場合、バイトコード (ollydbg の 2 行目) を確認する必要があります。そこに定数が埋め込まれていることがわかり、命令の先頭からオフセットを取得する必要があります。

于 2013-06-04T13:28:28.620 に答える