我对 ELF 格式的工作原理或如何通过代码访问其 header 和数据一无所知,但是我需要检查是否已使用 UPX for Linux 压缩(打包?)ELF 二进制文件。

使用 strings 检查二进制文件我看到了字符串 UPX! 所以我想我可以使用它。对二进制文件进行十六进制编辑会显示字符串,对于二进制文件中的位置,我可以假设它是 ELF header 之一的一部分(如果我错了,请纠正我)。这是一个转储:

00000000    .ELF........................4...
00000020    ........4. ...(.................
00000040    ........................@...@...
00000060    @.....................[.UPX!....
00000080    ............T............?d..ELF

不知道这样好看不,抱歉。

有谁知道如何在 Linux 上检测 UPX?如果没有,如何访问标题并获取该 UPX! 字符串(标题的名称?)?

我确实查看了 UPX 源代码,但一切都是 C++,我希望用 C 编写代码,这真的很难理解。

谢谢,欢迎任何帮助。

编辑:关于赏金。他们的回答必须给出一个有效的例子,因为我尝试了不同的方法,但它们并不总是有效,如下面的示例。
谢谢

最佳答案

这些是检测 UPX 压缩文件的测试:

>>>>(0x3c.l+0xf8)   string      UPX0 \b, UPX compressed
>>>>(0x3c.l+0xf8)   search/0x140    UPX2
>>>(&0x7c.l+0x26)   string      UPX \b, UPX compressed
>>>&0x26    string      UPX \b, UPX compressed
>>85    string      UPX     \b, UPX compressed


man 5 magic

查看文件内的偏移量是如何指定的。

例如在你的程序中你应该:
  • 打开被测文件读取
  • 跳到这些偏移量之一
  • 检查是否存在预期的字符串
  • 重复直到不再有偏移

  • 有趣的是,在我的 64 位 ubuntu 中,未检测到 UPX 压缩文件,因为 /usr/share/misc/magic 中缺少此测试:
    >>180   string      UPX!        UPX compressed (64-bit)
    

    关于在 Linux 中检查 ELF 是否包含 UPX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4888237/

    10-12 01:04