【问题标题】:Figuring out an offset in assembly with OllyDBG使用 OllyDBG 计算装配中的偏移量
【发布时间】:2013-06-04 13:24:03
【问题描述】:

相关程序集:

$        > 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 时它就不起作用了。

我不想为每个函数都测试这个,我缺少的基本思想是什么?

【问题讨论】:

    标签: assembly ollydbg


    【解决方案1】:
    $+18     > 890D 38E83B06    MOV DWORD PTR DS:[63BE838],ECX
    

    指令MOV DWORD PTR DS:[63BE838],ECX 从您的起点开始 +18h,但指令中硬编码的地址本身在 2 个字节后开始:

    890D 38E83B06
    

    38E83B06 反向字节顺序:063be838。 Ollydbg 在视觉上对你来说很好。

    当试图获取指令中常量的偏移量时,您必须查看字节码(ollydbg 中的第二行)。你会发现你的常量嵌入在那里,并且必须从指令的开头获取偏移量。

    【讨论】:

    • 总是晚 2 个字节还是我怎么才能弄清楚?
    • 可以看指令字节码(第二行)。例如,在查看第二行(CALL)时,您会看到 E8 99C80500。那里的硬编码常数是 99C80500,由空格可视化。第三行(ADD):83C4 04 - 常数是 04 再次被空间可视化。
    • @rumblerumble 指令开始:0x18。指令中常量的偏移量:20x18 + 2 = 0x1a :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2021-07-30
    • 2013-08-24
    • 2018-03-31
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多