【问题标题】:Locating variable location in assembly在装配体中定位变量位置
【发布时间】:2012-06-24 16:59:48
【问题描述】:

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

【问题讨论】:

  • 这条指令:“push offset loc_43E010”是否表示43E010是一个可变偏移量?
  • something的偏移量。没有足够的信息来确切地知道它的偏移量。

标签: winapi assembly reverse-engineering


【解决方案1】:

我会调用我的精神力量(嗨,雷蒙德!),然后我会疯狂地猜测你看到的是这样的东西:

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

【讨论】:

  • 我明白了,如果是这种情况,变量赋值的模式是什么,比如 DWORD 或 std::string 变量?顺便说一句,由于我认为您是此类主题的专家,您可能还想帮助我:stackoverflow.com/questions/11194837/function-address Cheers。
  • 简而言之,整数赋值将是mov,而std::string 赋值将是对std::strings::operator=() 的调用。我建议你阅读this book,它有一个很长的关于恢复编译代码的附录。
猜你喜欢
  • 2011-12-11
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多