RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Извратный UPX в stamp 0.81d

Прошу прощения за то что xtin долго не обновлялся. Я тут просто заболел краснухой :( А детские болезни в недетском возрасте сами знаете к чему приводят. Вот и пришлось отлеживаться. Но теперь я снова здоров и готов к бою :) Вот типа сразу схватился дебагер...

В этом 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 был правильным) Опа! Иконка вернулась! :)
Ну что? Пробуем запустить... повисло :( Во блин...
Загрузим наш ехе в Symbol Loader и пробуем найти где повисает. Повисает вот тут:

.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 и т.д. :)
P.S.S. Ломать его кстати необязательно. Если сделать поворот на 0 градусов оно создает в каталоге \windows\temp\ bmp рисунок :) Правда при выходе оно его стирает так что делаем печать, потом поворачиваем на 0 градусов, забираем из temp нашу печать :)


<= Вернуться к статьям


Rambler's Top100