ChainedShark Shellcode生成逻辑:PE头移除与段数据重组实现无文件执行
NSFOCUS伏影实验室在2025年APT年度报告中详细披露了新兴APT组织ChainedShark将完整C++木马LinkedInShell重构为shellcode的技术流程。该流程的核心目标是将传统PE可执行文件转换为可在内存中无文件加载执行的shellcode,从而规避基于文件特征的静态检测。流程首先从原始木马可执行文件中移除PE文件头,再对代码段、数据段、导入表和重定位表等核心二进制内容进行打乱混合,最后在混合数据前端添加跳转代码和加载器(loader),形成最终完整的shellcode。ChainedShark还设计了单向链表来标记shellcode中每段数据的位置和类型,使其在内存中能够正确区分代码与数据,完成加载执行。数据来源:NSFOCUS
ChainedShark Shellcode生成逻辑——关键步骤
| 步骤 |
处理对象 |
技术说明 |
| 1 |
原始木马可执行文件 |
完整的C++编译PE文件,包含PE头、代码段、数据段、导入表、重定位表 |
| 2 |
PE文件头移除 |
剥离PE文件头结构,消除可执行文件的格式特征 |
| 3 |
打乱并混合段表内容 |
将代码段、数据段、导入表、重定位表中的核心数据碎片化为最小单元并混合排列 |
| 4 |
添加跳转代码 |
在混合数据头部添加跳转指令,指向加载器入口 |
| 5 |
添加加载器(loader/shellcode) |
在混合数据中插入加载器,用于解析链表数据并加载执行 |
| 6 |
生成最终shellcode |
形成完整的shellcode,可在内存中无文件加载执行 |
数据来源:NSFOCUS
从ChainedShark Shellcode生成逻辑来看,可以提炼出三个关键判断:
PE头移除是规避静态检测的核心手段。 传统杀毒软件依赖PE文件头的特征签名进行检测。ChainedShark首先移除PE文件头,使样本在文件层面不再具有可执行文件的标准格式特征。报告指出,当NSFOCUS捕获LinkedInShell样本时,所有主流安全引擎在VirusTotal上均返回了零检测结果,证明该方法有效规避了基于文件特征的防护产品。
段数据碎片化与混合排列增加了逆向分析难度。 代码段、数据段、导入表和重定位表并非简单拼接,而是被“打乱并混合”到最小单元。这种处理方式使传统的基于PE结构解析的分析工具失效,分析人员无法通过标准反汇编流程还原程序逻辑。ChainedShark通过单向链表标记每段数据的位置和类型,使shellcode在执行时能够正确区分代码和数据,但静态分析工具无法获取这一链表信息,极大增加了分析门槛。
跳转代码与加载器的结合实现内存自我解析。 最终shellcode结构包含跳转代码(Jump code)和加载器(loader/shellcode),加载器负责在内存中解析混合数据中的单向链表结构,根据链表指向的数据位置和类型,将碎片化的代码段和数据段重建为可执行的程序逻辑。这种“自解析+自执行”模式使最终shellcode无需依赖任何外部加载器或解释器,可在内存中独立完成加载和执行,进一步强化了其在无文件攻击场景中的隐蔽性和自包含性。
NSFOCUS伏影实验室在2025年APT年度报告中详细披露了新兴APT组织ChainedShark将完整C++木马LinkedInShell重构为shellcode的技术流程。该流程的核心目标是将传统PE可执行文件转换为可在内存中无文件加载执行的shellcode,从而规避基于文件特征的静态检测。流程首先从原始木马可执行文件中移除PE文件头,再对代码段、数据段、导入表和重定位表等核心二进制内容进行打乱混合,最后在混合数据前端添加跳转代码和加载器(loader),形成最终完整的shellcode。ChainedShark还设计了单向链表来标记shellcode中每段数据的位置和类型,使其在内存中能够正确区分代码与数据,完成加载执行。数据来源:NSFOCUS