FE23 LOOCH DISASMДИЗАССЕМБЛЕР
|
Главная | Загрузка | Инструкция | Карта сайта |
БЫСТРЫЙ СТАРТУРОК ВТОРОЙСодержание
1. Постановка учебной задачиДля первого учебного дизассемблирования мы поставим перед собой совсем простую цель. Предположим, что каким-то способом с помощью какого-то иного инструмента (например, отладчика) мы нащупали в исследуемой большой программе начало некоторой процедуры. То есть, мы уже знаем адрес входа в эту процедуру. И теперь мы хотим побольше узнать о самой этой процедуре. Для этого нам нужно иметь хотя бы распечатку ассемблерного текста. Для решения этой задачи мы воспользуемся программой FE23. Мы получим требующуюся распечатку (имеется в виду "распечатка" на экране). Мы хотя бы оценим для начала большая это процедура или маленькая. А еще программа FE23 нарисует нам блок схему - покажет все переходы внутри этой процедуры, так что мы увидим, насколько сложна логика этой процедуры. 2. Программа FE23 помогает исследовать файл
|
Попробуйте исследовать файл - fe23.exe с помощью программы FE23_Looch_Disasm Чтобы Вам помочь, программа сообщает некоторые свои виртуальные адреса (vir_addr) Головная процедура =WinMain= 00401010 Оконная процедура главного окна =MainWndProc= 004013E0 Функции из стандартной библиотеки =sprintf= 004174E0 =sscanf= 00417490 =printf= 00417450 =scanf= 00417430 =strcpy= 00417340 =strcat= 00417350 =strcmp= 004172B0 =strlen= 00417230 |
Для изучения мы возьмем маленькую процедуру "strlen". Эта процедура - одна из самых простых, она подсчитывает длину текстовой строки,
Итак, у нас есть начальный адрес 00417230 процедуры "strlen".
Еще раз повторяем. Вы должны взять адрес процедуры "strlen"
из Вашей распечатки. Для Вашей версии файла
Делаем подготовку к исследованию файла. Повторяем те действия, о которых было рассказано ранее на первом уроке: "Быстрый старт. Урок первый".
(1) Программа FE23 уже запущена. Никакого дизасма мы пока не делали, никаких накопленных данных еще нет.
(2) По команде
( Или, быть может,
(3) По команде
(4) По команде
ОБЩИЕ СВЕДЕНИЯ Имя проекта (---) Исследуемый Файл H:/FE/C/23/RELEASE/fe23_10.exe (других данных нет) |
Прежде, чем мы начнем делать дизассемблирование (дизасм), нам нужно установить значения для нескольких параметров.
Поскольку наша учебная работа называется "Быстрый старт", мы сейчас не будем углубляться в подробное разбирательство, зачем нужны эти настройки и как их выбирать. Скажем только самое основное и необходимое.
А всю дополнительную информацию Вы сможете потом прочитать на странице "Настройки дизасма и арифметика адресов".
А пока установите вот такие настройки дизасма:
Параметры дизассемблирования Предельный размер луча = 512 Предельное количество лучей = 20 Создавать заявки для CALL = ДА Печатать ассемблерный текст = НЕТ |
Чтобы сделать установку настроек вызовите из главного меню
диалог для установки настроек, это команда
А показанная выше табличка с настройками печатается в протоколе
по команде
Ну, а теперь, если хотите, вот короткие пояснения по этим четырем параметрам.
(1) Предельный размер луча (количество байт) мы выбираем с таким расчетом, что мы не встретим в данном исследуемом файле лучей большего размера. Если некоторый луч все же окажется больше, то дизассемблер не сможет дойти до конца луча и сообщит об ошибке при дизасме. Повторить дизасм для этого луча нельзя (так сейчас сделано в программе). Придется начинать все с начала.
(2) Предельное количество лучей - это то количество лучей, которое
дизассемблер проходит за один раз. Если задано мало лучей, то
дизасм остановится и останутся невыполненные заявки (они будут
напечатаны в протоколе). Это не страшно. Для продолжения дизасма нужно просто
дать команду на продолжение
Эти два параметра являются параметрами безопасности. Для них можно установить значения 999999999. Но при этом можно вляпаться в неприятную ситуацию, когда придется очень долго ждать окончания бессмысленной работы дизассемблера.
(3) Создавать заявки для CALL или не создавать - это зависит от тех целей, для которых выполняется дизасм.
Для нашего конкретного случая значение этого параметра безразлично, так как в той процедуре, которую мы сейчас будем проходить дизасмом, вообще нет ни одного вызова CALL.
(4) Печатать ассемблерный текст или не печатать - это зависит от желания пользователя.
Для нашего конкретного случая вполне можно включить из любопытства эту печать, так как наша исследуемая процедура небольшая. Но основную печать ассемблерного текста (асм. текста) мы все равно сделаем позже по готовым лучам.
Первый проход дизасма - это название одного из трех видов дизасма в программе FE23. Для этого вида дизасма основная цель - не получение распечатки с асм. текстом, а выделение в исследуемом файле участков кодов, занимаемых лучами и процедурами.
После того, как выполнен первый проход дизасма, мы сможем получить в программе FE23 распечатки для нужных нам конкретных процедур. Это будет уже совсем другой вид дизасма - дизасм по готовым лучам.
За дальнейшими объяснениями обратитесь к странице: Основные понятия. Сейчас Вы можете пока не отвлекаться. Но потом обязательно посмотрите, что в программе FE23 названо как "Первый проход дизасма".
Итак, мы приступаем к дизасму для процедуры "strlen" из стандартной библиотеки. Мы уже знаем начальный адрес 00417230 для этой процедуры. Это виртуальный адрес.
В программе FE23 применяются три способа адресации:
Об этом Вы сможете потом прочитать на странице Настройки дизасма и арифметика адресов
А сейчас Вам будет нужно задать именно виртуальный адрес.
Из главного меню мы даем команду
Поэтому сначала появляется диалог для задания адреса.
В этом диалоге нужно нажать кнопку "Use" возле того окошка, где задается виртуальный адрес. И занести в окошко значение этого виртуального адреса - 00417230.
Внимание.
Не забудьте, что следует брать тот адрес,
который есть именно в ВАШЕЙ распечатке "Probe", а не тот,
который мы для примера приводим здесь в инструкции.
Нажимаете кнопку "OK" в диалоге, после этого сразу начинается дизасм.
В протоколе появится вот такая длинная распечатка.
Стартовать дизасм с заданного адреса virt address = 0x00417230 file index = 0x00016630 НАЧАЛО ДИЗАССЕМБЛИРОВАНИЯ Вход по адресу - адрес был задан пользователем Процедура - 001 (процедура или только ветвь) 00417230 REQU_START 0041723A EXIT_JCC 00417250 -------- 0041723C REQU_NEXT 00417241 EXIT_JCC 00417283 -------- 00417243 REQU_NEXT 00417249 EXIT_JCC 0041723C -------- 0041724B REQU_NEXT 00417266 EXIT_JCC 00417250 -------- 00417268 REQU_NEXT 0041726D EXIT_JCC 004172A1 -------- 0041726F REQU_NEXT 00417271 EXIT_JCC 00417297 -------- 00417273 REQU_NEXT 00417278 EXIT_JCC 0041728D -------- 0041727A REQU_NEXT 0041727F EXIT_JCC 00417283 -------- 00417281 REQU_NEXT 00417281 EXIT_JMP 00417250 -------- 00417283 REQU_JCC 0041728C EXIT_RET Лучи: 10 пройдено, 20 предел, 11 всего в списке -------- 0041728D REQU_JCC 00417296 EXIT_RET -------- 00417297 REQU_JCC 004172A0 EXIT_RET -------- 004172A1 REQU_JCC 004172AA EXIT_RET Пройдено лучей 13 Все заявки выполнены КОНЕЦ ДИЗАССЕМБЛИРОВАНИЯ |
Смотрим на самый конец этой распечатки. Дизасм закончился, потому что "Все заявки выполнены". Если бы дизасм закончился по другой причине, то на этом месте мы получили бы список невыполненных заявок, оставшихся в очереди на выполнение.
Всего в исследуемой процедуре мы прошли дизасмои 13 лучей. Но не спешите, мы пока еще не знаем сколько в этой процедуре получилось лучей на самом деле.
Даем команду
ОБЩИЕ СВЕДЕНИЯ Имя проекта (---) Исследуемый Файл H:/FE/C/23/RELEASE/fe23_10.exe Найдено процедур 1 Пройдено процедур 1 Пройдено лучей 14 Найдено CALL's 0 Невыполненных заявок 0 |
К этой распечатке нужны небольшие комментарии.
(1). Всего лучей оказалось 14, а не 13. Как правило, именно так и выходит, лучей получается в итоге больше, чем было пройдено. Потому что после того, как луч уже был пройден, выясняется, что некая команда передачи управления ведет внутрь луча. И тогда из этого луча приходится делать два луча.
(2). В дальнейшем Вы узнаете, что "найденная" процедура может быть еще не пройдена дизасмом. Процедура отмечается как "пройденная", если хотя бы один луч этой процедуры уже пройден дизасмом.
(3). Инструкций CALL нам не встретилось. Из этой исследуемой процедуры не вызываются другие процедуры. (Об этом мы выше уже упоминали).
Итак, первую часть поставленной задачи мы уже выполнили. Мы уже прошли дизасмом одну отдельную процедуру, для которой мы "откуда-то со стороны" узнали начальный адрес.
Далее мы будем делать вторую часть нашей учебной задачи. Нам нужно подготовить распечатки для изучения данной процедуры. (Хотя само это изучение случайно взятой библиотечной функции в наши планы конечно не входит).
Нам нужно получить удобную распечатку с ассемблерным текстом (асм. текст) для изучения нашей процедуры. Чтобы получить такую распечатку мы еще раз выполним дизасм. Такой вид дизасма в программе FE23 называется "дизасм по готовым лучам".
Сейчас в накопленных данных, а говоря точнее, в списке лучей
у нас есть лучи только той одной процедуры, для которой мы
уже сделали первый проход дизасма. Поэтому мы воспользуемся
той командой, которая делает распечатку асм. текста для всех
имеющихся лучей, то есть, для всех лучей, какие есть в списке
лучей. Это команда
Обратите внимание, что этой командой не следует пользоваться тогда, когда в списке будет слишком много лучей. Потому что есть еще и другие команды в главном меню. (Что такое "много" - это каждый пользователь решает для себя сам.)
Распечатка появится в отдельном окне программы FE23.
ПОЛНАЯ РАСПЕЧАТКА ДЛЯ ВСЕХ ЛУЧЕЙ -------- Процедура 001 -------- Здесь вход в процедуру -------- 00417230 8B4C24 04 MOV ECX,SS:[ESP+4] 00417234 F7C1 03000000 TEST ECX,00000003 0041723A 74 14 JE SHORT 00417250 -------- 0041723C 8A01 MOV AL,[ECX] 0041723E 41 INC ECX 0041723F 84C0 TEST AL,AL 00417241 74 40 JE SHORT 00417283 -------- 00417243 F7C1 03000000 TEST ECX,00000003 00417249 75 F1 JNE SHORT 0041723C -------- 0041724B 05 00000000 ADD EAX,0 -------- 00417250 8B01 MOV EAX,[ECX] 00417252 BA FFFEFE7E MOV EDX,7EFEFEFF 00417257 03D0 ADD EDX,EAX 00417259 83F0 FF XOR EAX,-1 0041725C 33C2 XOR EAX,EDX 0041725E 83C1 04 ADD ECX,4 00417261 A9 00010181 TEST EAX,81010100 00417266 74 E8 JE SHORT 00417250 -------- 00417268 8B41 FC MOV EAX,[ECX-4] 0041726B 84C0 TEST AL,AL 0041726D 74 32 JE SHORT 004172A1 -------- 0041726F 84E4 TEST AH,AH 00417271 74 24 JE SHORT 00417297 -------- 00417273 A9 0000FF00 TEST EAX,00FF0000 00417278 74 13 JE SHORT 0041728D -------- 0041727A A9 000000FF TEST EAX,FF000000 0041727F 74 02 JE SHORT 00417283 -------- 00417281 EB CD JMP SHORT 00417250 -------- 00417283 8D41 FF LEA EAX,[ECX-1] 00417286 8B4C24 04 MOV ECX,SS:[ESP+4] 0041728A 2BC1 SUB EAX,ECX 0041728C C3 RET -------- 0041728D 8D41 FE LEA EAX,[ECX-2] 00417290 8B4C24 04 MOV ECX,SS:[ESP+4] 00417294 2BC1 SUB EAX,ECX 00417296 C3 RET -------- 00417297 8D41 FD LEA EAX,[ECX-3] 0041729A 8B4C24 04 MOV ECX,SS:[ESP+4] 0041729E 2BC1 SUB EAX,ECX 004172A0 C3 RET -------- 004172A1 8D41 FC LEA EAX,[ECX-4] 004172A4 8B4C24 04 MOV ECX,SS:[ESP+4] 004172A8 2BC1 SUB EAX,ECX 004172AA C3 RET -------- |
Что можно сказать про эту распечатку.
По-видимому, Вы уже поняли, что черточки здесь разделяют отдельные лучи. Всего в этой процедуре есть 14 лучей.
Здесь лучи идут сплошным массивом, между ними нет пропущенных байтов. Если бы такие пропуски были, они были бы показаны на распечатке. Вы увидете это на распечатках других процедур.
Теперь получим распечатку со схемой. Фактически это блок-схема процедуры. На ней показаны все передачи управления между лучами.
Опять воспользуемся такой командой, которая дает нам схему для
всех лучей, имеющихся в списке лучей.
Это команда
Еще раз напомним, что командами этой группы не следует пользоваться тогда, когда в списке будет слишком много лучей.
Распечатка появится в отдельном окне программы FE23.
|
Сделаем некоторые пояснения.
(1) На схеме показаны все 14 лучей, имеющихся в списке лучей.
(2) Каждый луч показан условным значком в виде прямоугольника. Линия перехода с другого луча может "входить" в данный луч в верхней части этого значка - то есть, в начало луча. И может "выходить" из луча в нижней части значка, в конце луча.
(3) Для каждого луча, перед адресом луча, слева указаны два номера - порядковый номер процедуры, которой принадлежит данный луч, и порядковый номер луча в списке лучей.
(4) В нижней части луча указано, какой командой заканчивается луч. Слово JCC - это условная передача управления. Слово ANY означает "другая команда", не команда передачи управления.
(5) Возле правого края распечатки показан адрес, куда ведет переход из данного луча. В этой же колонке будут показаны адреса (и имена) вызываемых процедур, если в луче будут встречаться команды CALL - команды вызова процедур.
Примечание
Если логика процедуры будет очень сложная, то на схеме будет занято намного больше позиций для вертикальных линий. В результате не останется места для правой колонки с адресами переходов и адресами (или именами) вызываемых процедур.
В подобных случаяъ может помочь еще одна команда меню,
которая имеется в этой же группе команд -
Вы прямо сейчас можете попробовать дать команду
Теперь мы обратимся к обзорному экрану. Посмотрим, как выглядит на нем наша процедура 001.
Из главного меню даем команду
На странице "Обзорный экран" есть две картинки (скриншоты), которые соответствуют нашему учебному уроку, это рисунки 2 и 3 в самом начале этой страницы. Картинки получены после того, как первый проход дизасма был сделан только для одной процедуры 001.
Мы не будем повторять здесь эти рисунки. И не будем повторять пояснения к этим рисункам. Для того, чтобы использовать обзорный экран, все-таки стоит прочитать соответствующую страницу инструкции - "Обзорный экран", чтобы было легче с этим экраном разобраться.
А здесь мы поговорим немного о другом. Обсудим, какая нам может быть польза от того, что мы увидим интересующую нас процедуру на обзорном экране.
Во-первых, стоит посмотреть, как расположена данная процедура в исполняемом EXE файле. Занимает ли эта процедура одну сплошную область кодов, или изучаемая процедура разделилась на две и более областей. И тогда сразу вопрос - а что находится в промежутках между этими областями.
Если в таком промежутке расположились коды совсем другой процедуры, то это был бы, пожалуй, наиболее простой случай. Сложнее, если в этом промежутке лежит "неизвестная область". Потому что это могут быть коды нашей изучаемой процедуры, до которых мы почему-то не добрались дизасмом. Или, наконец, в этом промежутке могут оказаться вовсе не исполняемые коды, а данные - рабочие поля, которые относятся, скорей всего, именно к этой же процедуре.
Во-вторых, на обзорном экране мы ведь тоже можем удобно посмотреть на ассемблерный текст, как бы заглянуть внутрь каждого луча. И нам совсем не обязательно делать полную распечатку асм. текста для нашей процедуры.
Будем считать, что Вы уже достаточно разобрались с основным материалом этого урока. Попробуйте теперь самостоятельно еще немного продвинуться.
Сейчас в накопленных данных у нас есть только одна процедура, ее порядковый номер 001.
Сделайте первый проход дизасма для еще одной процедуры, для библиотечной функции "strcmp". Ее адрес тоже возьмите из распечатки "Probe". Очевидно, что вторая процедура получит порядковый номер 002.
Если посмотреть общие сведения о накопленных данных по команде
ОБЩИЕ СВЕДЕНИЯ Имя проекта (---) Исследуемый Файл H:/FE/C/23/RELEASE/fe23_10.exe Найдено процедур 2 Пройдено процедур 2 Пройдено лучей 35 Найдено CALL's 0 Невыполненных заявок 0 |
В накопленных данных есть 2 процедуры и 35 лучей.
А теперь посмотрите на процедуру 002 на обзорном экране.
На странице Обзорный экран есть картинки (скриншоты), где на обзорном экране видно, сколько отдельных областей занимает процедура 002 в исполняемом EXE файле.
Главная | Загрузка | Инструкция | Карта сайта |