Dll注射.使用参数执行CreateRemoteThread

clu*_*ter 2 c++ dll winapi code-injection createremotethread

我写了dll注入程序,工作得很好.它将dll加载到远程进程并调用一些函数.现在我想将参数传递给该函数.CreateRemoteThread有lpParameter,但如何在dll中传递该参数以在函数中使用它?

更新:dll入口点很常见:

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
Run Code Online (Sandbox Code Playgroud)

Dll只包含一个具有以下原型的函数:

void TestFunction(const char* ua);
Run Code Online (Sandbox Code Playgroud)

调用该函数的代码是:

CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)((void*)codecaveExecAddr), (LPVOID)argumentAddress, 0, NULL);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我尝试在TestFunction中传递"test"字符串.但后来我检查了TestFunction中的ua参数,它包含了一些垃圾.

以下是整个项目文件:
http://pastebin.com/gh4SnhmV
http://pastebin.com/Sq7hpSVx
http://pastebin.com/dvgXpUYz

更新2
TestFunction应该有一些特定的指标,或者我可以使用任何只要它只有一个LPVOID类型的参数?我糊涂了.谁能给我一个如何用一些参数调用注入的dll函数的例子?

Gri*_*rim 6

您需要在其他进程的内存中分配数据.为此,使用VirtualAllocEx函数,该函数将返回传递给CreateRemoteThread的其他进程内存中的地址.

CreateRemoteThread的工作方式与CreateThread完全相同,只是它在远程进程中创建线程.要记住的一件事是,当您在lpParameter中传递指向对象的指针时,在不同虚拟地址空间中运行的远程线程将尝试访问地址空间中的地址.

  • 不要忘记WriteProcessMemory字符串本身,因为这将传递给LoadLibrary (3认同)
  • Clumpter,您接收参数就像您在任何其他函数中接收参数一样。当操作系统调用您的线程例程时,它会转发您传递给 CreateRemoteThread 的参数。你会收到你通过的东西。如果参数是一个指针(哪些字符字符串),那么它比通常更复杂,因为单独的进程具有单独的地址空间,并且调用程序中的地址在远程进程中可能无效。在调用者中,您需要确保您传递的地址在远程线程中有效。VirtualAllocEx 和 WriteProcessMemory 就是这样做的。 (2认同)