相关集会:
$ > 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时,它不起作用。
我不想为每个功能测试这个,我缺少的基本想法是什么?
答案 0 :(得分:0)
$+18 > 890D 38E83B06 MOV DWORD PTR DS:[63BE838],ECX
指令MOV DWORD PTR DS:[63BE838],ECX
从起点开始+ 18h开始,但指令中硬编码的地址本身在2个字节后开始:
890D 38E83B06
反向字节顺序的 38E83B06
:063be838
。 Ollydbg为您提供了视觉上的好处。
当尝试在指令中获取常量的偏移量时,您必须查看字节码(ollydbg中的第二行)。你会发现你的常量嵌入在那里,必须从指令的开头取偏移。