【问题标题】:Differences in OllyDbg and IDA PRO for MOVSX EDX, BYTE PTR [ESP+ECX+8] commandMOVSX EDX、BYTE PTR [ESP+ECX+8] 命令的 OllyDbg 和 IDA PRO 的差异
【发布时间】:2014-06-05 15:16:03
【问题描述】:

在使用 OllyDbg 和 IDA PRO 反汇编同一个程序时,我有一行代码以不同的方式反汇编。

OllyDBG:

    MOVSX EDX,BYTE PTR [ESP+ECX+8]

国际开发协会:

    MOVSX EDX, [ESP+ECX+68h+String]

谁能解释一下这里的 IDA PRO 是什么意思?我对这里的 68h+String 部分感到沮丧。我可以假设 68h+String 总是意味着 BYTE PTR 吗?

【问题讨论】:

  • 我不这么认为。根据 IDA 专业人士的说法,原始字节是什么样的?String 是什么?
  • @sircodesalot 这是一个movsx 所以是的,它可以是一个byte ptr
  • 算法是: 先决条件:有文本字符串。第 1 步:将字符串的第一个字符移动到 EDX 第 2 步:对其进行处理 第 3 步:移动到下一个字符。

标签: assembly reverse-engineering ida ollydbg


【解决方案1】:

ida 应该声明 STRING to be a LOCAL variable 的值为 -60h 看看 函数/过程的开始

( 68 + 字符串 ) == ( 68 + (- 60 ) ) == (68-60) == 8 它与 ollydbg 显示的相同。

IDA 的反汇编语法容易混淆

作为示例 ollydbg 将显示

00405712     8B4424 30       MOV     EAX, DWORD PTR SS:[ESP+30]

虽然 ida 会显示

text:00405712                 mov     eax, [esp+1Ch+arg_4]

因为在函数的开头 ida 已经将 arg_4 定义为

.text:004056E0 arg_4           = dword ptr  14h

那是

14h + 1ch == 30h

如果你不喜欢 ida 语法但希望看到直接的 [esp+30]

你可以运行这个脚本

shift +f2 paste and press ok 

注意所有 ida idc 功能对于任何大规模操作来说都太慢了 而不是 MaxEA() 将其缩减为一些较小的块,以便在下面的 sn-p 中获得更快的结果

auto i;

for (  i = MinEA() ; i < MaxEA() ; i = NextHead(i, MaxEA()) )
{
    OpHex(i,-1);
}

【讨论】:

    【解决方案2】:

    IDA 尝试设置与局部变量相关的命令。 [ESP+ECX+8] 指向与[ESP+ECX+68h+String] 相同的地址。您可以将 IDA 的输出读取为[ESP+ECX+8+String+60h]。我也很困惑,IDA 在BYTE PTRWORD PTR 之间没有区别,两者都会导致不同的命令。

    【讨论】:

      【解决方案3】:

      寻找类似的 IDA 问题。 IDA 将这条指令正确地列出为:

      inc byte ptr ds:900h

      但是当你在偏移量上贴上标签时,它确实

      inc ds:byte_900

      通过命名偏移量来有效地消除 ptr 和字节引用.. :shrug:

      【讨论】:

        猜你喜欢
        • 2014-04-26
        • 2018-10-06
        • 1970-01-01
        • 2016-08-08
        • 2011-09-13
        • 2017-03-29
        • 2014-07-09
        • 2020-10-11
        • 2013-07-23
        相关资源
        最近更新 更多