【发布时间】:2022-01-11 14:49:20
【问题描述】:
我想将我的简单 dll 注入第三方应用程序。 之后我想从我自己的进程调用dll中的一个函数,而不是第三方应用程序中的进程。
下面的第一部分显示了我测试的整个dll:
// dllmain.cpp
#include "pch.h"
extern "C" __declspec(dllexport) int add(int a, int b)
{
return a + b;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
第二部分显示了我的进程中的调用者函数:
// hProcess is the process in the third-party application
// Call our exported function
lpReturn = NULL;
***// I don't know how to pass parameter a and b into the exported function add in my simple dll***
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpFunctionAddress, lpRemoteParams, NULL, NULL);
DWORD dwOut = 0;
while (GetExitCodeThread(hThread, &dwOut)) {
if (dwOut != STILL_ACTIVE) {
*ppReturn = (PVOID)dwOut;
break;
}
}
我不知道如何将参数a和b传递到导出的函数中添加到我的简单dll中(请参考上面的第二部分)
任何人都可以给我一个提示,或者一个完整的例子说明如何在windows的注入dll中调用带有参数的函数?谢谢:-)
【问题讨论】:
-
您的注入进程不能直接调用它已注入另一个进程的 DLL 上的函数。它必须注入更多代码才能在其他进程的上下文中进行这些函数调用。否则,DLL 应该设置某种 IPC 服务器,注入器可以根据需要向其发送命令。另外,不能使用
CreateRemoteThread()调用签名与ThreadProc不兼容的函数。 -
@RemyLebeau 注入更多代码是什么意思?有简单的例子吗? :-) 而且我更害怕使用 IPC 来做这件事,我认为这对我来说可能很困难。
-
这看起来与您尝试做的类似:resources.infosecinstitute.com/…
-
@JeunePrimeOrigines 那篇文章只解释了如何加载 DLL,OP 已经在做。它没有介绍如何在加载该 DLL 后对其进行额外调用。
-
@JYP2011 - 因此,如果您能够按照我之前评论的链接中所述使用 CreateRemoteThread() 成功加载 DLL,也许一种简单的方法是尝试重写您的 add() 函数所以它将使用一个结构接受单个参数。 (例如 struct { int a; int b; };)。本质上是为了使其与 RemyLebeau 所指出的 ThreadProc 签名兼容。附加参考:stackoverflow.com/questions/575695/…
标签: c++ windows dll dllexport dll-injection