用 IDA PRO 找不到函数的基地址(用 vs2015 编译)

逆向工程 艾达 C++
2021-07-09 08:05:13

嗨,所以我只是想学习逆向工程,当我在 IDA pro 中打开我的程序时,我找到了这个地址sub_11330(重新设置为 0)https://gyazo.com/1c34d2c31f29583f05d0dd4d956d6f74但是当我尝试挂钩此功能时,地址GetModuleHandle(NULL) + 0x11330没有' t 工作,所以我只是尝试打印函数的基地址,std::cout << (DWORD)callme - (DWORD)GetModuleHandle(NULL)当我尝试使用此地址时,它可以工作(0x1128a),为什么我无法使用 IDA 找到它?对不起,如果我不清楚,如果你不能理解我想解释的内容,我会重新写我的帖子。

这就是我上钩的方式

int WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        std::cout << "injected" << std::endl;
        Detour((PBYTE)GetModuleHandle(NULL) + 0x1128a, (PBYTE)&func);
    }
    return true;
}

我的函数 detours 只是更改了函数的前 5 个字节,这个可以工作我正在调试模式下使用 vs2015 编译我的程序是一个用 C++ 编写的控制台应用程序

3个回答

默认情况下,调试版本启用了增量链接,它为所有调用添加了增量链接 thunk。当您在程序中获取函数的地址时,您实际上是在获取 thunk 的地址,这就是地址不同的原因。

恐怕我还不能发表评论,所以我会发表我的想法作为答案。我还发现自己与 Visual Studio(2010,2013,2015)一起工作,并试图对我制作的东西进行逆向工程。Visual Studio 启用了一个选项,该选项在编译后更改程序的原始入口点。这就是为什么您从 IDA 和 cout 函数获得不同地址的原因。

忘掉弯路,你学不到任何东西,它限制了你真正的逆转能力

你不需要调用 GetModuleInformation 但我还是这样做了

MODULEINFO modInfo = {0};
HMODULE hMod = GetModuleHandle("NameOfExe.exe");
if(!hMod)
{
    MessageBox(NULL, "Error", "Error", NULL);
}
GetModuleInformation(GetCurrentProcess(),
    hModule, &modInfo, sizeof(MODULEINFO));


DWORD addr = (DWORD)modInfo.lpBaseOfDll
    + 0x11330;

// change this to function pointer in your code
DWORD jumpAddr = 0xFFFFFF;

// subtract 5 because the jmp opcode is E9 followed by 4 more
// opcodes for the distance of the jump, total of 5 bytes
DWORD jumpDistance = jumpAddr - addr - 0x5; 

DWORD oldPermission = NULL;
DWORD newPermission = PAGE_EXECUTE_READWRITE;

if (!VirtualProtect((BYTE*)addr, 0x5,
    newPermission, &oldPermission))
{
    MessageBox(NULL, "Error", "Error", NULL);
}

*(BYTE*)(addr) = 0xE9;
*(DWORD*)(addr+1) = jumpDistance;

if (!VirtualProtect((BYTE*)addr, 0x5,
    newPermission, &oldPermission))
{
    MessageBox(NULL, "Error", "Error", NULL);
}