0

从下面的反汇编代码中,我可以假设该位置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 可执行文件的基本映像的偏移量,并且它是一个变量位置?

4

1 回答 1

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++)中异常的更多信息,请查看我的 OpenRCE 文章

于 2012-06-25T18:45:51.957 回答