所以我只是读了一点关于如何将 dll 注入维基百科上正在运行的程序(这个CreateRemoteThread
想法)。我按照所描述的步骤进行操作,并最终使其正常工作。我发现有趣但花了一些时间才弄清楚的事情如下:当创建我的远程线程并发送函数时,我想作为第一个/开始的线程运行我遇到了一个障碍,当它运行时它失败了为了调用正确的函数,当我在 OllyDBG 中查看它们时,它们似乎变成了垃圾,这反过来导致程序在我身上崩溃。我当时使用的代码是这样的:
static DWORD __stdcall inject(LPVOID threadParam)
{
MessageBoxA(NULL, "test", "test", NULL);
LoadLibrary("my.dll");
return 0;
}
还有其他地方:
CreateRemoteThreadEx(hProcess, NULL, 0, LPTHREAD_START_ROUTINE(fnPageBase), dbPageBase, 0, NULL, &threadId);
fnPageBase
我在要注入的过程中为我的函数分配的内存在哪里,而 dbPageBase 是我为作为LPVOID threadParam
.
类似的东西,问题是这两个MessageBoxA
和LoadLibrary
没有得到它似乎是,当我在OllyDbg中检查了他们,他们总是指着一些不存在的正确的地址。我在谷歌上搜索了一下,发现我应该使用它GetProcAddr
来获取 ie: 的地址:LoadLibrary
我以后可以通过LPVOID threadParam
在我的inject()
通话中发送一些数据来使用它。所以我的问题是:为什么当我使用它GetProcAddr
而不是当我只是尝试“正常”使用它时它会起作用?使用它时,我是否会得到一些特定地址,这些地址总是映射到内存中同一区域的每个人?
另外,inject()
函数中的字符串会发生什么变化?它们是否在编译期间移动到其他地方,这使得它们对我正在注入的程序不可用,因为它位于内存的完全不同的位置(即,它没有映射到那里?)?我通过将它与结构一起发送到一个结构中来解决这个问题LPVOID threadParam
,我已经复制到.exe
我正在注入的内存中。
如果您需要有关我如何完成其他部分的更多信息,请告诉我,我会更新。