存在哪些不同的 UPX 格式,它们有何不同?

逆向工程
2021-06-20 03:07:19

最近我问了一个关于检测 UPX 压缩问题0xC0000022L想知道它是否是普通的 UPX。然而,在那之前我只知道普通的 UPX所以我的问题是:

  • 存在哪些 UPX 版本/修改?
  • 它们有何不同?他们有什么特点?
3个回答

首先,让我们看看UPX结构。

UPX 结构

  1. 序幕

    1. 用于 DLL 参数检查的 CMP / JNZ

    2. Pushad,设置寄存器

    3. 可选的 NOP 对齐

  2. 解压算法

    • 不管是NRV还是LZMA
  3. 呼叫/跳跃恢复

    • UPX 将相对调用转换为绝对调用,以提高压缩率。
  4. 进口

    • 加载库,解析 API
  5. 重置部分标志

  6. 结语

    • 干净的堆栈
    • 跳转到原始入口点

有关详细信息,这里是一个UPX-ED PE的评论IDA(免费版)美洲开发银行。

修改后的 UPX 变体

像序言/尾声这样的简单部分很容易修改,因此经常被修改:

  • 基本多态:用等价指令替换指令
  • 用跳跃移动它们

像解压、调用恢复、导入加载这样的复杂部分通常保持不变,因此通常会在它们之间插入自定义代码:

  • 反调试
  • 额外的异或循环(解压后)
  • 将在解压后的代码中进一步检查的标记,以便文件知道它已解压。

假装

由于序言并没有做太多事情,因此将其复制到非 UPX 封装的 PE 的入口点,以欺骗标识符和伪造 UPX 封装也很简单。

我将忽略 UPX 中有多种压缩算法以及 UPX 的多个版本。

通常,当人们询问它是普通的 UPX 还是普通的 UPX 时,这是因为恶意软件和其他软件喜欢采用 UPX 并对其稍作修改,因此无法使用标准 UPX 可执行文件对其进行解压缩,从而使反病毒软件难以解压缩。它在抵制逆向工程方面不是很有效。

我不确定这是否是您要问的,但 UPX 有多种压缩给定格式的方法。例如,一个 ELF - 可以直接解压缩到内存中 - 可以解压缩到 /tmp 并从那里执行

默认情况下首选第一个选项,但我认为它不是强制性的。有关详细信息,请参阅UPX 手册