DLL劫持与侧加载
当一个程序启动时,诸多 DLL 文件被加载到改程序的进程内存空间中,Windows 按照特定顺序查看系统文件夹来搜索进程所需的 DLL。 DLL劫持可以实现持久化,如果我们想方设法让一个自启动的程序载入了我们的恶意DLL文件。
我们举个例子,程序GameCenter是自启动的,并且在启动时载入数个DLL文件,其中没有明确某个DLL的位置。因此DLL文件被按照一定的搜索顺序,例如先从文件夹A中查看是否包含shell.dll,如果没找到则从B中寻找,以此类推,最终在文件夹D中找到并载入。如果我们在文件夹A中存放shell.dll,因为A文件夹优先被搜索,所以直接载入在A文件夹中的恶意DLL文件,D文件夹中的则被忽略。而A文件夹通常是程序的当前工作目录。实际的顺序的话,是这样的:
加载应用程序的目录,例如 C:\Program Files\Valid\
C:\Windows\System32
C:\Windows\System
C:\Windows
当前工作目录
系统 PATH 环境变量中的目录
用户 PATH 环境变量中的目录
也存在更简单的情况,程序所要加载的DLL并不存在。如图所示,我们可以看到QQ拼音与Discord就存在这个问题。因此我们只要在上述目录中写入一个同名的恶意DLL即可。
我们可以通过使用process monitor (https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) 来过滤得到缺失的DLL:
Path ends with dll
Result is NAME NOT FOUND
除了DLL劫持外,还有DLL侧加载。如果我们贸然用自己的恶意DLL替换掉程序原本要载入的DLL,会影响其功能。而DLL侧加载技术可以在不影响程序原有功能的情况下依旧执行我们的恶意载荷。