繁体   English   中英

C++ / WinAPI:如何从注入的 x64 DLL 中的函数中获取值?

[英]C++ / WinAPI: How do I get a value from a function in the injected x64 DLL?

x86 执行此操作的方式简单直接 - 通过 GetExitCodeThread。 不幸的是,它仅限于返回 32 位值。 据我了解,WinAPI 不提供 64 位替代方案。

所以问题是 - 我通过 CreateToolhelp32Snapshot 模块循环找到它的基地址然后使用它运行 CreateRemoteThread 来调用注入函数没有问题,它执行我在其中写的任何内容但是我如何在没有 GetExitCodeThread 的情况下检索它的返回值? 作为一个例子,我想检索一个 64 位指针,甚至是一个结构(或一个 64 位指针)作为这个函数的结果。 什么是正确的做法? 如果它是 ReadProcessMemory - 那么我应该读取哪个内存地址/偏移量以获得返回值?

编辑:附加信息:我在注入的 DLL 中调用一个函数。 该函数执行一些东西(例如,从它注入的进程中收集数据,这是成功的) - 问题是我想将这些变量之一检索回调用进程(调用 CreateRemoteThread 的那个)。 GetExitCodeThread 是不行的,因为变量是 64 位的。

供参考的代码片段(hExportThread 函数在 DLL 中返回 uint64_t):

// LLAddr = LoadLibraryA address, lpBaseAddr = dll path related argument
HANDLE hInjectionThread = CreateRemoteThread(hProc, NULL, NULL, LLAddr, lpBaseAddr, NULL, &idThread);
WaitForSingleObject(hInjectionThread, INFINITE);

dllBaseAddr = getDLLBaseAddr();  // gets base address of the injected DLL
dllExportOffset = getDLLExportOffset(dllExportName.c_str());   // opens the DLL in the local buffer and gets the correct offset
LPTHREAD_START_ROUTINE lpNewThread = LPTHREAD_START_ROUTINE(dllBaseAddr + dllExportOffset);  // gets the correct address of the function in the injected dll

HANDLE hExportThread = CreateRemoteThread(hProc, NULL, NULL, lpNewThread, NULL, NULL, 0);  // executes injected function
WaitForSingleObject(hExportThread, INFINITE);

我建议你使用一个共享内存区域,让它在注入进程和注入的 DLL 中都打开。 当注入的库完成时,您知道内存应该准备好了。

这样做,您不限于 4 或 8 个字节,您可以制作任何大小的区域来返回收集的数据。

一种选择是,与其要求远程线程直接执行目标 DLL 函数,不如让注入器使用VirtualAllocEx()在远程进程中分配一小块可执行内存,然后使用WriteProcessMemory()来填充它具有调用目标 DLL 函数并将其结果保存到注入器可以从中访问数据的内存位置所需的最少汇编指令集的块。 这可能是一块共享内存,或者是您使用ReadProcessMemory()读取的一块VirtualAllocEx型内存。

或者,如果您被允许更改目标 DLL 函数的签名,则让它获取一个指向本地内存地址的指针,它可以将其输出写入该地址,然后注入器可以VirtualAllocEx()读取/写入内存块并在 CreateRemoteThread() 的lpParameter参数中传递其地址, and then在线程退出后从该地址传递 ReadProcessMemory()`。

否则,与其在启动远程线程的调用站点手动设置所有这些,不如将目标 DLL 函数包装在另一个 DLL 函数中,该函数在普通 C++ 中而不是在汇编中完成这项工作。 然后你可以让远程线程调用该包装函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM