FE23  LOOCH  DISASM

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

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

 

НАСТРОЙКИ ДИЗАСМА

И АРИФМЕТИКА АДРЕСОВ


Содержание


1. Настройки для первого прохода дизасма

Сначала еще раз напомним, что в программе FE23 есть три вида дизассемблирования (дизасма):

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

Смотрите об этом на странице   "Основные понятия".

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

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


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

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

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

Диалог установки настроек дизасма

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


     Параметры дизасма

.z.  looch_size  512  // предельный размер луча
.z.  looch_nums  20   // предельное количество лучей
.z.  do_calls         // создавать заявки для CALL
.z.  no_asmtext       // не печатать ассемблерный текст

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


2. Настройки безопасности дизасма

Есть такая русская пословица - "Не зная броду не суйся в воду". А еще в русском языке известно и такое выражение - "Кинуться с головою в омут" ...

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

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

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

В программе FE23 не предусмотрена аварийная кнопка СТОП, но есть "настройки безопасности", которые позволяют пользователю выбрать разумный режим работы.

Это следующие два параметра:

  •  looch_size - предельный размер луча
  •  looch_nums - предельное количество лучей

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


Параметр ( looch_size ) задает предельный размер луча, выраженный в байтах. Как правило, размер луча бывает не больше 256 байт. Но иногда встречаются лучи, которые больше 4096 байт. Если размер луча окажется больше, чем значение ( looch_size ), то проход по данному лучу закончится досрочно и будет зафиксирована ошибка дизасма. При этом возможны такие сообщения:

  • ОШИБКА: Не закончена команда - конец исходных кодов
  • ОШИБКА: Нет следующей команды - конец исходных кодов

Если для ( looch_size ) задать слишком большое значение, например, 999999999, то проверка на предельный размер луча будет фактически отключена.


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

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

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

Если для ( looch_nums ) задать очень большое число, например 99999, то проверка на предельное количество лучей фактически окажется отключенной.

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

Если установить нулевое значение ( looch_nums = 0 ), то заявка по стартовой команде будет создана, но дизасм не начнется. Такая возможность в программе специально предусмотрена, иногда это может пригодиться. Созданную заявку можно увидеть в списке заявок, эта заявка будет первой в очереди заявок.


3. Флаги управления первым проходом дизасма

Теперь рассмотрим еще два параметра:

  •  do_calls   - создавать заявки по командам CALL
  •  do_asmtext - печатать ассемблерный текст

Эти параметры являются флагами (выключателями). Они могут принимать только два значения, ДА или НЕТ.


Флаг ( do_calls ) влияет на работу дизассемблера, когда обрабатывается команда CALL. Основным режимом работы является ( do_calls = ДА ).

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

Однако, для пользователя не всегда будет удобна такая автоматика. Возможно, что пользователь захочет пока отложить или вообще не делать дизасм для новых процедур. Для этого ему достаточно установить ( do_calls = НЕТ ). Тогда для новых процедур не будут создаваться заявки на дизасм. Но новые процедуры все равно будут включены в список процедур.

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


Флаг ( do_asmtext ) изменяет режим вывода в протокол во время выполнения первого прохода дизасма.

Обычно при первом проходе дизасма устанавливается ( do_asmtext = НЕТ), так как распечатки с асм. текстом лучше получать с помощью дизасма по готовым лучам.

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


4. Общие настройки для всех видов дизасма

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

  • Режим: 16 бит / 32 бита


5. Режим: 16 бит / 32 бита

При подготовке исследуемого файла к работе программа сама автоматически устанавливает режим "16 бит" или "32 бита".

Программа делит все файлы на следующие четыре типа:

  • Это не исполняемый файл - нет сигнатуры MZ
  • Это исполняемый файл - DOS - 16 бит
  • Это исполняемый файл - Win32 неизвестного типа
  • Это исполняемый файл - Win32 - PE

Если это файл типа "Win32", то устанавливается режим "32 бита", если файл типа "DOS", то режим "16 бит".

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

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

Вот пример такой печати в протоколе:


Открыт исследуемый файл 

    C:\WINNT\system32\notepad.exe
    Это исполняемый файл - Win32 - PE 
    Размер файла              = 0x0000C710  (50960) 

    Entry point virt address  = 0x01006420 
    Entry point file index    = 0x00005A20 
    Image base                = 0x01000000 
    Mode                      = 32 bits 

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

Установка режима 16/32 выполняется через командный файл. Имеются соответствующие команды, которые можно поместить в командный файл. Другого способа переключения реима 16/32 пока не сделано.

Вот так выглядят эти команды в командном файле


.z.     mode_32_bit 
.z.     mode_16_bit


6. Арифметика адресов

В программе FE23 используется три способа адресации по исследуемому файлу. Это те же способы адресации, какие применяются обычно для файлов типа "win32 PE".

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

Адрес ( RVA ) , относительный виртуальный адрес (relative virtual address). Такие адреса испольуются в заголовке PE файла. Например, в заголовке есть адрес ( RVA ) для точки входа в программу (начальный адрес исполняемых кодов). Эти адреса бывают на практике удобнее виртуальных адресов ( vir_addr ) хотя бы из-за того, что адреса ( RVA ) обычно выглядят короче.

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

Адрес ( file_idx ) , индекс по файлу. Это просто порядковые номера байтов в файле, начиная с нуля. Если на содержимое исполняемого файла смотреть через какой-нибудь просмотрщик или редактор, то обычно бывают подписаны именно такие адреса.

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


    RVA      = 0001BBB0    
    vir_addr = 0041BBB0    
    file_idx = 0001AFB0    

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

Если заглянуть в заголовок PE файла (распечатку для заголовка легко получить в помощью программы FE23), то можно найти в этом заголовке значение для константы ( image_base ). Эта константа является базовым адресом для загрузки исполняемого PE файла в оперативную память. Константа ( image_base ) - это разность между адресом ( vir_addr ) и адресом ( RVA ).


    vir_addr = RVA + image_base    

Связь между адресами ( RVA ) и ( file_idx ) более сложная. Так как разность ( diff ) между этими адресами будет своя для каждой секции PE файла. Но в пределах одной секции эта разность будет постоянной.


    RVA = file_idx + diff    

Конечно пользователю не потребуется вручную пересчитывать адреса. Вся эта арифметика (вместе с логикой) заложена в программу FE23. Но пользователю при задании адреса нужно всегда четко знать, какой адрес он задает - или ( RVA ), или ( vir_addr ), или ( file_idx ).


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

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

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

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

В этом диалоге есть три окошка для задания адреса. Над каждым окошком подписано, какой именно адрес можно задать в этом окошке - или ( RVA ), или ( vir_addr ), или ( file_idx ). Доступным может быть только одно окошко из трех. Чтобы выбрать нужное окошко, требуется нажать кнопку "Use" напротив этого окошка.

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

Из диалога можно выйти по кнопке "OK" только в том случае, когда задано корректное значение адреса для исследуемого файла. То есть, заданное значение принадлежит одной из секций PE файла.

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


8. Задание адреса в командном файле

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


.z.   use          RVA
.z.   start_addr   0001BBB0

.z.   use          vir_addr
.z.   start_addr   0041BBB0

.z.   use          file_idx
.z.   start_addr   0001AFB0

Команда ( start_addr ) запускает первый проход дизасма, начиная с указанного адреса. Адрес (шестнадцатеричное число) помещается именно в эту команду как аргумент.

Предшествующая команда ( use ) определяет, как этот адрес трактовать. Эта команда должна встретиться где-то в командном файле непременно раньше команды ( start_addr ).

Если в командном файле есть несколько команд ( start_addr ) с разными значениями адреса, то команда ( use ) может быть только одна - где-нибудь раньше, ближе к началу файла. Все адреса в этом случае будут трактоваться одинаково.




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

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



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


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