在Linux下检查一个ELF是否被UPX压缩

3
我对ELF格式的工作原理以及如何通过代码访问其头部和数据一无所知,但我需要检查Linux下的ELF二进制文件是否被压缩(打包)了UPX。
通过使用strings命令来检查二进制文件,我看到了字符串UPX!,所以我想我可以使用它。通过十六进制编辑二进制文件,我可以看到这个字符串,并且根据在二进制文件中的位置,我可以假设它是ELF头部的一部分(如果我错了,请纠正我)。以下是该部分的转储内容:
00000000    .ELF........................4...
00000020    ........4. ...(.................
00000040    ........................@...@...
00000060    @.....................[.UPX!....
00000080    ............T............?d..ELF

抱歉,我不确定这是否看起来好。

有人知道如何在Linux上检测UPX吗?如果不知道,如何访问头并获取UPX!字符串(头的名称?)?

我确实查看了UPX源代码,但所有内容都是C ++,我想用C编写此代码,但很难跟进。

谢谢,欢迎任何帮助。

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

2个回答

4
这些是检测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

查看文件内部偏移量的指定方式。

例如,在您的程序中,您应该:

  1. 打开要测试的文件以进行读取
  2. 跳转到其中一个这些偏移量
  3. 检查是否存在预期的字符串
  4. 重复直到没有更多偏移量

有趣的是,在我的Ubuntu 64位系统中,由于缺少此测试,无法检测到UPX压缩文件,因为它不在/usr/share/misc/magic中。

>>180   string      UPX!        UPX compressed (64-bit)

谢谢。我完全困惑了。magic是包含所有file引用的文件吗?我该如何从我的代码中调用它? - Jessica
你可以使用system()函数或者读取与文件相同偏移量的值并进行比较。 - Diego Torres Milano
好的,非常感谢您的帮助,但我不明白您想告诉我什么。读取魔术文件的偏移量?在特定位置执行“寻找”操作?无论如何,假设我已经读取了魔术文件,我仍然不知道如何读取ELF的头文件。您能否提供一小段代码片段? - Jessica
所以在这种情况下,如果我从手册中正确理解的话,我应该寻求180字节,读入缓冲区并与“UPX!”进行比较?如果不是,那么">",">>",">>>"等之间有什么区别? - Jessica
">" 的数量表示与前面测试的某种关系。在您的情况下,可能您不需要其他任何东西,只需跳过 180 字节并读取即可,但在此之前,请使用 'xxd' 检查样本文件的内容以验证 180 是否正确。 - Diego Torres Milano
我距离文件开头还差1000字节,但是无法读取任何内容。我已经尝试了将缓冲区读取为纯字符串、逐个字符和十六进制进行比较,但都没有结果。我有点沮丧了,感觉自己漏掉了什么重要的东西。我再次请求,是否可能发布一小段代码片段?谢谢,非常感激。 - Jessica

2
在UPX的源代码中,有一个名为int PackW32Pe::canUnpack()的函数,它在你运行upx -d <file>(解压可执行文件)时首先作为测试运行。它显示要测试哪些偏移量以检测文件是否使用UPX打包。我觉得代码很清晰,易于理解。建议使用语法突出显示的编辑器。
您可以在项目网站上下载UPX的源代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接