我刚刚开始使用逆向工程。
我创建了一个小型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的地址......
不应该至少偏移量相同吗? 我错过了一些关键的东西吗?
答案 0 :(得分:4)
Visual Studio中Debug构建的默认设置包括启用incremental linking。这样做的结果是,在编译的二进制文件中,每个函数调用都通过跳转存根进行(这使得链接器更容易使用新代码更新二进制文件,而无需重做完整的链接步骤)。
&NewFunction
返回该存根的地址,而不是实际函数的实现。