1

我正在阅读 CodeProject 上的各种内容,发现这篇文章: http: //www.codeproject.com/Articles/29527/Reverse-Engineering-and-Function-Calling-by-Addres

所以我所做的是创建了一个注入器和一个 DLL,并获取了示例可执行文件。当您按 F11 时,它基本上会输出:http: //i.stack.imgur.com/YIygV.jpg

所以我遵循了整个教程,但问题是 DLL 中使用的地址总是在变化。这个要具体:

pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x004113C0);

在他的教程中,函数的地址是 0x004113C0。在我的情况下,它是另一回事,我拿走我拥有的那个并使用它。它工作得很好,但是当我关闭可执行文件并打开它时,它就不再工作了,而且 OllyDbg 显示该地址是一个全新的地址。

因此,我进行了一些研究,并开始使用 OllyDbg 添加断点。我发现地址总是:

main + 4C

我猜“main”是这些可执行文件的主要模块。如何始终找到该函数的地址?因为它一直在变化,我现在一无所知。在本文中,我读到它并没有说明重新打开可执行文件时会发生什么,我花了 5 个小时试图找到解决方案。

提前致谢!

编辑:

非常感谢大家。特别感谢mfc,我终于弄明白了!我最终做的是每当我点击 DLL_PROCESS_ATTACH 时,我将一个全局 HMODULE 设置为可执行文件的地址,如下所示:

HMODULE g_hExeModule;
g_hExeModule = GetModuleHandle(L"TutExample.exe");

经过几次测试后,函数地址似乎总是可执行文件的地址 + 0x11014,所以在调用中我只是这样做:

pFunctionAddress pMySecretFunction = (pFunctionAddress)((DWORD)g_hExeModule + 0x11014);
4

4 回答 4

1

所以如果我找到一种方法来获取“main”的地址,我可以添加一个 4C 偏移量,并且该功能将永远存在,我想

同样,函数确实有一个地址:

void *(funcPtr)() = (void (*)())((char *)&main +  0x4C);

// If you were right, and you also substituted the appropriate
// function signature above, then this should work:

funcPtr();
于 2013-01-10T23:48:40.950 回答
1

您尝试调用的函数位于 exe 文件中,因此引用偏移量应与加载 exe 的内存地址相关。目标函数的偏移量应该是一个常数,只有在每次编译源代码后才会改变。

要了解有关您的 exe 的更多信息,请将这两行添加到您的 exe 中:

printf(_T("Exe loaded at: %08X"), GetModuleHandle(_T("TutExample.exe")));
printf(_T("Target function at: %08X"), mySecretFunction);
于 2013-01-11T03:10:34.800 回答
0

我无法编辑我的帖子,也无法添加任何评论,所以我必须将其发布为新答案。

你的结果:

Exe loaded at: 00000000 (wrong, probably: 00BE0000 and offset is: 00001005)
Target function at: 00BE1005
Exe loaded at: 00000000 (wrong, probably: 01230000 and offset is: 00001005)
Target function at: 01231005
Exe loaded at: 00000000 (wrong, probably: 012A0000 and offset is: 00001005)
Target function at: 012A1005

请检查您编译的 exe 的名称,是“TutExample.exe”吗?如果不是,请将其更改为调用 GetModuleHandle 中的确切名称。

“00000000”的值表示GetModuleHandle 失败,因为在当前内存空间中找不到名称“TutExample.exe”。

目标函数的地址似乎没问题。只需将此地址减去加载的 exe 的地址,您将获得 exe 内存布局内的偏移量。

无论操作系统如何加载 exe,您都可以在注入的 dll 中执行相同的数学运算,以始终正确跟踪目标函数地址。

于 2013-01-11T10:57:40.857 回答
0

较新的操作系统具有称为 ASLR(地址空间布局随机化)的功能。犯罪分子使用您正在使用的一些技巧。因此,为了让坏人的生活更加艰难,每次运行程序时,EXE 和 DLL 都会被分配一个不同的地址。

如果您编译了 DLL,则可以选择为您的 DLL 禁用 ASLR。

于 2013-01-11T01:10:57.423 回答