FE23  LOOCH  DISASM

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

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

 

ОСНОВНЫЕ ПОНЯТИЯ

ПЕРВАЯ СТРАНИЦА ИНСТРУКЦИИ
АЗБУКА ПРОГРАММЫ


Это начало инструкции по работе с программой FE23.
Самая первая страница инструкции.
Начинать знакомиться с программой следует отсюда.

Здесь изложены основные вопросы идеологии программы FE23.



1. Что такое луч

Еще в эпоху первых ЭЦВМ (электронная цифровая вычислительная машина) при программирования стали выделять линейные участки исполняемых кодов. Такие участки кодов, внутри которых нет команд передачи управления. Команда передачи управления в линейном участке может быть только последней командой в этом участке. А передача управления на линейный участок может приходить только на первую команду этого участка.

Линейные участки кодов в русскоязычной технической литературе стали называть лучами - по первым буквам этих двух слов "Линейный УЧасток". Получился очень удачный термин, лучом называется участок кодов, который прямой, как луч, без каких-либо ответвлений.

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

При "первом проходе дизасма" (про этот термин см. ниже) создаются списки лучей для исследуемой программы.

Когда при разработке программы FE23 подбирались тексты для английского варианта, то возникли трудности с переводом слова "луч" на английский язык. Так как из сочетаний слов "linear stretch", "straight line" или им подобных никак не удавалось получить сокращение, похожее на "ray" или "beam". В итоге было решено записать русское слово "луч" английскими буквами - "looch". Затем это слово вошло и в название программы - "FE23 Looch Disasm".


2. Почему дизассемблер интерактивный

Общие принципы работы с программой FE23 получились такие. Исследование исполняемого файла проводит пользователь. А программа FE23 - это всего лишь инструмент пользователя (скорей всего - один из инструментов).

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

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

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

В этом и заключается смысл понятия - "интерактивный дизассемблер".


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

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

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

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

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

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

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

Имеется гибкая система управления первым проходом дизасма. Есть несколько разных команд в главном меню для запуска дизасма (группа команд "Start") и есть несколько настроек параметров дизасма.


4. Процедуры и функции

Термины "процедура" и "функция" по-разному трактуются в разных языках программирования. В первом языке программирования высокого уровня, языке ALGOL (1960 год), созданном математиками, а не программистами, понятия "процедура" и "функция" существенно отличались. В дальнейшем, под этими терминами часто стали понимать одно и то же (например в языке C).

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

Программа FE23 регистрирует все найденные процедуры и составляет список процедур. При этом каждой процедуре присваивается порядковый номер - 001, 002, 003 и так далее (числа десятичные).

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

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

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

Если исследуемая программа написана на языке высокого уровня, то процедура действительно может иметь только один вход. И нет никакой возможности с помощью какого-нибудь оператора типа "goto" попасть в процедуру сразу в ее середину. Более того, никакой участок кодов (и, значит, никакой луч) не может принадлежать одновременно сразу двум разным процедурам.

Однако, если исследуемая программа была написана на языке ассемблера, то программист, разработавший эту программу, мог позволить себе любые вольности, любое нарушение "правил хорошего тона" - структурного программирования.

На странице   "Быстрый старт. Урок четвертый"   есть пример такого случая, когда несколько лучей принадлежат сразу двум процедурам. И там показано, как программа FE23 справляется с подобными случаями. (Примечание. Эта страница пока еще не приготовлена.)


5. Накопленные данные

В процессе выполнения первого прохода дизасма собираются данные по исследуемой программе. Мы будем называть их "Накопленные данные".

Основу накопленных данных составляют следующие списки:

  • Список лучей
  • Список процедур
  • Список вызовов CALL

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

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

Примеры можно найти на этих страницах:
  "Быстрый старт. Урок второй"  
  "Быстрый старт. Урок третий"  

Накопленные данные можно сохранить - записать в файл. Как это сделать рассказано на странице:   "Работа с проектами".   Тогда при исследовании некоторого файла не придется каждый раз заново выполнять первый проход дизасма.

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


6. Стратегия выполнения первого прохода дизасма

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

Назовем, для примера, возможные три задачи, в порядке нарастания сложности.

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

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

Задача 1

Здесь требуется сделать первый проход дизасма только для одной процедуры, для той, которая нужна пользователю. Для этого в главном меню нужно выбрать команду ( Start --> Address ) и задать адрес входа в процедуру в появившемся диалоге.

И это все. После выполнения первого прохода дизасма можно получить желаемые распечатки для изучения процедуры.

Пример решения такой задачи есть на странице   "Быстрый старт. Урок второй".

Задача 2

Конечно, для начала стоит посмотреть на распечатки заголовка файла. В частности, на таблицу импортируемых функций. (Мы полагаем что исследуемый файл имеет тип "win32 PE").

Затем приступить к выполнению первого прохода дизасма и пройти в автоматическом режиме все, что получится.

Эта задача будет совсем простой при условии, что в заголовке PE файла указан адрес точки входа. Тогда можно стартовать первый проход дизасма от точки входа. В главном меню программы FE23 есть подходящая команда - это команда ( Start --> Entry Point ).

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

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

Пример есть на странице   "Быстрый старт. Урок третий".

Задача 3

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

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

Однако, для дальнейшего продвижения по кодам придется пользователю проявить свои интеллектуальные способности.

Хотя программа FE23 (версия 1.0) все же сможет кое-что подсказать. Во-первых, в распечатке списка вызовов CALL следует обратить внимание на вызовы типа "unknown", И потом посмотреть на эти места в распечатке ассемблерного текста (асм. текста). Во-вторых, в конце распечатки схемы лучей и переходов могут быть сообщения про линии переходов, которые не показаны на схеме из-за того, что адрес перехода равен нулю. И тогда тоже нужно смотреть асм. текст.

И это пока все, что может дать данная версия программы FE23 для подобных сложных случаев.


7. Три вида дизасма

В программе FE23 есть три разных вида дизассемблирования (дизасма):

  • Первый проход дизасма
  • Дизасм по готовым лучам
  • Сплошной дизасм

Используется один и тот же дизассемблер для всех трех видов дизасма. Но процесс дизасма организован существенно по-разному для разных видов.

С первым проходом дизасма мы уже достаточно познакомились. Теперь рассмотрим коротко два других вида дизасма.


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

Есть несколько команд в главном меню, по которым на экран выводится асм. текст по готовым лучам. Основные команды такие:

Команда ( Show --> All Asm_Text ) - выводится распечатка с асм. текстом для всех лучей из списка лучей, то есть, для всех тех лучей, которые уже были пройдены при первом проходе дизасма. Эту команду можно использовать только в том случае, когда пройдено не очень много лучей.

Команда ( Cluster --> Asm_Text ) - выводится распечатка с асм. текстом для одной или нескольких процедур. О кластерах смотрите ниже.


"Сплошной дизасм" - это обычный дизасм, при котором проходятся все коды подряд без выделения лучей. В программе FE23 этот вид дизасма используется как вспомогательный. Никакие данные при таком дизасме не накапливаются.

Имеется только одна команда в главном меню для сплошного дизасма, это команда ( Task --> Solid Disasm ). Пользователь должен задать начальный адрес и размер участка кодов.


8. Кластеры из процедур

В переводе с английского слово "cluster" означает "кисть", "пучок", "гроздь". Слово кластер имеет несколько разных употреблений в компьютерных технологиях.

В программе FE23 термином "кластер" (cluster) названа группа из таких процедур, которые тесно взаимодействуют между собой. И поэтому такие процедуры удобнее изучать вместе.


Прежде чем говорить о кластерах, мы сначала вспомним, как вообще создаются большие программы.

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

В учебниках по программированию можно увидеть такой совет. Каждую процедуру предлагается помещать в отдельный исходный файл. Так тоже неудобно. И программисты обычно так не делают.

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

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

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

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


А теперь вернемся к разговору о кластерах.

Для чего нам полезно объединять процедуры в группы, мы уже достаточно обосновали. В программе FE23 такие группы из процедур названы кластерами.

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

Для всего кластера (из одной или из нескольких процедур) можно делать общие распечатки. Для этого есть команды в главном меню: распечатка ассемблерного текста ( Cluster --> Asm_Text ), распечатка графической схемы лучей и переходов между лучами ( Cluster --> Diagram ).

Новый кластер можно создать прямо в этих же командах, если в появившемся диалоге задать имя еще не существующего кластера. Но можно воспользоваться для этого и отдельной командой ( Cluster --> New ).

Посмотреть, какие кластеры уже были созданы можно по команде ( Cluster --> Show ).

Примеры работы с кластерами есть на странице   "Быстрый старт. Урок второй".


9. Обзорный экран

Основная идея обзорного экрана очень простая и понятная. У нас есть исследуемый исполняемый файл (EXE или еще какой) и мы хотим иметь просмотрщик, который нам сразу все покажет про этот файл.

Наверняка многие любопытные пользователи пробовали заглянуть в EXE файл по третьей кнопке - кнопке "F3" - популярного файлового менеджера Norton Commander. И пытались при этом по обрывкам текста в правой колонке экрана хоть что-нибудь узнать об этом файле, о чем-то догадаться. Хотя бы примерно распознать, где здесь коды, а где данные.

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

Именно эта идея оказалась той основой и той причиной, что в итоге и привело к появлению обзорного экрана в программе FE23.

В настоящей версии программы на обзорном экране отображается содержимое только секции исполняемых кодов.

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

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

Заглянуть действительно можно. На обзорном экране можно сразу посмотреть на асм. текст для каждого луча.

О том, как работать с обзорным экраном, рассказано на странице   "Обзорный экран".   Там же, в самом начале этой страницы, есть картинки (скриншоты) с общим видом обзорного экрана.




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

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



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


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