FE23  LOOCH  DISASM

ДИЗАССЕМБЛЕР
ДЛЯ ИССЛЕДОВАНИЯ ПРОГРАММ

(empty)
Главная Загрузка Инструкция Карта сайта

 

БЫСТРЫЙ СТАРТ

УРОК ВТОРОЙ


Содержание


1. Постановка учебной задачи

Для первого учебного дизассемблирования мы поставим перед собой совсем простую цель. Предположим, что каким-то способом с помощью какого-то иного инструмента (например, отладчика) мы нащупали в исследуемой большой программе начало некоторой процедуры. То есть, мы уже знаем адрес входа в эту процедуру. И теперь мы хотим побольше узнать о самой этой процедуре. Для этого нам нужно иметь хотя бы распечатку ассемблерного текста.

Для решения этой задачи мы воспользуемся программой FE23. Мы получим требующуюся распечатку (имеется в виду "распечатка" на экране). Мы хотя бы оценим для начала большая это процедура или маленькая. А еще программа FE23 нарисует нам блок схему - покажет все переходы внутри этой процедуры, так что мы увидим, насколько сложна логика этой процедуры.


2. Программа FE23 помогает исследовать файл ( fe23.exe )

Учебная задача поставлена. В качестве исследуемого файла мы опять возьмем файл ( fe23.exe ). Опять попросим программу FE23 исследовать самое себя.

Для начала возьмем какую-нибудь совсем простую процедуру. Возьмем процедуру из библиотеки стандартных процедур, эти библиотечные процедуры обычно включаются в исполняемые EXE файлы, и файл ( fe23.exe ) здесь не является исключением.

Но вот вопрос, как найти эти процедуры в EXE файле, где взять для них начальные адреса. Поскольку задача учебная, Вы, должно быть, ожидаете подсказки. И правильно делаете.

Нам подскажет сама программа FE23. Такие подсказки есть в распечатке, которую мы получим по команде ( Probe --> Probe ) главного меню. (Кстати заметим, что английское слово "Probe" очень похоже на русское "Проба", причем похоже не только внешне, но и по смыслу - можете проверить это по словарю).

Мы воспроизведем здесь эту распечатку (с небольшими сокращениями).

Внимание. Распечатка была получена для версии 1.0, файл ( fe23_10.exe ), сборка: 02.06.2010. Воможно, что в том файле программы 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" из Вашей распечатки. Для Вашей версии файла ( fe23.exe ) этот адрес может оказаться другим.


3. Подготовка к исследованию файла

Делаем подготовку к исследованию файла. Повторяем те действия, о которых было рассказано ранее на первом уроке:   "Быстрый старт. Урок первый".

(1) Программа FE23 уже запущена. Никакого дизасма мы пока не делали, никаких накопленных данных еще нет.

(2) По команде ( File --> File to Exam ) установлено дежурное имя для исследуемого файла, это файл ( fe23.exe ).
( Или, быть может, ( fe23_10.exe ). Или иное имя, если у Вас более новая версия программы FE23. )

(3) По команде ( Task --> Exam Prepare ). наш исследуемый файл приготовлен к работе. В учебных целях мы эту команду выполним заранее. Хотя подготовка исследуемого файла и сама бы автоматически выполнилась, лишь только мы дадим первый раз команду на дизасм.

(4) По команде ( Show --> General Data ) смотрим общие сведения, проверяем текущую ситуацию. По полученной в ответ коротенькой распечатке мы видим, что нужный нам исследуемый файл приготовлен, накопленных данных еще нет.


ОБЩИЕ СВЕДЕНИЯ 

    Имя проекта           (---)
    Исследуемый Файл      H:/FE/C/23/RELEASE/fe23_10.exe

      (других данных нет)


4. Настройки дизасма

Прежде, чем мы начнем делать дизассемблирование (дизасм), нам нужно установить значения для нескольких параметров.

Поскольку наша учебная работа называется "Быстрый старт", мы сейчас не будем углубляться в подробное разбирательство, зачем нужны эти настройки и как их выбирать. Скажем только самое основное и необходимое.

А всю дополнительную информацию Вы сможете потом прочитать на странице   "Настройки дизасма и арифметика адресов".

А пока установите вот такие настройки дизасма:


Параметры дизассемблирования 
    Предельный размер луча       = 512
    Предельное количество лучей  = 20
    Создавать заявки для CALL    = ДА
    Печатать ассемблерный текст  = НЕТ

Чтобы сделать установку настроек вызовите из главного меню диалог для установки настроек, это команда ( Start --> Disasm Settings ). В этом диалоге все достаточно понятно без дополнительных пояснений.

А показанная выше табличка с настройками печатается в протоколе по команде ( Start --> Show Disasm Settings ).

Ну, а теперь, если хотите, вот короткие пояснения по этим четырем параметрам.

(1) Предельный размер луча (количество байт) мы выбираем с таким расчетом, что мы не встретим в данном исследуемом файле лучей большего размера. Если некоторый луч все же окажется больше, то дизассемблер не сможет дойти до конца луча и сообщит об ошибке при дизасме. Повторить дизасм для этого луча нельзя (так сейчас сделано в программе). Придется начинать все с начала.

(2) Предельное количество лучей - это то количество лучей, которое дизассемблер проходит за один раз. Если задано мало лучей, то дизасм остановится и останутся невыполненные заявки (они будут напечатаны в протоколе). Это не страшно. Для продолжения дизасма нужно просто дать команду на продолжение ( Start --> Continue ).

Эти два параметра являются параметрами безопасности. Для них можно установить значения 999999999. Но при этом можно вляпаться в неприятную ситуацию, когда придется очень долго ждать окончания бессмысленной работы дизассемблера.

(3) Создавать заявки для CALL или не создавать - это зависит от тех целей, для которых выполняется дизасм.

Для нашего конкретного случая значение этого параметра безразлично, так как в той процедуре, которую мы сейчас будем проходить дизасмом, вообще нет ни одного вызова CALL.

(4) Печатать ассемблерный текст или не печатать - это зависит от желания пользователя.

Для нашего конкретного случая вполне можно включить из любопытства эту печать, так как наша исследуемая процедура небольшая. Но основную печать ассемблерного текста (асм. текста) мы все равно сделаем позже по готовым лучам.


5. Первый проход дизасма

Первый проход дизасма - это название одного из трех видов дизасма в программе FE23. Для этого вида дизасма основная цель - не получение распечатки с асм. текстом, а выделение в исследуемом файле участков кодов, занимаемых лучами и процедурами.

После того, как выполнен первый проход дизасма, мы сможем получить в программе FE23 распечатки для нужных нам конкретных процедур. Это будет уже совсем другой вид дизасма - дизасм по готовым лучам.

За дальнейшими объяснениями обратитесь к странице:   Основные понятия.   Сейчас Вы можете пока не отвлекаться. Но потом обязательно посмотрите, что в программе FE23 названо как "Первый проход дизасма".

Итак, мы приступаем к дизасму для процедуры "strlen" из стандартной библиотеки. Мы уже знаем начальный адрес 00417230 для этой процедуры. Это виртуальный адрес.

В программе FE23 применяются три способа адресации:

  •  RVA      - относительный виртуальный адрес
  •  vir_addr - виртуальный адрес
  •  file_idx - индекс по исследуемому файлу

Об этом Вы сможете потом прочитать на странице   Настройки дизасма и арифметика адресов

А сейчас Вам будет нужно задать именно виртуальный адрес.

Из главного меню мы даем команду ( Start --> Address ). По этой команде будет запущен первый проход дизасма, начиная с адреса, указанного пользователем.

Поэтому сначала появляется диалог для задания адреса.

Диалог для задания адресов

В этом диалоге нужно нажать кнопку "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 лучей. Но не спешите, мы пока еще не знаем сколько в этой процедуре получилось лучей на самом деле.

Даем команду ( Show --> General Data ), чтобы узнать общие сведения о накопленных данных, полученных в результате дизасма. Теперь по этой команде будет более полная распечатка, чем были прежние.


ОБЩИЕ СВЕДЕНИЯ 

    Имя проекта           (---)
    Исследуемый Файл      H:/FE/C/23/RELEASE/fe23_10.exe
    Найдено процедур      1
    Пройдено процедур     1
    Пройдено лучей        14
    Найдено CALL's        0
    Невыполненных заявок  0

К этой распечатке нужны небольшие комментарии.

(1). Всего лучей оказалось 14, а не 13. Как правило, именно так и выходит, лучей получается в итоге больше, чем было пройдено. Потому что после того, как луч уже был пройден, выясняется, что некая команда передачи управления ведет внутрь луча. И тогда из этого луча приходится делать два луча.

(2). В дальнейшем Вы узнаете, что "найденная" процедура может быть еще не пройдена дизасмом. Процедура отмечается как "пройденная", если хотя бы один луч этой процедуры уже пройден дизасмом.

(3). Инструкций CALL нам не встретилось. Из этой исследуемой процедуры не вызываются другие процедуры. (Об этом мы выше уже упоминали).


Итак, первую часть поставленной задачи мы уже выполнили. Мы уже прошли дизасмом одну отдельную процедуру, для которой мы "откуда-то со стороны" узнали начальный адрес.

Далее мы будем делать вторую часть нашей учебной задачи. Нам нужно подготовить распечатки для изучения данной процедуры. (Хотя само это изучение случайно взятой библиотечной функции в наши планы конечно не входит).


6. Распечатка ассемблерного текста

Нам нужно получить удобную распечатку с ассемблерным текстом (асм. текст) для изучения нашей процедуры. Чтобы получить такую распечатку мы еще раз выполним дизасм. Такой вид дизасма в программе FE23 называется "дизасм по готовым лучам".

Сейчас в накопленных данных, а говоря точнее, в списке лучей у нас есть лучи только той одной процедуры, для которой мы уже сделали первый проход дизасма. Поэтому мы воспользуемся той командой, которая делает распечатку асм. текста для всех имеющихся лучей, то есть, для всех лучей, какие есть в списке лучей. Это команда ( Show --> All Asm_Text ). Лучи в списке лучей расположены в порядке возрастания адресов. В этом же порядке у нас получится и распечатка асм. текста.

Обратите внимание, что этой командой не следует пользоваться тогда, когда в списке будет слишком много лучей. Потому что есть еще и другие команды в главном меню. (Что такое "много" - это каждый пользователь решает для себя сам.)

Распечатка появится в отдельном окне программы 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 лучей.

Здесь лучи идут сплошным массивом, между ними нет пропущенных байтов. Если бы такие пропуски были, они были бы показаны на распечатке. Вы увидете это на распечатках других процедур.


7. Распечатка схемы лучей и переходов между лучами

Теперь получим распечатку со схемой. Фактически это блок-схема процедуры. На ней показаны все передачи управления между лучами.

Опять воспользуемся такой командой, которая дает нам схему для всех лучей, имеющихся в списке лучей. Это команда ( Show --> All Diagram ).

Еще раз напомним, что командами этой группы не следует пользоваться тогда, когда в списке будет слишком много лучей.

Распечатка появится в отдельном окне программы FE23.

СХЕМА ВСЕХ ЛУЧЕЙ И ПЕРЕХОДОВ ---------------- 001-001 00417230 <<<<<<<<<<<<<<<<<<<<<< ENTER [ ] [ JCC ] >>>>>>O 00417250 . . . . v 001-002 0041723C <<<O v [ ] ^ v [ JCC ] >>>+>>+>>>>>>>>>>>O 00417283 . . . . ^ v v 001-003 00417243 ^ v v [ ] ^ v v [ JCC ] >>>O v v 0041723C . . . . v v 001-004 0041724B v v [ ] v v [ ANY ] v v 001-005 00417250 <<<O<<O<<<<<O v [ ] ^ ^ v [ JCC ] >>>O ^ v 00417250 . . . . ^ v 001-006 00417268 ^ v [ ] ^ v [ JCC ] >>>>>>>>>>>>+>>O v 004172A1 . . . . ^ v v 001-007 0041726F ^ v v [ ] ^ v v [ JCC ] >>>>>>>>>O ^ v v 00417297 . . . . v ^ v v 001-008 00417273 v ^ v v [ ] v ^ v v [ JCC ] >>>>>>O v ^ v v 0041728D . . . . v v ^ v v 001-009 0041727A v v ^ v v [ ] v v ^ v v [ JCC ] >>>O v v ^ v v 00417283 . . . . v v v ^ v v 001-010 00417281 v v v ^ v v [ ] v v v ^ v v [ JMP ] >>>+>>+>>+>>O v v 00417250 -------- v v v v v 001-011 00417283 <<<O<<+<<+<<<<<+<<O [ ] v v v [ RET ] >>>>>>+>>+>>>>>+>>>>>> RETURN -------- v v v 001-012 0041728D <<<<<<O v v [ ] v v [ RET ] >>>>>>>>>+>>>>>+>>>>>> RETURN -------- v v 001-013 00417297 <<<<<<<<<O v [ ] v [ RET ] >>>>>>>>>>>>>>>+>>>>>> RETURN -------- v 001-014 004172A1 <<<<<<<<<<<<<<<O [ ] [ RET ] >>>>>>>>>>>>>>>>>>>>>> RETURN -------- pass by 004172AB [ ] ---------------- Предельное число вертикалей 20 Всего занято вертикалей 6 КОНЕЦ СХЕМЫ ЛУЧЕЙ

Сделаем некоторые пояснения.

(1) На схеме показаны все 14 лучей, имеющихся в списке лучей.

(2) Каждый луч показан условным значком в виде прямоугольника. Линия перехода с другого луча может "входить" в данный луч в верхней части этого значка - то есть, в начало луча. И может "выходить" из луча в нижней части значка, в конце луча.

(3) Для каждого луча, перед адресом луча, слева указаны два номера - порядковый номер процедуры, которой принадлежит данный луч, и порядковый номер луча в списке лучей.

(4) В нижней части луча указано, какой командой заканчивается луч. Слово JCC - это условная передача управления. Слово ANY означает "другая команда", не команда передачи управления.

(5) Возле правого края распечатки показан адрес, куда ведет переход из данного луча. В этой же колонке будут показаны адреса (и имена) вызываемых процедур, если в луче будут встречаться команды CALL - команды вызова процедур.


Примечание

Если логика процедуры будет очень сложная, то на схеме будет занято намного больше позиций для вертикальных линий. В результате не останется места для правой колонки с адресами переходов и адресами (или именами) вызываемых процедур.

В подобных случаяъ может помочь еще одна команда меню, которая имеется в этой же группе команд - ( Show --> All Looches ). По этой команде печатается такая же схема лучей, но не печатаются линии переходов. Поэтому здесь всегда останется место для адресов и для имен вызываемых процедур, даже для очень длинных имен.

Вы прямо сейчас можете попробовать дать команду ( Show --> All Looches ).


8. Ассемблерный текст на обзорном экране

Теперь мы обратимся к обзорному экрану. Посмотрим, как выглядит на нем наша процедура 001.

Из главного меню даем команду ( Survey --> Survey ).

На странице   "Обзорный экран"   есть две картинки (скриншоты), которые соответствуют нашему учебному уроку, это рисунки 2 и 3 в самом начале этой страницы. Картинки получены после того, как первый проход дизасма был сделан только для одной процедуры 001.

Мы не будем повторять здесь эти рисунки. И не будем повторять пояснения к этим рисункам. Для того, чтобы использовать обзорный экран, все-таки стоит прочитать соответствующую страницу инструкции -   "Обзорный экран",   чтобы было легче с этим экраном разобраться.

А здесь мы поговорим немного о другом. Обсудим, какая нам может быть польза от того, что мы увидим интересующую нас процедуру на обзорном экране.

Во-первых, стоит посмотреть, как расположена данная процедура в исполняемом EXE файле. Занимает ли эта процедура одну сплошную область кодов, или изучаемая процедура разделилась на две и более областей. И тогда сразу вопрос - а что находится в промежутках между этими областями.

Если в таком промежутке расположились коды совсем другой процедуры, то это был бы, пожалуй, наиболее простой случай. Сложнее, если в этом промежутке лежит "неизвестная область". Потому что это могут быть коды нашей изучаемой процедуры, до которых мы почему-то не добрались дизасмом. Или, наконец, в этом промежутке могут оказаться вовсе не исполняемые коды, а данные - рабочие поля, которые относятся, скорей всего, именно к этой же процедуре.

Во-вторых, на обзорном экране мы ведь тоже можем удобно посмотреть на ассемблерный текст, как бы заглянуть внутрь каждого луча. И нам совсем не обязательно делать полную распечатку асм. текста для нашей процедуры.


9. Продолжение учебной работы

Будем считать, что Вы уже достаточно разобрались с основным материалом этого урока. Попробуйте теперь самостоятельно еще немного продвинуться.

Сейчас в накопленных данных у нас есть только одна процедура, ее порядковый номер 001.

Сделайте первый проход дизасма для еще одной процедуры, для библиотечной функции "strcmp". Ее адрес тоже возьмите из распечатки "Probe". Очевидно, что вторая процедура получит порядковый номер 002.

Если посмотреть общие сведения о накопленных данных по команде ( Show --> General Data ), то должно получиться так:


ОБЩИЕ СВЕДЕНИЯ 

    Имя проекта           (---)
    Исследуемый Файл      H:/FE/C/23/RELEASE/fe23_10.exe
    Найдено процедур      2
    Пройдено процедур     2
    Пройдено лучей        35
    Найдено CALL's        0
    Невыполненных заявок  0

В накопленных данных есть 2 процедуры и 35 лучей.

А теперь посмотрите на процедуру 002 на обзорном экране.

На странице   Обзорный экран   есть картинки (скриншоты), где на обзорном экране видно, сколько отдельных областей занимает процедура 002 в исполняемом EXE файле.

 




Все страницы инструкции

Основные понятия
Главное меню программы
Обзорный экран
Командный файл
Работа с проектами
 
Быстрый старт. Урок первый
Быстрый старт. Урок второй
Быстрый старт. Урок третий
 
Файлы, используемые в программе
Протокол работы и распечатки
Настройки дизасма и арифметика адресов



Главная Загрузка Инструкция Карта сайта


  Rambler's Top100
Copyright (C) FE23 Looch Disasm, 2010
File          - disa32.htm
File created  - 13 Apr 2010
Last modified - 08 Jul 2010
Hosted by uCoz