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