基于 PIC Shellcode 的白程序 Patch 免杀技术实现
字数 1687
更新时间 2026-10-07 00:14:35

基于 PIC Shellcode 的白程序 Patch 免杀技术:机理与检测

“白程序 Patch + PIC Shellcode”是恶意代码规避检测中常见的一类思路。理解它的原理,对于终端防护、二进制取证与免杀样本识别很有帮助。本文仅从防御角度阐释相关概念、被利用的原因与检测/缓解方法,不涉及具体实现、编译配置或可用代码。

一、相关概念

  • 白程序 Patch:选一个本身干净、可信的合法程序(常带有数字签名、良好声誉),通过修改其关键位置(如入口点、某函数调用处、代码段空隙),插入一段跳转或直接嵌入自写 shellcode,使程序在正常执行流程中“顺路”执行恶意代码、再跳回原逻辑继续运行,外表上一切正常。其目的正是利用白程序的“信任背书”(签名、声誉、行为特征)降低被安全软件拦截的概率。
  • Shellcode 与 PIC:Shellcode 是把原本需要完整程序结构(PE、导入表等)的加载器/功能代码,压缩改写成一段可在内存中直接执行的纯机器码;PIC(位置无关代码)则指不依赖固定加载地址、在内存任意位置都能执行的代码。二者结合就是一段“自包含的精简加载器”。

二、为何能规避检测

从防御理解的角度,其规避力主要来自三点:

  1. 借用可信外壳:宿主本身是合法签名程序,基于信誉/白名单的简单判定容易放行;签名不会覆盖被 Patch 后的行为,形成“合法外壳 + 恶意行为”的组合。
  2. 避开常规加载机制:不依赖标准 PE 加载器修复 IAT,而在运行时动态解析系统 DLL 与函数地址(典型如经由进程环境块中的模块链表定位),使得静态特征(导入表、字符串)难以直接命中。
  3. 代码高度自包含:把逻辑收敛到少数可执行段,dump 后即为一段可独立执行的字节流,常规的文件/内存扫描面变小。

需要强调:上述只是“为什么难检”的机理描述,具体构造方式不属于本文范围。

三、检测与识别(蓝队视角)

针对此类技术,可从以下特征入手:

  • 完整性与签名校验:校验“签名有效”与“二进制未被篡改”并不等价——需验证文件哈希/数字签名与已知版本一致,发现可信程序被局部 Patch。
  • 入口点与控制流异常:入口点不在常规编译产物位置、入口首条指令即为跳转、或正常流程中出现不明方向的 call/jmp,都是可疑信号。
  • 内存属性异常:本不应可写又可执行(RWX)的内存区域、代码段中出现自修改/自解密行为,可用基于页面的执行保护与内存保护机制监测。
  • API 解析行为:运行时手工遍历模块链表、解析导出表获取函数地址(而非通过导入表),是典型的无导入表/动态解析特征,可作为行为检测项。
  • 行为链研判:单独的 PEB 访问并不必然恶意(壳、保护库也会用),需与网络外联、进程注入、持久化、异常子进程等行为关联综合判定。
  • 对可执行文件严格落地管控:应用白名单应基于“哈希/签名版本”而非仅目录,避免被白程序的外壳欺骗。

四、缓解与加固

  • 开启并依赖现代操作系统安全特性(ASLR、DEP/NX、CFG、控制流相关缓解、强制签名),降低“运行时计算函数地址再调用”“修改可执行段”这类手法被滥用的收益。
  • 用 EDR 采集上述内存/控制流/API 解析特征,纳入检测规则;对来自互联网的可执行程序实施隔离执行与沙箱预跑。
  • 保持软件版本与哈希基线,及时发现被篡改的“白程序”;对代码签名与发布通道做完整性保护。
  • 研究/教学环境下,相关分析应在隔离虚拟机中进行,避免影响生产系统。

五、结语

白程序 Patch 与 PIC Shellcode 的本质,是“用可信外壳包裹自定义的运行时加载逻辑”,从而同时削弱信誉判定与静态特征两类检测。相应的防御也应同时从两端入手:一方面用签名/哈希完整性与控制流缓解验证“外壳未被破坏”,另一方面用内存属性、API 解析与行为链监控识别“内部行为异常”。


本文仅用于安全研究、恶意代码分析与防护检测之目的,不提供任何可直接使用的构造方法。请在授权范围内开展分析,遵守《中华人民共和国网络安全法》及相关法律法规,不得用于任何未经授权的攻击、免杀投递或破坏行为。

相似文章
相似文章
小程序二维码
 全屏