2012-02-26 176 views
3

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

,我觉得在那里有通知挂钩:

MSDN - Notification Hooks

但是我没有知道如何使用它。

它可能通知挂钩,以防止DLL注入?

它有可能吗? (以及更好的例子)。

可以从dll? (例如更好)。

感谢您阅读该帖子。 PS:对不起,我的英文不好。

+0

[防止DLL注入Dll]可能的重复(http://stackoverflow.com/questions/9450113/prevent-dll-injection-from-dll) – 2012-02-26 03:51:03

+0

这些是由/ DELAYLOAD库生成的延迟加载通知。它们与注射无关。 – 2012-02-26 03:57:07

+1

请注意,DLLs可能需要加载到您的进程中的各种正当理由 - 从需要突然更改操作系统的语言,hotpatching(Windows更新)有时会这样做,当您的应用程序获得修补时,应用程序兼容性匀场例如,微软在Windows8上工作,或者当用户的防病毒软件想要进入你的流程环顾四周。防止所有这些操作可能会严重影响用户,他们可能不会为此感谢 - 特别是因为将DLL加载到进程中并不是破解它的唯一方法。 – SecurityMatt 2012-03-07 23:31:34

回答

5

忘记吧,除非你做了非常复杂的事情,它不会奏效。复杂的我的意思是像Skype中使用的代码混淆,反调试技术。请看this talk

您可能花费大量时间试图阻止DLL注入,最终有人会比您花费更少的时间并规避您的保护。我认为时间会更好地投资于更安全和防篡改的架构(即计算服务器上的分数等)。

这是一个猫捉老鼠的游戏,你不能赢。

+0

我使用虚幻引擎作为图形核心,他们触摸代码白色dll来设置非真实属性,例如墙壁透明度或字符纹理,然后像墙壁黑客或类似的东西,更多的使用它的黑客比自动瞄准从玛雅地图头。可以调试吗?顺便说一下,我想它更好地阻止任何试图访问该进程的API,而不是调试该部分,因为每次你都可以看到很多黑客。 – Marcos 2012-02-26 15:26:39

+0

那呢? [链接](http://www.codeproject.com/Articles/5178/DLL-Injection-and-function-interception-tutorial) – Marcos 2012-04-11 20:34:01

0

这个问题很古老,但我会简单回答一下,对于任何经过适当回应后偶然发现它偶然发现的人来说,它会以更好的形式回答它。

你不能完全防止你自己的进程中的代码注入,但你可以尝试做一些技巧,而不会拦截其他进程。不建议这样做,因为您需要具有较低级任务的经验和知识,特别是要使其正常工作并且不会阻止您自己的软件的功能,但是...

异步过程调用(APC)是一种实现来自Windows内核。它主要用于将代码注入到其他正在运行的进程中,Windows本身用于各种各样的事情,例如将通知发送到特定进程。当用户模式进程调用QueueUserApc(KERNEL32)时,将调用NtQueueApcThread(NTDLL)。 NtQueueApcThread(NTDLL)将执行一个系统调用,这将导致NtQueueApcThread(NTOSKRNL)被调用,NTOSKRNL不会导出这个调用 - 对于任何想知道的人来说,NTOSKRNL都是Windows内核,而系统调用只不过是从用户由于本地API系统例程存在于内核模式内存中,所以NTAPL的NTDLL例程是系统调用存根,它们直接控制Windows内核。当调用NtQueueApcThread(NTOSKRNL)时,它将使用KeInitializeApc和KeInsertQueueApc(两者确实是由NTOSKNL导出的)。当APC实际上发给所述目标过程,KiUserApcDispatcher(NTDLL)将被本地调用过程内,除非APC以更广泛的方式绕过此活性(它不会被阻止99%的时间)进行。这意味着你可以通过字节修补(也称为“内联钩子”)KiUserApcDispatcher来阻止这种行为,并通过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最终会以内核模式调用。如果回调API是在NtOpenProcess存根本身触发的,或者它更深入Ob *内核模式的例程,但您可以使用WinDbg进行远程内核调试或交互式反汇编程序(目标ntoskrnl.exe并使用Microsoft提供的符号链接)。 ObRegisterCallbacks支持处理创建&重复进程和进程的线程的通知,您可以剥夺您不希望被请求的句柄允许的访问权限。

你应该考虑的第二个回调将是PsSetCreateThreadNotifyRoutineEx。此回调例程将允许您在系统上创建新线程时收到通知;你可以为你自己的进程过滤掉它,如果创建了一个流氓线程,就终止线程。

第三回调你应该考虑将PsSetLoadImageNotifyRoutineEx。无论何时将新模块加载到进程中,此回调都会提供通知;再一次,你可以过滤你自己的过程。如果您检测到一个流氓模块,则可以尝试让您的进程调用LdrUnloadDll(NTDLL)以新加载的映像的基址为目标,但是该模块的引用计数需要为0才能被卸载。在这种情况下,您可以尝试使用“hacky”方法,如调用NtUnmapViewOfSection/NtFreeVirtualMemory。请记住,如果你搞砸了流氓加载模块,并且已经设置了内存字节补丁来将执行流程重定向到它自己的例程,除非你还原它们,否则当它们被引用时你的进程会崩溃。

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