RE - IDA查找函数偏移量

时间:2014-01-31 11:25:49

标签: c++ reverse-engineering memory-address ida dll-injection

我刚刚开始使用逆向工程。

我创建了一个小型C ++ ConsoleApplication,我试图通过注入的DLL调用NewFunction。

void NewFunction()
{
    DWORD dwImageBase = (DWORD)GetModuleHandle(NULL);

    std::cout << "ImageBase: " << ToHex(dwImageBase) << std::endl;
    std::cout << "NewFunction: " << ToHex((DWORD)&NewFunction) << std::endl;
    std::cout << "Offset: " << ToHex((DWORD)&NewFunction - dwImageBase) << std::endl;
}

示例输出:

ImageBase: F90000
NewFunction: FA111D
Offset: 1111D

现在,当我用注入的DLL调用0xFA111D时,它按预期工作并再次打印它。 (DLL调用ImageBase + Offset)

我无法弄清楚的是如何使用IDA Pro获取NewFunction的地址......

在IDA中:

  • 该函数位于:0x4133F0
  • Imagebase为:0x400000
  • 计算的偏移量为:0x133F0

不应该至少偏移量相同吗? 我错过了一些关键的东西吗?

1 个答案:

答案 0 :(得分:4)

Visual Studio中Debug构建的默认设置包括启用incremental linking。这样做的结果是,在编译的二进制文件中,每个函数调用都通过跳转存根进行(这使得链接器更容易使用新代码更新二进制文件,而无需重做完整的链接步骤)。

&NewFunction返回该存根的地址,而不是实际函数的实现。