仍在了解如何防止使用-d
UPX的(解压缩)选项的过程中(请参阅此问题),我尝试在 ELF 可执行文件中识别 UPX 的头文件。
查看代码,所有源似乎都在文件lx_elf.h
和lx_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 内部结构,我们将不胜感激。