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++ 代码中,我首先获取第一行的 push 函数的地址,然后添加一个偏移量。通过添加偏移量 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 中的第二行)。你会发现你的常量嵌入在那里,并且必须从指令的开头获取偏移量。

于 2013-06-04T13:28:28.620 回答