在装配中定位变量位置

时间:2012-06-22 11:37:21

标签: winapi assembly reverse-engineering

从下面的反汇编代码可以假设位置43E010是保存字符串的变量的位置(如汇编代码中的注释):

拆卸:

...
push    offset loc_43E010
...
push    offset aAllYourBaseAre ; "all your base are belong to us"
...
.rdata:00446074 aAllYourBaseAre db 'all your base are belong to us',0

这是来自Win32应用程序的反汇编代码,如下所示:

class Foo {
public: 
    string mystring;    
    __declspec(dllexport) void foo();
};

void Foo::foo(){

    printf("foo called");

}

int _tmain(int argc, _TCHAR* argv[])
{
    Foo foo;
    foo.mystring =  "all your base are belong to us";

    return 0;
}

这条指令:push offset loc_43E010是否显示地址43E010是与win32可执行文件的基本映像的偏移量,并且它是一个可变位置?

1 个答案:

答案 0 :(得分:2)

我会调用我的精神力量(嗨雷蒙德!)并且会猜测你看到的是这样的事情:

push    ebp
mov     ebp, esp
push    0FFFFFFFFh
push    offset loc_43E010
mov     eax, large fs:0
push    eax
...
mov     large fs:0, eax

这是使用异常处理的函数的典型序言。在您的情况下,即使没有try / catch语句,也有一个带有非平凡析构函数的局部变量,需要在传播异常时调用它。 loc_43E010是函数的异常处理程序的标签。

所以答案是:不,它是一个“可变位置”。

要了解有关Win32(SEH和C ++)中的异常的更多信息,请查看my OpenRCE article