UPX识别
//https://www.cnblogs.com/Meteor-Kai/articles/18473549这篇文章不错
- 文件头签名
UPX! 或 UPX0、UPX1、UPX2 - 独特的节区名称
UPX 处理后的 PE 文件通常包含特征明显的节区:
UPX0 - 通常包含解压后的代码
UPX1 - 包含压缩的数据
UPX2 - 在某些版本中使用 - 入口点代码模式
UPX 壳的入口点有特定的汇编指令模式:
assembly
pushad ; 保存所有寄存器
; ... 解压代码 ...
popad ; 恢复所有寄存器
PUSHAD 可能被改为等价的指令序列(如多个PUSH指令),或者被垃圾指令包围,但核心逻辑仍在。你会看到在保存寄存器后,紧接着是一大段复杂的循环、异或操作、MOV指令等,这符合解压代码的特征。
PUSHAD 将所有寄存器压栈,导致ESP变化。解压代码通常不会在中间频繁操作栈,但在解压结束、执行 POPAD 之前,一定会恢复栈指针(之后的代码就是原始代码)。为了找到OEP,我们在PUSHAD(或多个PUSH保存寄存器操作)之后,对当前栈顶的内存地址下一个硬件断点即可。这个原理对许多UPX变种都有效。 - 资源结构异常
UPX 压缩的文件通常:
资源段很小或异常
原始程序的资源被压缩到数据段中
导入表被压缩和重建 - 动态行为分析
在沙箱环境中运行程序并观察行为:
内存解压模式:监控进程在运行时是否大量修改自身内存
API 调用序列:检测典型的解压壳行为模式
代码自修改:监控程序是否在运行时生成或修改可执行代码
绕过监测的技术:
- 修改 UPX 特征
重命名 UPX! 签名和节区名称
修改入口点代码模式
使用自定义编译的 UPX 版本 - 多层加壳
使用多个不同的加壳工具依次加壳:
text
原始程序 → UPX压缩 → 其他壳压缩 → 最终文件 - 加壳后修改
在 UPX 压缩后手动修改文件,破坏特征签名但保持功能完整。 - 使用保护壳而非压缩壳
使用 Themida、VMProtect 等高级保护壳,它们提供:
1)反调试技术
2)代码虚拟化
3)更强的加密
UPX魔改对抗可看Linux | UPX变形壳脱壳Tips /// Linux | UPX变形壳脱壳Tips(Bak)