可执行文件运行时会经历以下步骤:
第一步:Windows加载器会将PE(Portable Executable File Format)文件映射到内存中
第二步:分析可执行文件的导入表,寻找执行文件所需要的DLL文件(因为导入表中只有DLL文件的名称,没有路径信息,因此有了第三步)
第三步:按照第二步提供的DLL文件名称,Windows加载器在磁盘上搜索DLL文件,当前程序所在的目录(不会搜索父目录和子目录)->Windows系统目录->环境变量(按照这个顺序依次寻找DLL文件,一旦找到就停止寻找)
第四步:将相应的DLL文件装入,找到DLL中相应的函数,从而运行相应的函数。
DLL劫持原理:因为DLL搜索顺序原理,可以伪造一个DLL文件存放到程序所在目录,该伪造的DLL文件主要实现两个作用:1.实现恶意功能 2.调用真实的DLL文件。
所以会发现,可执行文件运行的时候会调用两个一样名称的DLL文件,一个是我们伪造的,一个是真实的,真实的DLL是由伪造的DLL去调用的。这样,在可执行文件运行时,既实现了恶意功能,又因为调用了真实的DLL,所以并不会导致可执行文件运行不了,这就是DLL劫持。
什么样的DLL不可以劫持?
注册表位置:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs,在此项下的DLL会被禁止从EXE自身所在目录下调用,而只能从系统目录即SYSTEM32目录下调用。
此注册表下的DLL不可以被劫持,因为搜索到程序所在目录下的DLL文件时是被禁止调用的,所以只能继续搜索Windows系统目录下的DLL文件。不可能把伪造的DLL文件放在Windows系统目录下,因为真实的DLL文件在Windows系统目录下,因为两个文件是同名称的,如果要把伪造的DLL文件放在Windows系统目录下只能删除真实的DLL,那就会导致可执行文件运行不了。
什么样的DLL可以劫持?
可以通过Proccess,查看运行该可执行文件需要的DLL文件,除去上述注册表中的DLL文件,剩下的都可以劫持。
具体流程可参考:https://blog.csdn.net/weixin_39523280/article/details/111214502