大家好!
经过几个小时的穿透谷歌,我最终到了这里。我将直言不讳:我即将“刷新”我的C / C ++技能,并再次获得未管理世界的经验。作为一个“基本”任务,我开发了一个小键盘记录器(它只是Windows API的几行),但现在我想用“隐形”功能扩展它。因此,我将代码放入Win32 DLL it's content you find here。正如您将注意到的,其中有一个非常棘手的部分:
MSG msg;
BOOL bRet;
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
return FALSE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
是的,这是一个普通的消息循环 - 这会导致我的问题。我将这个DLL注入“受害者”可执行文件(例如VLC媒体播放器)以欺骗AV /应用程序防火墙,它到目前为止工作,注入本身完美无缺。现在来了一个大的但是:当然无休止的while循环现在冻结了整个目标应用程序(没有它,我的钩子回调永远不会被执行),这是没有真正计划的......在潜入了一半的MSDN库并尝试了Google给了我很多“解决方案”;我放弃了。
甚至可以评估“受害者”进程的消息循环而不阻止它自己的业务,但是提供我的键盘钩子回调才能工作?
真诚的,你的, Nefarius
答案 0 :(得分:4)
好的,首先,你在dll入口点函数中做得太多了。一方面 - 这是直接来自MSDN - “在DLL入口点你可以做的事情有严重的限制”。此外,在dll入口点中,加载器锁被保持,因此不能加载/卸载其他库。因此,当你在DLL入口点运行你的消息循环(通过调用 InstallHook())时,你真的在自行车辐条上扔了一根棍子,所以说话。
现在开始使用它非常简单。加载DLL时,在 InstallHook 创建一个新线程,你应该好好去。现在你的消息循环将在它自己的线程中,它有自己的消息队列(或者至少它应该,Windows消息仍然有点让我困惑)。
case DLL_PROCESS_ATTACH:
CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InstallHook, (void*)NULL, 0, NULL );
答案 1 :(得分:0)
你不应该有消息循环。您注入的应用程序已经有一个消息循环(除非它是一个控制台应用程序,无论如何都不处理消息)。当主机的消息循环正常处理其消息时,让你的钩子做它的事情。