скрипт для IDA Pro, расшифровывающий программу
Естественно, чтобы написать скрипт, необходимо знать откуда и докуда шифровать, а так же ключ шифровки, для чего необходимо проанализировать алгоритм расшифровщика (см. листинг 1). Кстати говоря, IDA Pro не обновляет модифицируемый код в окне дизассемблера (точнее обновляет, но делает это как-то странно), поэтому нам необходимо нажать <U>
, разрушая ранее дизассемблированные инструкции в поток байт, а затем <C>
для превращения их в дизассемблерный код.
Другой способ противодействия упаковщикам заключается в подключении (attach) к уже запущенному процессу (задолго после того, как упаковщик все уже распаковал). В gdb за это делается так: "gdb --pid=<PID>
", где PID – идентификатор ломаемого процесса, который можно узнать с помощью команды "ps -a". Однако, это не самый лучший путь, поскольку мы вторгаемся в программу уже после инициализации кучи структур данных и снятый дамп может оказаться неработоспособным. К тому же из-за игр с extern'ом и несоответствия _start
реальной точке входа, существующие UNIX-дамперы не могут реконструировать elf-файл, получая Segmentation fault. Правда, можно воспользоваться утитой PD (более подробно она рассматривается в разделе, посвященному упаковщику UPX), указав "волшебный" ключик -l, предписывающий не трогать секцию .got, тогда Segmentation fault станет вызывать сдампленный файл, но зато он будет полностью расшифрован, что (теоретически) должно существенно упростить дизассемблирование, но практически из-за отсутствия символьных имен библиотечных функций, анализ рискует превратится в пытку.
Если же снимать дамп необязательно и достаточно просто "посмотреть" что делает упакованная программа, можно использовать утилиту ltrace, сеанс работы с которой показан ниже. Как видно, ELFCrypt совсем не пытается ей противостоять.
__libc_start_main(0x80483c4, 1, 0xbffffb34, 0x8048410, 0x8048470 <unfinished ...>
printf(0xbffffac0, 0x40017a50, 0xbffffad8, 0x804842b, 0x6c6c6568) = 13
hello, world!
gets(0xbffffac0, 0x40017a50, 0xbffffad8, 0x804842b, 0x6c6c6568) = 0xbffffac0
+++ exited (status 192) +++