C++ 在DLL中控制代码的可能方法
我正在做我的大学项目,遇到了一个问题。 我的任务是编写一个程序和.dll来拦截来自WinAPI的调用。 例如,我启动我的程序,它应该通过PID使用C++ 在DLL中控制代码的可能方法,c++,c,dll,argument-passing,dll-injection,C++,C,Dll,Argument Passing,Dll Injection,我正在做我的大学项目,遇到了一个问题。 我的任务是编写一个程序和.dll来拦截来自WinAPI的调用。 例如,我启动我的程序,它应该通过PID使用SetWindowsHookEx将.dll注入任何进程。我成功地为函数CreateFile完成了此任务,但我需要为多个函数实现此任务,并允许用户通过命令行参数选择要截取的函数 在我的代码中,安装钩子时,我定义了回调函数: HINSTANCE hinst = LoadLibrary(L"ConsoleApplication1.dll"); HOOKPRO
SetWindowsHookEx
将.dll注入任何进程。我成功地为函数CreateFile
完成了此任务,但我需要为多个函数实现此任务,并允许用户通过命令行参数选择要截取的函数
在我的代码中,安装钩子时,我定义了回调函数:
HINSTANCE hinst = LoadLibrary(L"ConsoleApplication1.dll");
HOOKPROC addr = (HOOKPROC)GetProcAddress(hinst, "meconnect");
HHOOK handle = SetWindowsHookEx(WH_KEYBOARD, addr, hinst, threadID);
但是这个回调函数中只有三个参数用于启动CallNextHookEx(NULL,code,wParam,lParam)
,我们似乎无法更改它们
另一个问题是,当我们将.dll注入另一个进程时,我们只能从dll\u process\u ATTACH
部分运行任务,因此它与我们的程序没有链接,因此我们无法传递参数
也许解决方案是创建一个临时文件并向其写入参数,然后从.dll读取它,但我希望您能帮助我找到更优雅的解决方案。我将非常感谢您的帮助。例如,您可以为每个钩子使用单独的函数
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
SetWindowsHookEx(WH_CBT, CBTProc, (HINSTANCE) NULL, GetCurrentThreadId());
SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, (HINSTANCE) NULL, GetCurrentThreadId());
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(___cbt_message_hookptr, nCode, wParam, lParam);
// your code here
return CallNextHookEx(___cbt_message_hookptr, nCode, wParam, lParam);
}
LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(___callwndprocret_message_hookptr, nCode, wParam, lParam);
// your code here
return CallNextHookEx(___callwndprocret_message_hookptr, nCode, wParam, lParam);
}
有关命名管道的更多信息,请参见相关文档页面 您可以使用
lParam
指向包含更多参数的struct
。这是典型的用法。多挂钩的好主意。(非常感谢)
LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\payload_datapipe");
CHAR chReadBuf[1024];
DWORD cbRead = 0;
BOOL fResult;
fResult = CallNamedPipe(
lpszPipename, // pipe name
_Message, // message to server
strlen(_Message), // message length
chReadBuf, // buffer to receive reply
sizeof(chReadBuf), // size of read buffer
&cbRead, // number of bytes read
NMPWAIT_NOWAIT);//NMPWAIT_WAIT_FOREVER); // wait;-)
if (!fResult)
{
return;
}