移除NtDll的hook

简介

许多杀毒软件使用钩子(hook)技术来监视系统的API函数调用,并检测潜在的恶意代码行为。Ntdll.dll是Windows操作系统的一个核心动态链接库,其中包含许多系统级API函数。通过在Ntdll上设置钩子,杀毒软件可以拦截这些API函数的调用,并检查它们的参数和返回值,以便发现可能的恶意行为

下图是没有被杀软挂钩子的NtCreateThread函数

image-20230630171325746

下图是被BitDefender挂钩子的NtCreateThread函数,钩子是jmp 7FFAACAD0264

image-20230630171710947

代码思路

UNHOOKntdll()函数的主要目标是移除对ntdll.dll文件的任何hooks

1.获取被挂钩的ntdll信息

函数首先通过GetModuleHandleA("ntdll.dll")获取ntdll模块的句柄,这个句柄指向当前进程中已经加载的ntdll.dll

GetModuleInformation()被用于获取ntdll模块的信息,包括模块的基地址等。此处获取到的信息将被用于后续操作

2.打开新的ntdll并映射至进程空间

通过调用CreateFileA()打开系统目录下的原始ntdll.dll文件。这个文件没有被任何hook修改,所以可以作为一个“清洁”的源来恢复被hook修改的部分

使用CreateFileMapping()MapViewOfFile()函数将原始ntdll文件映射至当前进程的地址空间中

3.查找ntdll的text节区

遍历当前进程中加载的ntdll模块的所有section(节区)。在Windows PE文件格式(包括DLL和EXE)中,一个section是包含特定类型数据的一个内存区块,例如代码或者数据。特别地,.text section通常包含程序的代码

4.替换text节区的内容

通过调用VirtualProtect()改变它的内存保护属性,使其成为可读、可写、可执行。这样才能修改该内存区块的内容

通过memcpy()将原始ntdll文件中的.text section的内容复制到当前进程的ntdll模块的对应部分。这个操作实际上就是“恢复”了被hook修改过的代码,因为现在它被原始的、没有被hook的代码所替代

代码实现

运行测试

重载Ntdll后,可以发现杀软的钩子被去除掉了

image-20230630183555397

最后更新于