Разопаковане на Perl скриптове, обработени от PerlApp - Разни


По този начин определяме, че библиотеката zlib се използва за компресиране, а доста старата версия е 1.1.4. Разбира се, можете да започнете да търсите къде точно се съхраняват компресираните данни във файла, но аз исках да отида в другата посока. И така, имаме нужда от някакъв вид дизасемблер като IDA или OllyDbg, както и няколко експериментални exe файла, за предпочитане опаковани с различни версии на PerlApp, за да определим недвусмислено сигнатурата на функцията за разопаковане. Функцията за разопаковане просто се търси, ако навигирате по реда с версията (1.1.4), но, както можете да видите, функциите могат да се различават доста от версия до версия:


Ако обаче обърнем внимание на опашката на функцията, ще видим, че има стабилна последователност от байтове, която освен това е уникална за файла като цяло. Това е доста удобно и ние просто се интересуваме от указателя към буфера с неопаковани данни, които връща.
Както можете да видите от екранните снимки, може да варира леко (само 2 байта), но това не е проблем, тъй като никой не си прави труда да приложи търсене по маска. Сега трябва по някакъв начин да прихванем данните, които се поставят в EAX в края на функцията, за да можем след това да ги запишем във файл. Една от опциите е да организирате JMP в тялото на вашата функция в края на функцията, да изпълните инструкции, които са били презаписани от скок, да напишете съдържанието на буфера, където е необходимо, и да се върнете назад, но отново исках да тръгна по малко по-различен начин. Вместо да създавам трамплин, просто пренаписвам инструкцията RETN с инструкция INT3, която прехвърля контрола към VEH, в който съдържанието на буфера се записва във файл, EIP и ESP регистрите се променят (чрез структурата PEXCEPTION_POINTERS) и програмата продължава да работи по-нататък,сякаш нищо не се е случило и инструкцията RETN беше изпълнена вместо INT3.
Сега ще дам кода, който изпълнява това, което описах по-горе. Резултатът е DLL, който трябва да се добави към импортирания exe файл със скрипта или да се зареди по някакъв друг начин. Първо, нека обозначим включванията, няколко константи и да създадем празна експортируема функция: