系统Dll加载卸载的简单实现过程和简单分析易语言源码本方法直接使用了NtMapViewOfSection实现Dll的映射,本质上和系统加载Dll的方式差别不大。
实现过程:
利用NtOpenFile打开Dll文件,然后使用NtCreateSection创建SectionHandle,接着使用NtMapViewOfSection将Dll映射到内存,基本的Dll加载就完成了。
然后将对映射的镜像进行处理,主要处理部分是重定向表和构建导入表,并且对映射内存设置保护:

在ProcessHacker中可以看到这个Dll(没有尝试将这个Dll写入Ldr的链,直接枚举是枚举不到的),Etw的IMAGE加载监听仍然可以监听到这个Dll的加载行为(提示:触发Etw记录的本质原因是使用了命令NtMapViewOfSection,在内核中Etw会对NtMapViewOfSection的行为进行记录)
其他:
如果将NtMapViewOfSection改为自己编写的内存映射代码,即可实现内存Dll。
本例子中的LdrpMapDll实际上只是一个很简单的例子,只处理了最基础的部分,很多复杂的部分还没有处理(包括清单,老版本兼容,入口点消息等等),这就自行开发了吧。

发表回复

后才能评论