白加黑 DLL 劫持免杀

认识

DLL劫持,顾名思义,即对正常运行的无害程序的DLL调用进行劫持,使其调用了黑客设置的非法的、有害的DLL库,从而执行恶意代码。该类无害程序大多本身是有正规的文件签名与证书的,因此会被许多杀毒软件列为白名单,对其一些敏感的操作会进行规避。如果对白名单内的程序进行DLL劫持,将其替换为自己的payload,往往可以实现恶意代码的免杀。

程序调用DLL有一个大致的优先级,大致为

  • 程序根目录
  • 系统目录(如system32)
  • 16位系统目录
  • Windows目录
  • 当前工作目录
  • 环境变量PATH中的目录

如果优于原本的DLL伪造了一个DLL,那么程序在尝试加载DLL时,会优先载入恶意DLL,从而执行恶意代码。

白名单程序

白名单程序是十分好找的,只不过随着越来越多的开发者对安全的重视变得更强,程序在调用 dll 时会进行校验。所以对于白名单程序,须探明其是否有 dll 的完整性校验。但其实还是有很多的常见的白名单程序没有引入完整性校验的。

删去对应的dll,再检查能否正常启动应用,即可简单地判断是否进行了对该dll的调用。

而为了测试其是否检测了dll的完整性就有点麻烦了,一般是做完之后才能检测。。

使用工具

  • ProcessMonitor: 微软提供的Sysinternals套件的一部分。可以监控和显示操作系统中关于文件系统、注册表、进程、线程和DLL活动的详细实时信息。在本次实验中,Process Monitor可以被用来追踪哪些程序正在尝试加载哪些DLL。即可下载,直接谷歌在官网即可下载。

image-20240914215319441

  • Aheadlib: 典中典DLL劫持领域中的最常见工具。可以利用该工具用于生成代理DLL,然后替换至对应目录即可实现DLL劫持。这里我使用的是GitHub上使用较广的版本https://github.com/Yonsm/AheadLib
  • VisualStudio 2022:现在许多重写版的Aheadlib都是基于VisualStudio2022来开发的,为了防止环境不同的bug出错,也为了更好地生成出稳定的dll,最好使用该工具来编写和生成dll。

DLL 劫持 - 即时调用函数

dll劫持的实操其实比较麻烦,而且寻找不会做检验的应用也比较靠运气,当然有很多现成的已知的可以劫持的应用程序。我这里实操使用雷神加速器进行。

1.寻找调用dll

image-20241021200321923

可以看到雷神加速器目录下有ffmpeg.dll,应该是团队开发时基于ffmpeg魔改的dll。如果删去该dll,运行leigod.exe时,会产生报错

image-20241021200445396

那么可知雷神加速器启动时就会调用ffmpeg.exe。那么就可以通过劫持该dll,在虚假的dll中写入自己的恶意代码,在运行启动leigod.exe时就会调用它,从而实现代码执行或远控。

2.构造恶意dll

使用Ahead进行构造,参数如下

image-20241021204209239

这里填写大致如上,选择即时调用函数,其dll劫持方法与直接转发大有不同,且听后文分解。

得到输出的cpp后,将其代码内容全部复制至visual studio中。vs这边需要先创建一个dll项目,然后将代码复制到dllmain即可

如果有提示形参不兼容等报错,可以在项目处修改字符集为多字节字符集。等会生成方法使用Release,所以需要修改Release的配置。注意这里的原始dll,待会会用到。

image-20241021205739141

bug问题

我使用的Aheadlib生成的cpp疑似有点bug,也可能是我vs的配置问题。

生成出来的cpp在链接函数时,是从0开始链接

image-20241021211451603

询问gpt后得知好像不能从0开始(在Windows上)

image-20241021211401741

所以把第一行删去即可

即删去#pragma comment(linker, "/EXPORT:Noname0=_AheadLib_Noname0,@0,NONAME")这一行

删去后,就可以构造自己的恶意代码了。

在dll的入口函数处添加即可,我这里简单弹个计算器。

image-20241021204417462

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	STARTUPINFO si = { sizeof(si) };
	PROCESS_INFORMATION pi;
	CreateProcess(TEXT("C:\\Windows\\System32\\calc.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);

	if (dwReason == DLL_PROCESS_ATTACH)
	{
		DisableThreadLibraryCalls(hModule);
		return Load();
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		Free();
	}

	return TRUE;
}

然后生成出最终dll即可。选择Release x86,但具体是x86还是x64需要根据原先dll的具体信息来选择。

image-20241021205023556

3.更名劫持dll

得到的dll改名为ffmpeg.dll,将其复制到雷神加速器leigod.exe的同目录下。同时还需要将原始的ffmpeg.dll更名为ffmpegOrg.dll(即之前的原始dll名)一同复制,然后再运行。

image-20241021205234730

可以看到成功弹出了计算器

但是由于雷神加速器自身开发的机制,检测到被修改后的dll后,会进行一次自我修复,然后ffmpeg就被替换了(可以对比前后两次ffmpeg.dll的大小)

image-20241021210616162

但这也总比直接禁用好,好歹调用了一次dll执行了代码。

而potplayer就会检测dll完整性,如果检测到dll被修改则直接取消调用,代码也无法执行了。

4.简化打包(武器化)

测试完毕后,如果该app检测出dll被修改后不会强行停用,就可以将该app简化打包了。

将其主要文件放在独立的文件夹里,查看是否能成功运行恶意代码

image-20241021210925111

如此,只需要将恶意代码修改为payload并加载,就可以上线了。

已知白文件汇总

可以通过此网站来查看已挖掘到的Dll:https://hijacklibs.net/