Original Entry Point Finding |
||||
[Исследование] |
||||
Subject: Educational
Purpose. Target: Any VC++ programm. URL:www.microsoft.com. Author: aSL! Date: 14.07.2001 |
||||
Before starting! |
||||
I. Вступление | ||||
Здравствуйте мои маленькие любители прекрасного! :) Вы, наверное, помните, что я обещал открыть целый цикл статей про нахождение OEP без отладчика. Помните? Вот и ладненько... И как успехи? Ну ладно, давайте же займемся этим вплотную... |
||||
II. Постановка задачи | ||||
|
||||
III. Исследование | ||||
Необходимые инструменты:
Итак, приступим... Что мы имеем. Я взял и написал простенькую Win32 программулину на сях. Исходники ее весьма и весьма сложны :))): #pragma comment(linker,"/FILEALIGN:512 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /IGNORE:4078") Сразу же вопрос: а зачем такая #pragma? Ответ: так я говорю линкеру,
что неплохо было бы нашему файлику иметь все в одной секции: экономия
на место, однако. LINK : error LNK2001: unresolved external symbol _mainCRTStartup Угу... Что-то мне подсказывает, судя по названию, что тут-то и собака зарыта :) Почему? Да просто этот код встречается в дефолтных библиотеках типа libc.lib сотоварищи. Нашли эту строчку там? И мне кажется, что именно эта гадость и вызывается где-то в начале. Добавим libc.dll к списку используемых библиотек. Опять давим "Rebuild all". Хм... Судя по именам, что-то он хочет из кернеля вызвать, да не может. Добавим kernel32.lib. О-па! Скомпилировалось. Ну что ж... Будем копать libc.lib. Для этих целей нам понадобится еще lib.exe из состава VC++. Запускаем (для удобности скопировав в отдельную директорию lib.exe и libc.lib): LIB.EXE /LIST LIBC.LIB>1 Получаем длинююююющий список всех .obj, что запрятаны в .lib. Какая же из них наша. Что-то мне подсказывает, что она должна иметь crt и имени. Таких набралось не так-то много. Начнем. Первой я попробую crt0init.obj. Что-то имя мне это нравится... LIB.EXE /EXTRACT:build\intel\st_obj\crt0init.obj LIBC.lib Посмотрим туда. Нет. А зря :) Смотрим дальше. Я выбрал crt0.obj. (Приложение не оконное и wincrt0.obj мне что-то не нравится :))) LIB.EXE /EXTRACT:build\intel\st_obj\crt0.obj LIBC.lib Смотрим вовнутрь. Опа! Она. Загружаем ее в IDA. Получаем следующий листинг: public _mainCRTStartup При дизассемблировании реального .exe я получил такой код:
|:0040161B(C)
Чуете чем пахнет??? Уже можно так составить строку для поиска: 558BEC6AFF68????????68????????64A1????????5064????????????83EC105356578965E8FF Я специально откомпилировал с разными версиями библиотек и посмотрел, что будет. Ну что я могу сказать... Переборщили мы малость, но код до FF15 везде одинаковый, дальше отличается, но самую малость. Так что финальная версия строки: 558BEC6AFF68????????68????????64A1????????5064????????????83EC105356578965E8 |
||||
IV. Подводим итоги: | ||||
Мне действительно нечего сказать, поскольку OEP мы нашли. Также, хочу отметить, что распознать VC++ приложение оччень просто по строке "Microsoft Visual C++ runtime library" в сегменте данных. Далее, я взял UnPack 2.1, который может определять компиляторы по такой же видимо технологии. Он сказал, что мои .exe от "Microsoft Visual C++ 5.0 compiler". Значит, этот код там тоже не менялся. Единственная проблема: ранние и поздние версии. У меня их нет, кто може прислать сигнатуры - пишите, буду оччень благодарен. Вот собственно и все! :) |
||||
Endnote: © 2001 aSL! (asl@aslsoft.com ) This essay can be freely distributed/ published/ printed etc... as long as no modifications are made in any way. Greets to: Everyone in UOFG www.uofg.com.ua |