Проверка, упакован ли ELF с UPX в Linux - PullRequest
3 голосов
/ 03 февраля 2011

Я не знаю, как работает формат ELF или как получить доступ к его заголовкам и данным через код, однако мне нужно проверить, был ли двоичный файл ELF сжат (упакован?) С помощью UPX для Linux.

Проверка двоичного файла с помощью strings Я увидел строку UPX!, так что, думаю, я смогу это использовать. Шестнадцатеричный бинарный код показывает строку, и для позиции в двоичном файле я могу предположить, что она является частью одного из заголовков ELF (пожалуйста, исправьте меня, если я ошибаюсь). Это дамп этого:

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

Не знаю, хорошо ли это выглядит, извините.

Кто-нибудь знает, как обнаружить UPX в Linux? Если нет, то как получить доступ к заголовкам и получить эту строку UPX! (имя заголовка?)?

Я изучил исходный код UPX, но все написано на C ++, я хочу написать код на C, и за ним действительно трудно следовать.

Спасибо, любая помощь приветствуется.

РЕДАКТИРОВАТЬ: О награде. Ответ должен дать хороший пример, который работает, так как я пробовал разные подходы, и они не всегда работают, как в примере ниже.
Спасибо

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Это тесты для обнаружения сжатого файла 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. повторять до тех пор, пока больше не будет смещений

Интересно, что в моем 64-битном Ubuntu сжатые файлы UPX не обнаруживаются, поскольку этот тест отсутствует в /usr/share/misc/magic:

>>180   string      UPX!        UPX compressed (64-bit)
2 голосов
/ 09 февраля 2011

В исходном коде UPX есть функция int PackW32Pe::canUnpack(), которая сначала запускается в качестве теста, когда вы делаете upx -d <file> (распаковываете исполняемый файл).Он показывает, какие смещения должны быть проверены, чтобы определить, был ли файл упакован с помощью UPX.Я нашел код ясным и легким для подражания.Я рекомендую редактор с подсветкой синтаксиса.

Вы можете скачать исходный код для UPX на сайте проекта .

...