【发布时间】:2015-11-04 04:30:02
【问题描述】:
我正在研究 dll 注入,到目前为止,我设法在导致消息框出现的进程中注入了一个 dll。
即使经过大量阅读和研究,我也不太明白的部分是我如何将参数传递给 dll,或在其中调用特定函数。
dll:
extern "C" __declspec(dllexport) bool WINAPI
DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
MessageBoxA(NULL, "Hello World!", "Dll says:", MB_OK);
break;
}
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return true;
}
注射:
char dllPath[] = "sampleDll.dll";
// For dll path injection.
int memAmountToAllocate = strlen(dllPath);
LPVOID dllPathAddress = VirtualAllocEx(procHandle, 0, memAmountToAllocated, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
FARPROC loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
WriteProcessMemory(procHandle, dllPathAddress, dllPath, memAmountToAllocated, 0);
// creating a thread that will call LoadLibraryA with allocMemAddress as argument
CreateRemoteThread(procHandle, 0, 0, loadLibraryAddr, dllPathAddress, 0, 0);
正如我所说,注入工作正常,即出现消息框。
但是假设我在 dll foo(LPVOID ptrToData) 中有一个方法。如何调用foo 函数?
我有我要在目标进程上执行的函数的地址,它是一个加法函数,所以我需要传递x和y。
我可以这样调用函数
_asm
{
push 0;
push 0x7;
mov ecx, esi;
mov eax, 0x41367C;
call eax;
}
但是push 的值必须来自注入过程。
我该怎么做?
【问题讨论】:
-
为什么不能正常调用该函数,因为它是同一个 DLL 代码的一部分(除非我误解了)?如果它不是 DLL 代码的一部分,那么您就不能像注入一样,即让您的 DLL 获取函数地址然后调用它吗?
-
该函数将在我的 dll 中,是的,但我想通过参数以编程方式调用它。
-
从哪里调用它,你的 DLL 还是创建远程线程的进程?
-
我的程序正在运行,我们称之为进程 A。进程 A 将 dll 注入另一个进程,进程 B。现在我的 dll 已注入,我需要调用其中的方法 Add()从进程 A 注入的 dll。
-
嗯。我已经这样做了,但是以一种相当笨拙的方式。基本上我在进程 A 中创建了一个管道,并且注入的 DLL 连接到该管道。这使我可以通过管道与 DLL 进行通信并告诉它要做什么。不过可能有更好的方法...
标签: c++ c dll dll-injection