加壳与反调试:结构决定了一切

逆向工程 · 3 分钟阅读· 274 次阅读

UPX 加壳的样本可以用官方工具直接脱,改造过的壳则会校验自身完整性,必须走内存 dump,脱完还要修导入表

逆向的第一课不是工具,是「这个东西本来该长什么样」。

先说结论

结构读对了,一半的问题自己会消失。

  • 先看头部:格式与位数
  • 再看段表:布局与对齐
  • 入口点不等于 main
  • 重定位影响静态地址
  • 交叉验证:反调试检测集中在 ptrace 附加、TracerPid 字段与时间差这三类

先看骨架

节区熵接近 8 说明内容接近随机,通常是压缩段或加密段,看直方图比看单个字节有效,单点取样会误判。

结构对了,字段名可以慢慢猜;结构错了,猜对也是错的。

关键字段

入口所在段同时可写与可执行,是自解压壳最直接的一个静态特征,正常产物很少这样,见到值得多看一眼。

字段 作用 常见误读
头部标识 判断格式与位数 把 32 位当 64 位读
段表/节表 决定内存布局 忽略对齐导致偏移全错
入口点 程序开始执行的位置 把入口当 main
重定位信息 加载时的地址修正 忽略后静态地址对不上

几个具体细节

下面这些是相对确定的细节:

  • 反调试检测集中在 ptrace 附加、TracerPid 字段与时间差这三类
  • 内存 dump 出来的镜像缺少节区对齐,导入表通常需要手工修复

加壳与反调试

常见的读错方式

看到熵高就断定加壳,其实是资源或压缩数据。

dump 完直接扔进反编译器,导入表没修全是乱码。

怎么验证自己读对了

用一个已知的工具交叉验证:壳只是提高了观察成本,真正难的是壳里面的逻辑本身。

还有几处容易忽略的

这些细节不影响入门,但影响你判断的准确度。

  • UPX 加壳的样本可以用官方工具直接脱,改造过的壳则会校验自身完整性,必须走内存 dump,脱完还要修导入表
  • 脱壳的终点不是程序能跑起来,而是静态分析工具能重建出调用图,导入表与重定位都要补齐
  • dump 完直接扔进反编译器,导入表没修全是乱码
  • 在生产机器上跑样本,没做网络与文件隔离

逆向不是猜,是核对。

评论 (3)

南
南风

补一句:修完要回归,很多人修一半。

路
路人甲

终于有人讲清楚「为什么」而不是只给命令。

白
白帽小陈

防御那节写得克制,没有教人打站,这点好评。

发表评论

验证码

提交后需站长审核,通过后才会显示。