关于假入库的原理,大家在小黑盒上应该看过很多了,我在小黑盒写的第一篇文章就是关于假入库的原理,前段时间在写项目的时候缺了一个NTL.DLL文件(NTL大数库的动态链接库),从网上下了一个却不能用,最后逼得自己从头编译这个DLL,突然联想到假入库的最后一步也是替换DLL,正好讲一下关于DLL劫持的知识。
DLL(Dynamic Link Library)文件被叫做动态链接库文件,又称“应用程序拓展”。在Windows中,许多应用程序或者工程并不是一个完整的可执行文件(不是一个巨大的exe文件,这样可扩展性太差了),而是从exe文件中分割出一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。
一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件,比如xlive.dll是一个包含 Games for Windows - LIVE 客户端的实现代码的库文件,如果这个DLL缺少,很多游戏就都不能启动。
打个比方,我有一个计算农村里有多少动物的程序EXE,那么我可以把计算有多少牛的部分打包成一个DLL,计算多少猪的部分打包成DLL,exe本身只负责对他们的求和,这样就可以有效减少程序本体的大小,同时模块化程序结构,想用哪些动物就编写哪些动物的DLL文件。
另外,DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的内存地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出,对于游戏程序来说,不需要在游戏加载界面就载入所有的功能函数,这也有效分担了加载速度。
讲完DLL的基本概念,再来聊一下DLL劫持,我们只来介绍最简单的情况,当一个可执行文件运行exe时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表(可以理解为接口),需要在此时加载所有程序运行所需要的DLL文件,并将它们映射到进程的地址空间中。
当程序需要加载一个动态链接库(DLL)时,攻击者先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前程序所在目录下伪造的DLL,完成相关功能后,再跳到系统DLL同名函数里执行。这个过程就是DLL劫持的过程 。
微软为了防御操作系统的DLL被劫持,将一些容易被劫持的系统DLL写进了一个注册表项中,那么凡是此项下的DLL文件就会被禁止从EXE自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用。但是,攻击者可以伪造一个相同名称的dll文件,只要这个文件不在KnownDLLs注册表项中,就可以对该dIl进行劫持。
该注册表项下的dll被保护
在假入库中,被攻击者使用irm命令下载假入库脚本,下载文件名为hid.dll的链接库文件,释放到steam文件夹里,实现了dll劫持,使本地的客户端误以为游戏已经解锁,从而达到假入库的目的。
dll劫持在计算机入侵中应用非常广泛,只要目标dll文件不再'KnownDLLs'注册表中,且是EXE程序首先加载的DLL,而不需要依赖其他DLL加载。一个很经典的案例是2023年ESET研究人员发现了一个使用木马安装程序来传递FatalRAT恶意软件的活动,该恶意软件通过隐藏在一些常用软件里(比如fiefox,whatsapp等),通过Google搜索结果中出现的广告中链接的恶意网站进行分发,影响范围非常大:
研究者在论文中给出的简化攻击流程
该恶意软件通过旁加载恶意 DLL libpng13.dll 来运行,原始libpng13.dll也包含在安装程序包中(重命名为看似随机的名称),因为恶意 DLL 将其导出的函数转发到原始 DLL。原始 DLL 已重命名为 BHuedjhd.dll,并且恶意 DLL 被编译为 Dll22.dll。
恶意 DLL 中转发到原始 DLL 的部分导出函数
为了隐藏,该该恶意项目的加载程序 libpng13.dll 在内存中打开并执行一个名为 Micr.jpg 的文件,该文件与 DLL 位于同一目录中。攻击者通过多次调用一个函数来混淆加载程序,该函数只打印一些硬编码值。此行为用于避免被安全解决方案检测到或使 DLL 的分析复杂化。
左侧的混淆代码和右侧的去混淆代码
但是其实Micr是伪造的shellcode(即利用漏洞实现攻击的代码)还包含嵌入式 DLL。此 shellcode 的用途是通过调用名为 SignalChromeElf 的 DLL 的导出函数,在内存中加载和执行嵌入的 DLL。在执行此导出函数之前,shellcode会重构 DLL 的 imports 表并调用 DllEntryPoint,后者只是调用 Windows API 函数 DisableThreadLibraryCalls 作为增加 DLL 隐蔽性的一种方式。通过这种方式,成功绕过了安全审计,在用户的移动终端上安装了木马软件。
综上所述,DLL劫持是一种很常用的攻击手段,常见于病毒木马或网络钓鱼攻击中,不管是下载软件还是购买游戏前,都应该仔细审查是否有被劫持的风险,特别是在互联网上裸奔的盒友(没有使用杀毒软件)。
参考:
CSDN:DLL 劫持原理(运维)_dll劫持
Bilibili:Steam入库,irm steam.work|iex 风险和原理(代码分析)
清华大学《操作系统原理与实践教程》
ESET:These aren’t the apps you’re looking for: fake installers targeting Southeast and East Asia