解码UPX ELF头文件

逆向工程 小精灵 包装工
2021-06-20 21:30:12

仍在了解如何防止使用-dUPX(解压缩)选项的过程中(请参阅此问题),我尝试在 ELF 可执行文件中识别 UPX 的头文件。

查看代码,所有源似乎都在文件lx_elf.hlx_elf.cpp(代表Linux Elf)中。我试图遵循代码,但我迷路了......

我还查看了一个 UPX 压缩可执行文件 (amd64) 的开头,以每行 8 字节的模式进行可视化以更清晰(感谢Corkami ELF-101):

00000000: 7f45 4c46 0201 0103  .ELF....
00000008: 0000 0000 0000 0000  ........
00000010: 0200 3e00 0100 0000  ..>.....
00000018: 0831 4200 0000 0000  .1B.....    ELF HEADER
00000020: 4000 0000 0000 0000  @.......
00000028: 0000 0000 0000 0000  ........
00000030: 0000 0000 4000 3800  ....@.8.
00000038: 0200 4000 0000 0000  ..@.....

00000040: 0100 0000 0500 0000  ........
00000048: 0000 0000 0000 0000  ........
00000050: 0000 4000 0000 0000  ..@.....
00000058: 0000 4000 0000 0000  ..@.....    PROGRAM HEADER TABLE
00000060: f438 0200 0000 0000  .8......
00000068: f438 0200 0000 0000  .8......
00000070: 0000 2000 0000 0000  .. .....
00000078: 0100 0000 0600 0000  ........

00000080: 487d 0500 0000 0000  H}......
00000088: 487d 6500 0000 0000  H}e.....
00000090: 487d 6500 0000 0000  H}e.....
00000098: 0000 0000 0000 0000  ........
000000a0: 0000 0000 0000 0000  ........    UPX HEADER (???)
000000a8: 0000 2000 0000 0000  .. .....
000000b0: a298 b634 5550 5821  ...4UPX!
000000b8: f407 0d16 0000 0000  ........
000000c0: 1676 0500 1676 0500  .v...v..
000000c8: 0002 0000 bd00 0000  ........
000000d0: 0200 0000 fbfb 21ff  ......!.

000000d8: 7f45 4c46 0201 0100  .ELF....
000000e0: 0200 3e00 0d70 2840  ..>..p(@
000000e8: 0f1b f26d 1605 00e8  ...m....   ELF HEADER (again)
000000f0: 6d05 0013 01eb be7b  m......{
000000f8: 3800 0805 1c00 1b00  8.......
00000100: 060f 0527 9b90 27ec  ...'..'.
00000108: 4000 4007 c001 0008  @.@.....
....8<....

我的猜测是第二个 ELF 标头(始终位于 的偏移量处0xd8)是压缩可执行文件的标头。事实上,当查看可执行文件的原始 ELF 标头时(在应用之前upx),我们发现:

00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 3e00 0100 0000 7028 4000 0000 0000  ..>.....p(@.....
00000020: 4000 0000 0000 0000 e86d 0500 0000 0000  @........m......
00000030: 0000 0000 4000 3800 0800 4000 1c00 1b00  ....@.8...@.....
00000040: 0600 0000 0500 0000 4000 0000 0000 0000  ........@.......
00000050: 4000 4000 0000 0000 4000 4000 0000 0000  @.@.....@.@.....
00000060: c001 0000 0000 0000 c001 0000 0000 0000  ................
00000070: 0800 0000 0000 0000 0300 0000 0400 0000  ................
00000080: 0002 0000 0000 0000 0002 4000 0000 0000  ..........@.....

压缩版本中省略了一些字段,但主要保留了标头。因此,让我们假设这只是原始 ELF 标头的简短版本。

但是,我想了解的是第一个标题的字段:

00000080: 487d 0500 0000 0000  H}......
00000088: 487d 6500 0000 0000  H}e.....
00000090: 487d 6500 0000 0000  H}e.....
00000098: 0000 0000 0000 0000  ........
000000a0: 0000 0000 0000 0000  ........    UPX HEADER (???)
000000a8: 0000 2000 0000 0000  .. .....
000000b0: a298 b634 5550 5821  ...4UPX!
000000b8: f407 0d16 0000 0000  ........
000000c0: 1676 0500 1676 0500  .v...v..
000000c8: 0002 0000 bd00 0000  ........
000000d0: 0200 0000 fbfb 21ff  ......!.

所以,我的问题是关于发现 UPX 标头字段的位置和含义。如果有人了解 UPX 内部结构,我们将不胜感激。

2个回答

阻止 UPX 工具解压 UPX 压缩文件非常容易。如果你看看源代码,你会看到,它会检查魔术串UPX_MAGIC_LE32p_lx_interp.cpp所以,我只是将字符串的所有匹配项(在二进制块中)“ UPX!”更改为“ AAA!”。我将/bin/ls(ELF64)复制到另一个文件夹并用 UPX 打包。然后我像这样编辑它:

$ pyew ls
精灵信息
(...)
[0x00000000]> /s UPX #搜索字符串UPX
提示[0x000000b4]:UPX!........p...p...8..........ELF......>.. .E@..e..p
提示[0x0000abcc]: UPX!.....S...USQRH..VH..H..1.1.H.....P.....t..H. ......
提示 [0x0000ad3b]:UPX 可执行打包程序 http://upx.sf.net $..$Id:UPX 3.07 Cop
提示 [0x0000ad6b]:UPX 3.07 版权所有 (C) 1996-2010 UPX 团队。版权所有
提示[0x0000ad90]:UPX 团队。版权所有。$....^j._j.X..j._j....N...p...I..
[0x00000000]> s 0xb4 # 寻找文件中指定的偏移量
[0x000000b4:0x000000b4]> edit # 打开文件进行编辑
[0x000000b4:0x000000b4]> wx 414141 # 十六进制补丁
[0x000000b4:0x000000b4]> s 0xabcc
[0x0000abcc:0x0000abcc]> wx 414141
[0x0000abcc:0x0000abcc]> s 0xafe7
[0x0000afe7:0x0000afe7]> wx 414141
[0x0000afe7:0x0000afe7]> s 0xb3ac
[0x0000b3ac:0x0000b3ac]> wx 414141
[0x0000b3ac:0x0000b3ac]> q # 然后退出
$ ./ls
(...很多文件...)
$ upx -d ./ls
                       可执行文件的 Ultimate Packer
                          版权所有 (C) 1996 - 2010
UPX 3.07 Markus Oberhumer、Laszlo Molnar 和 John Reiser 2010 年 9 月 8 日
        文件大小比率格式名称
   -------------------- ------ ----------- -----------
upx: ls: NotPackedException: 未由 UPX 打包

解压 0 个文件。

就这样。无论如何,请记住,您只是在阻止此工具解压缩 UPX 压缩文件。UPX 是一种压缩器,任何对打包器有基本知识的人都可以毫不费力地解压缩。

正如在回答您之前的问题时回答的那样,UPX 是开源的,因此您可以阅读注释代码以了解标头:http : //upx.sourceforge.net/download/upx-3.91-src.tar.bz2