令人困惑的功能

时间:2010-06-29 09:01:13

标签: assembly reverse-engineering ida

因此,在使用IDA反汇编dll时,我遇到了这个类函数:

mov eax, [ecx+4]
mov eax, [eax]
retn

我知道ecx表示thiseax是返回值,但我无法理解它返回的内容。有什么帮助吗?

5 个答案:

答案 0 :(得分:3)

该函数从eax个点到偏移量4处加载一个指针(进入ecx)。然后它跟随指针将32位值加载到eax,从函数返回。

这就是所做的功能,但是如果没有更多的上下文,就不可能说意味着什么

答案 1 :(得分:1)

class C
{
    int a;
    int *b; // ecx+4

    int get_b()
    {
        return *b;
    }
}

当然,a*b的实际类型未知,但它们都是32位类型。如果类具有任何虚拟方法或析构函数,a也可以是指向VMT的指针。

答案 2 :(得分:0)

我的程序集有点生疏,但是第一条指令将某些内容加载到EAX中...... ECX寄存器的内容指向了某些内容......但这是一个偏移的字(4个字节)。接下来的指令是用EAX指向的EAX加载(覆盖)EAX。

这种表示法(围绕这些MOV(加载)指令的第二个或“源”操作的方括号表示正在使用间接寻址模式。

我猜这只是一种实现双重间接的方法。寄存器ECX中的地址可能指向堆栈帧,或者可能指向您所引用的C ++“this”的某个属性指针。反过来,该地址保存返回值的地址。因此,此代码将地址拉入寄存器,然后使用寄存器中的该地址来提取值(同时偶然地进入同一寄存器)。这种方法很好,因为它保留了所有其他寄存器。

(顺便提一下,大多数x86函数调用范例---系统调用,DOS函数调用等都会在stdlib C库中,在EAX寄存器中留下函数返回码或系统错误...... errno。)

答案 3 :(得分:0)

真是个问题。如果ecx持有指向“this”结构的指针,你必须知道它是如何完成的。第一个instr,获得第二个dword,另一个指针;可能是什么?我们无法知道。此指针现在保存在eax中,可能指向另一个结构或其他任何结构。第一个指向的值放在eax中,这就是func返回的内容。

ecx    ------->    dword dataA   offset 0
                   dword dataB   offset 4

  mov eax, [ecx + 4]

eax = dataB ---->  dword dataC   offset 0

  mov eax, [eax]

eax = dataC

究竟什么是dataC,取决于我们无法知道的很多事情。

答案 4 :(得分:0)

这在很大程度上取决于原始编译器使用的调用约定。例如,一个相当正常的设置MSVC将在eax寄存器中返回32位值。 @Gregs回答说它做了什么,但正如他所说,其意义取决于了解实现语言和编译器的更多细节。

如果您想了解反汇编,请尝试在您自己的(C / C ++)代码上查看结果。这真的是了解别人DLL中发生的事情的唯一方法。