Распаковка программы или поиск Original Entry Point

Лама - бох, ты - лох
Пользователь
Статус
Оффлайн
Регистрация
14 Янв 2019
Сообщения
404
Реакции[?]
59
Поинты[?]
0
Всем привет, не нашел тут разделов связанных с реверсингом, поэтому спрошу тут. Задча: распаковать программу (в прикреплении). Использую я IDA Pro.
Что я делал:
Попытка 1. Первым делом загоняю программу в DIE, смотрю каким упаковщиком упакована. Это UPX. Хорошо. Загоняю программу в IDA Pro и сразу иду в раздел сегментов, тут вижу 2 характерных сегмента UPX0 и UPX1. Смотрю в заголовок UPX0, вижу что сегмент не занимает память на диске, но резервирует 0x7000 байт, а по адресу 0х401000 и 0х40146e вижу массивы, это говорит о том, что программа будет распакована именно в этот раздел. В сегменте UPX1 по адресу 0х408000 вижу массив с, предположительно, зашифрованным оригинальным кодом программы. Смотрю кто обращается к этому массиву. Это инструкция по адресу 0х408ec1 (mov esi, offset dword_408000), а ниже инструкция lea edi, [esi - 7000h]. Отсюда становиться ясно, что пакер готовиться к распаковке и в регистр edi кладет адрес, куда нужно записывать расшифрованную программу. Делаю простые расчеты 0х40800 - 0х7000 = 0х401000, сюда будет распакована программа, а по этому адресу у нас как раз находиться массив в секции UPX0. Не долго думаю ставлю бряк на исполнение по адресу 0х401000. Запускаю отладчик ииии... какого то хера программа останавливается на адресе не 0х401000, а на 0x24100 и инструкции по этому адресу, с виду, не похожи на original entry point.... ошибка.
Попытка 2. На массив по адресу 0х40146e ссылается инструкция по адресу 0х40907с (jmp near ptr word_40146e), вполне вероятно, что это прыжок на оригинальную точку входа. Об этом также говорит наличие выше по коду инструкции popa. Ставлю бряк на этот джамп, запускаю отладчик. И опять что то непонятное происходит и отладчик останавливает на джампе, но, почему то, по адресу 0х24907с. Перехожу по прыжку и вижу непонятный call хер пойми куда, что тоже не похоже на original entry point.
Вопрос: что я делаю не так? Где у меня ошибки? Почему происходит такой непонятный сдвиг адресов? И как все таки найти оригинальную точку входа?
 

Вложения

Лама - бох, ты - лох
Пользователь
Статус
Оффлайн
Регистрация
14 Янв 2019
Сообщения
404
Реакции[?]
59
Поинты[?]
0
Отбой. Оригинальная точка входа все таки была в прыжке по адресу 0х40907с. Просто я с ходу не узнал процедуру start. Покопавшись в инструкциях, куда вел прыжок обнаружил очень знакомую картину: 3 колла, пуш всех полученных значений из функций и еще один колл. Когда пригляделся то понял, что первый колл, это __p__argv, второй колл __p__argс, третий колл инициализация енвайромента, ну а последний это вызов int main().
 
Сверху Снизу