Извратный UPX в stamp 0.81dВ этом stamp 0.81d мы можем наблюдать какой-то новый upx. Вся фишка тут в том что ImageSize тут сделан огромным хотя imagebase все также 400000h. А сделано это неспроста. Это юзается для того чтобы раскидать данные по памяти чтоб тяжело потом собрать файл. Т.е. секция кода лежит как обычно с 401000, а вот ресурсы и импорт по адресам 1100000 и выше. Т.е. если снять полный дамп то выйдет файл размером 11E7000h = 18 МБ :) Плохо это :) Надо его как-то вернуть к первоначальному виду... Инструменты: Soft Ice, IceDump, Procdump, Hex workshop, Imprec, ExeScope . Сначала найдем OEP. Тут его найти примитивно просто. Загружаем через Symbol Loader и листаем вниз. В конце всего этого кода есть JMP 4AEB8C - это и есть OEP. Дальше я зациклил прогу перед прыжком на OEP и начал смотреть как создается импорт. Импорт создает распаковщик по списку имен процедур т.е. тупо делает LoadLibraryA и GetProcAddress и заполняет IAT. Я пролистал список этих функций в памяти и натолкнулся по адресу 15E3AAE на вот такое:
А это как-никак PE заголовок... и секций тут как-то побольше... Ради интереса я начал смотреть rva секций и проверять чему это ща соответствует в памяти... Все совпадает! Это правильный PE! Теперь нужно следуя этому PE сделать дампы секций и собрать из них файл. Итак судя по PE можно сделать такую табличку: NAME |Virtual Size | Virtual Offset | Raw Size | Raw Offset CODE | ADC4C | 1000 | ADE00 | 400 DATA | 1E10 | AF000 | 200 | AE200 BBS | 1108721 | B1000 | 0 | B0200 .idata | 25CA | 11BA000 | 2600 | B0200 .tls | 10 | 11BD000 | 0 | B2800 .rdata | 18 | 11BE000 | 200 | B2800 .reloc | B5A4 | 11BF000 | B600 | B2A00 .rsrc | 16A00 | 11CB000 | 16A00 | BE000Сначала дампим этот PE заголовок. Потом дампим секции: Virtual Offset + 400000h - это начало каждой из секций в памяти, Raw Size - это длина для дампа. Там где Raw Size = 0 дампить естественно ничего не надо :) Теперь нужно все это собрать. Берем Hex workshop и начинаем соединять. Сначала выдерем из оригинально exe файла MZ заголовок к нему в конец допишем наш pe. Дальше забьем нолями так чтобы это занимало 400h байт (т.к. CODE начинается с 400h). Дописываем CODE и DATA. Дальше по таблице мы видим глюк: место от AE200 до B0200 должно быть чем-то занято... Я В этом месте впихнул 2000h нолей - разберемся потом :) Дальше дописываем все остальные секции.
Все вроде бы ок тока вот нету импорта. Т.к. есть тока IAT а таблица затерта. Тут нам поможет Imprec. Получаем импорт и дописываем в полученный exe. Чо-то нехорошо... у нашего exe нету иконки... А все ли нормально с ресурсами? Открываем наш ехе в Exescope - в ресурсах пусто :( Если глянуть в наш файл по Raw Offset .rsrc то мы увидим одни ноли. Нету дерева ресурсов. А где же оно? Смотрим через Procdump - Pe editor в оригинальный exe. В Directory видим: Resource RVA 11E5000 Size F30. Вот оно! Берем этот блок длиной F30h и вставляем вместо нолей в секции .rsrc нашего дампа(там четко F30h нолей). Иконка не появилась, но все остальные ресурсы нормально просматриваются в Exescope... Кто спер иконку? Никто :) Она просто была вынесена в новую секцию rsrc после упаковки. Отдираем секцию .rsrc из упакованного файла и дописываем в наш. Правим параметры секции чтоб она такая же была как и в упакованом.(т.е. чтоб rva был правильным) Опа! Иконка вернулась! :) .0040B136: A1F4094B00 mov eax,[0004B09F4] .0040B13B: C70084AC4000 mov d,[eax],00040AC84в 4B09F4 оказывается 0 и оно повисает при попытке записать. 4B09F4 - это где? Блин да это ж в том промежутке от AE200 до B0200, там где я от фонаря ноли вставил. Берем тогда и дампим этот кусок памяти(от 4AF000 до 4B1000) в оригинальном ехе и записываем вместо нолей в промежутке от AE200 до B0200. Запускаем... Ура! Работает!!!! Итого 864 кб, а не 18 мб :)
P.S. Дальше берем DEDE и т.д. :)
|