NTDLL 解除挂钩介绍

一、介绍

NTDLL 解除挂钩是将加载进程中的钩子 DLL 替换为未更改的未钩子版本,用未挂钩的版本替换挂钩的 DLL 需要手动设置 IAT、修复重新分配和其他繁琐的任务。为了避免这种情况, .text 可以替换 DLL 的一部分,特别是包含挂钩的部分。文本部分包含 DLL 的导出函数代码,这是安装潜在用户空间挂钩的地方。

二、解钩

替换 PE 文件映像(Image File)的 .text 段,需要获取其 基址(Base Address) 和 大小(Size)。这些信息可以通过 IMAGE_OPTIONAL_HEADER 结构体中的以下字段获取:
BaseOfCode:.text 段的起始地址
SizeOfCode:.text 段的大小

另一种获取 .text 段基址和大小 的方式是解析 IMAGE_SECTION_HEADER 结构体:
遍历 IMAGE_SECTION_HEADER 数组,查找 .text 字符串(IMAGE_SECTION_HEADER.Name),从而确定 .text 段的偏移和大小。

由于 .text 段默认是 可执行但不可写,因此要替换它,必须修改内存权限,使其允许写入数据。
修改内存权限可以使用 Windows API VirtualProtect,具体步骤如下:
获取 .text 段的地址和大小。
调用 VirtualProtect,将 .text 段的权限修改为 PAGE_EXECUTE_READWRITE PAGE_EXECUTE_WRITECOPY,以便能够写入新代码,同时保持可执行属性。
写入新的 .text 段,覆盖原有的 Hook 代码。
这样,就可以有效去除 DLL 的 Hook,而无需手动修改 IAT 或处理复杂的重定位问题。

三、文本部分对齐

下面使用Pe-Bear可以看到这一点,可以在 0x400 位置(1024 字节处)找到 .text 段
image

当DLL文件 映射到进程的内存中时,偏移量会发生变化。.text部分主要设置在偏移量为 0x1000 或 4096 的位置,如下所示。
image

posted @   aoaoaoao  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示