我有一个 DLL,我将其注入(inject)到另一个进程中,但我希望能够从我的应用程序调用该 DLL 上的导出。我在别处读到您必须使用 SendMessage API,但我不知道该怎么做。是否有关于如何完成此操作的示例代码?
最佳答案
虽然无法直接调用另一个进程中的函数,但您可以通过几个步骤和 Windows API 非常轻松地间接调用。
- 获取
LoadLibrary
的地址和GetProcAddress
从你自己的过程。kernel32.dll
应该在每个进程中加载到相同的地址,因此您可以依赖它们存在于您正在注入(inject)的进程中 - 创建
struct
它将保存所有你想传递给你的函数的参数,你的函数将调用另一个进程中的函数(因为CreateRemoteThread
只能将一个参数传递给一个函数,所以我们将用它来传递一个指向结构的指针)它至少包含成员函数指针来保存LoadLibrary
的地址和GetProcAddress
- 通过
VirtualAllocEx
为远程进程中的结构分配足够的内存, 然后用WriteProcessMemory
填写正确的信息 - 写一个函数,取一个指向
struct
的指针你写的,使用LoadLibrary
/GetProcAddress
调用你想要的功能。请记住使用指针指向您传递函数的结构中的那些函数,而不是名称。 - 在远程进程中分配足够的内存来保存
VirtualAllocEx
的函数, 确保通过VAX
PAGE_EXECUTE_READWRITE
标记以便它可以保存可执行代码 - 通过
Read/WriteProcessMemory
将函数的代码从您的进程读写到其他进程 - 使用
VirtualAllocEx
调用远程进程中的函数(位于CreateRemoteThread
返回的地址) .
确保您传递给函数的所有数据都存储在结构中和/或驻留在远程进程的地址空间中(通过 VirtualAllocEx
/WriteProcessMemory
获取它。
它可能看起来有点复杂,但实际上并没有那么复杂。如果您需要一些帮助,请随时在评论中提问。
关于c++ - 在另一个进程加载的 DLL 中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631357/