在另一个进程加载的DLL中调用函数

123*_*123 4 c++ dll hook

我有一个DLL注入到另一个进程,但我希望能够从我的应用程序调用该DLL上的导出.我在其他地方读到你需要SendMessage API,但我不知道该怎么做.有没有关于如何做到这一点的示例代码?

Set*_*gie 10

虽然不可能在另一个进程中直接调用函数,但只需几步和Windows API就可以间接地间接调用它.

  1. 获取的地址LoadLibrary,并GetProcAddress从自己的过程.kernel32.dll应该在每个进程中的相同地址加载,因此您可以依赖它们存在于您注入的进程中
  2. 创建一个struct将保存您要传递给函数的所有参数,这些参数将在另一个进程中调用函数(因为CreateRemoteThread只能将一个参数传递给函数,因此我们将使用它来传递指向结构的指针)至少包含成员函数指针持有的地址LoadLibraryGetProcAddress
  3. 为远程进程中的结构分配足够的内存VirtualAllocEx,然后使用正确的信息填充它WriteProcessMemory
  4. 编写一个函数,使用指向struct您编写的指针,使用LoadLibrary/ GetProcAddress调用所需的函数.请记住在传递函数的结构中使用指向这些函数的指针,而不是名称.
  5. 在远程进程分配足够的内存来保存与功能VirtualAllocEx,确保传递VAXPAGE_EXECUTE_READWRITE标志,以便它可以容纳可执行代码
  6. 通过以下方式读取和处理从您的流程到其他流程的函数代码 Read/WriteProcessMemory
  7. 使用来调用远程进程中的函数(位于其返回的地址VirtualAllocEx)CreateRemoteThread.

确保传递给函数的所有数据都存储在结构中和/或驻留在远程进程的地址空间中(使用VirtualAllocEx/来获取它)WriteProcessMemory.

它可能看起来有点牵扯,但它并不是那么复杂.如果您需要一些帮助,请随时在评论中提问.


bdo*_*lan 1

一般来说,您不能直接调用另一个进程中的函数。但是,您可以使用一些解决方法。

首先,如果您知道导出的地址(很多时候情况并非如此),并且您调用的函数使用调用约定__stdcall,采用指针大小的整数作为参数,并返回 DWORD,那么您可以可以用来CreateRemoteThread在远程进程的线程中执行它。这通常用于运行LoadLibrary将 DLL 注入到目标进程中,因为LoadLibrary它会加载到给定计算机上所有进程的相同地址中。

否则,您注入的 DLL 将需要与调用它的进程执行某种 RPC。例如,您可以让注入的 DLL 在其 DLL_PROCESS_ATTACH 处理程序中生成一个线程,该线程又连接到命名管道,或者通过 COM 或其他方式连接到主进程。