防止来自Dll C ++的Dll注入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止来自Dll C ++的Dll注入相关的知识,希望对你有一定的参考价值。

我对C ++中的反dll注入有些怀疑。我有一个基于C ++的游戏,我有黑客注入DLL的问题。然后我需要阻止它。

我从那里找到通知钩子:

MSDN - Notification Hooks

但我不知道如何使用它。

有可能通知挂钩以防止dll注入?

怎么可能? (有更好的例子)。

可以从dll? (以更好的例子)。

感谢您阅读该帖子。

PS:对不起我的英语。

答案

算了,除非你做的很复杂,否则它不会起作用。通过复杂,我的意思是像Skype中使用的代码混淆,反调试技术。只要看看this talk

您可以花费大量时间来尝试防止DLL注入,最终有人会花费比您更少的时间并绕过您的保护。我认为时间会更好地投入到更安全和防篡改的架构中(即在服务器上计算分数等)。

这是一场你无法赢得的猫捉老鼠游戏。

另一答案

这个问题已经很久了,但我会以更好的形式简要回答一下,如果碰巧在经过适当的回应后偶然发现了它,那么这个问题就会发生。

您不能完全阻止在您自己的进程中注入代码,但您可以尝试在不截取其他进程的情况下执行一些技巧。不建议使用,因为您需要具有较低级别任务的经验和知识,尤其是为了使其正常工作而不是阻止您自己软件的功能,但是......

异步过程调用(APC)是Windows内核的一种实现。它主要用于代码注入到其他正在运行的进程中,Windows会自动使用它来处理各种事情,例如发送到特定进程的通知。当用户模式进程调用QueueUserApc(KERNEL32)时,将调用NtQueueApcThread(NTDLL)。 NtQueueApcThread(NTDLL)将执行一个系统调用,该调用将导致调用NtQueueApcThread(NTOSKRNL),NTOSKRNL不会将其导出 - 对于任何想知道的人来说,NTOSKRNL是Windows内核,系统调用只不过是来自用户的转换 - 模式到内核模式,因为Native API系统例程存在于内核模式内存中,NTAPL的NTDLL例程是系统调用存根,它直接控制到Windows内核。当调用NtQueueApcThread(NTOSKRNL)时,它将使用KeInitializeApc和KeInsertQueueApc(两者都碰巧由NTOSKNL导出)。当APC实际发布到目标进程时,KiUserApcDispatcher(NTDLL)将在进程内进行本地调用,除非以更广泛的方式执行APC以绕过此活动(99%的时间不会阻止它)。这意味着您有机会拦截此行为,并通过NTDLL导出的字节修补(也称为“内联挂钩”)KiUserApcDispatcher,在您自己的进程中使用一个本地挂钩阻止APC注入您自己的进程。您将面临的唯一问题是它没有文档,这不是微软正式支持的;您需要弄清楚参数的工作原理以及如何防止回调例程阻止为您自己的软件提供功能所需的正版请求。然而,这将包括防止内核模式APC注入,而不仅仅是用户模式攻击。

将代码注入流程有很多种方法,而APC就是其中之一。另一种常见方法是通过远程线程创建。当用户模式进程通过远程线程创建攻击另一个进程时,它通常会调用CreateRemoteThread(KERNEL32)。这将导致RtlCreateUserThread(NTDLL),RtlCreateUserThread将调用NtCreateThreadEx(NTDLL)。 NTDLL将执行系统调用,然后将在内核模式内存中调用NtCreateThreadEx(来自Windows内核的非导出例程)。最后,目标进程将在本地调用LdrInitializeThunk,并且还将在本地调用RtlUserThreadStart。这两个例程都由NTDLL导出。这与APC的情况相同......您可以在本地修补LdrInitializeThunk,但必须正确执行以防止您自己的软件中的正版功能。

这两种技术都不是全面的,没有“全面证明”的解决方案。有很多方法可以将代码注入到流程中,并且有非常复杂的方法可以绕过我自己的解决方案。反病毒软件一直在与反RCE /自我保护作斗争,只要我记得,反作弊系统。您还应该研究内核模式设备驱动程序开发,它将允许您注册可以帮助您的内核模式回调。

你应该研究的第一个回调是ObRegisterCallbacks。它允许您在从Windows内核调用NtOpenProcess时接收预操作回调通知。这意味着用户模式进程也会触发它,因为在NTDLL进行系统调用之后,NtOpenProcess最终会在内核模式中被调用。我不记得具体是否在NtOpenProcess存根本身中触发了回调API,或者它是否更深入到Ob *仅内核模式例程,但您可以使用WinDbg轻松检查远程内核调试,或者交互式反汇编程序(目标ntoskrnl.exe)并使用Microsoft提供的符号链接。 ObRegisterCallbacks支持进程和进程线程的句柄创建和复制通知,您可以删除不希望为请求的句柄允许的访问权限。

你应该调查的第二个回调是PsSetCreateThreadNotifyRoutineEx。此回调例程将允许您在系统上发生新线程时接收通知;您可以为自己的进程筛选出来,如果创建了一个流氓线程,则终止该线程。

你应该调查的第三个回调是PsSetLoadImageNotifyRoutineEx。每当新模块加载到进程中时,此回调将提供通知;再次,您可以筛选自己的过程。如果检测到流氓模块,则可以尝试让进程调用LdrUnloadDll(NTDLL)作为新加载映像的基址,但是模块的引用计数需要为0才能卸载。在这种情况下,您可以尝试“hacky”方法,如调用NtUnmapViewOfSection / NtFreeVirtualMemory。请记住,如果你弄乱了流氓加载的模块并且它设置了内存字节补丁以将执行流重定向到它自己的例程,除非你恢复它们,你的进程在被引用时会崩溃。

这些是一些想法,通常是通常使用的想法。内核模式回调在安全软件和反作弊软件中非常流行。至于线程创建,你会有兴趣尽可能地减少这个 - >如果你只是寻找流氓DLL加载,那么你将错过反射DLL加载。还要记住其他代码注入方法,如线程劫持,利用ROP链调用利用的共享窗口内存利用,磁盘上的DLL修补等。

以上是关于防止来自Dll C ++的Dll注入的主要内容,如果未能解决你的问题,请参考以下文章

使用 C 崩溃记事本进行 DLL 注入

如何防止 DLL 注入

使用来自 x64 注入器的 x86 dll 注入 x86 目标

C# Dll 注入器、VB.Net Dll 注入器

C Windows DLL注入记事本崩溃

C++ - CreateRemoteThread DLL 注入 [Windows 7]