Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在DLL中控制代码的可能方法_C++_C_Dll_Argument Passing_Dll Injection - Fatal编程技术网

C++ 在DLL中控制代码的可能方法

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

我正在做我的大学项目,遇到了一个问题。 我的任务是编写一个程序和.dll来拦截来自WinAPI的调用。 例如,我启动我的程序,它应该通过PID使用
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;
}