载入第二个Ntdll绕Hook

简介

我不知道有没有人写过这个东西, 之前和我的亲兄弟snowming师傅交流时回想起来用CreateFileMapping->MapViewOfFile以文件映射的形式打开,如果被打开文件时PE格式,那么这个文件会按照内存展开,那么我们猜想是不是这个被第二次载入内存的ntdll是不是就是一个干净的ntdll,能不能帮助我们绕过一些inline hook。

流程

  1. 使用CreateFileMapping->MapViewOfFile映射一个ntdll

  2. 自己实现一个GetProcAddress函数

  3. 使用自写GetProcAddress函数获取nt函数

  4. do it

调试

把代码写出来之后windbg调了一下,发现如果没有挂钩,那么这个代码其实和原ntdll是一模一样的,在windbg里面会显示第二个ntdll。(只是显示成ntdll_xxx,在ldr链表里还是叫ntdll)。

如果使用windows api GetProcAddress函数获取函数地址的话会报错0126 找不到指定的模块。

具体分析过程参考开源的reactos项目的代码。

errorcode 126

但是如果我们直接自己编写一个GetProcAddress函数就可以获取到这个自己加载的ntdll内的函数地址并且执行成功。

代码

最后更新于

这有帮助吗?