Реверс-инжиниринг прошивки устройства на примере мигающего «носорога». часть 1

Регулярные выражения без боя

Существует довольно много программ для быстрого составления регулярных выражений, например, RegexBuddy. В онлайне такие решения тоже есть. Правда, по большей части это простые сервисы для проверки регеспов, причем строго определенных типов. Из толпы выдется очень добротная онлайн-тулза RegExr (www.gskinner.com/RegExr), реализованная в виде Flex-приложения. В чем ее фишка? Благодаря Flex’у удалось сделать очень удобный и быстрый интерфейс. Ты можешь писать регулярное выражение в одном поле и тут же в реальном времени отслеживать, как оно работает в другом. Для любой конструкции выводится описание того, что она делает и как используется.

В результате регулярку могут составить даже те, кто вообще не знает теории. Мало того, при наведении на любой из элементов регеспа сервис отображает, что именно он делает. Обалденная опция на случай, если необходимо разобраться, что делает громоздкое выражение, которое когда-то давно составил ты сам или вообще другой человек. Любое выражение можно сохранить на потом, добавив ее во внутреннюю базу RegExr’а. Благодаря этой возможности в базе даже сейчас есть большое количество готовых регеспов на многие случаи жизни. А значит, вместо того чтобы ковыряться самому, можно взять уже готовое чужое решение, отыскав его по ключевым словам, а потом сразу же проверить в действии с нужными входными данными. Кстати говоря, большая библиотека регулярных выражений также располагается на www.regexlib.com.

Дизассемблер

Помимо прочего, proview phpp — это еще и дизассемблер. Допускается выбрать опции для дизассемблирования, а также выбрать цветовую схему листинга, наиболее привычную по одной из известных программ (SoftICE, IDA, W32Dasm, Ollydbg). Но, увы, получить дизассемблированный код получится для файлов не более 100 Кб. Чтобы обойти это неприятное ограничение, рекомендую взглянуть на более современный сервис — Pym’s online disassembler (pyms86.appspot.com), построенный на базе Google App Engine.

Первый плюс в том, что можешь анализировать не только целый файл, но и отдельные HEX-дампы. Проекту по зубам 64-битные приложения, причем для анализа используются Python-библиотеки Pym (code.google.com/p/pymsasid), pefile (code.google.com/p/pefile) и networkx (networkx.lanl.gov), которые очень прогрессивно развиваются. Возможно, в будущем мы расскажем, как собрать свой особенный сервис для самостоятельного дизассемблирования.

Склеивающие инструкции

Комбинацию ZZ XX – мы будем называть склеивающей инструкцией. Склеивающая инструкция нужна, во-первых, для стыковки скрытых инструкций, которые располагаются в соседних маскирующих инструкциях и, во-вторых, для выполнения первого необходимого условия, озвученного в начале статьи: инструкции обеих цепочек всегда должны пересекаться друг с другом (поэтому склеивающая инструкция всегда находится на пересечении двух маскирующих инструкций).

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

Приведённое описание техники перекрытия проиллюстрировано на следующем рисунке. Если выполнение начинается с начальных байтов (XX), то активируется маскирующая цепочка инструкций. А если с байтов YY – активируется скрытая цепочка инструкций.

Проверка на устройстве

Кратко: проверим отдельные предположения на работающем устройствеСтатический анализsub_8005234x_bluetooth_send

  • – возвращает «ОК», включает эхо-режим – команда дублируется отправителю;
  • – выключает эхо-режим;
  • – возвращает «mur-mur (>._.<)\r\n » — то ли пасхалка, то ли отладочная команда;
  • — выключает один из ярких светодиодов;
  • – возвращает «ОК»;
  • — однократно мигает красным светодиодом;
  • – возвращает «ERROR: Not auth!»
  • – возвращает «ERROR: Not auth!»
  • – возвращает «ERROR: auth error!»
  • – возвращает «ERROR: Not auth!»
  • — возвращает «Wrong won’t give up!»
  • команда состоит минимум из 4 символов;
  • есть довольно странные команды, как-то связанные с авторизацией (зачем авторизация на осветительном приборе?).

Parameters

The following options are available for .exe, .dll, .obj, .lib, and .winmd files.

Option Description
/out= Creates an output file with the specified , rather than displaying the results in a graphical user interface.
/rtf Produces output in rich text format. Invalid with the /text option.
/text Displays the results to the console window, rather than in a graphical user interface or as an output file.
/html Produces output in HTML format. Valid with the /output option only.
/? Displays the command syntax and options for the tool.

The following additional options are available for .exe, .dll, and .winmd files.

Option Description
/bytes Shows actual bytes, in hexadecimal format, as instruction comments.
/caverbal Produces custom attribute blobs in verbal form. The default is binary form.
/linenum Includes references to original source lines.
/nobar Suppresses the disassembly progress indicator pop-up window.
/noca Suppresses the output of custom attributes.
/project Displays metadata the way it appears to managed code, instead of the way it appears in the native Windows Runtime. If is not a Windows metadata (.winmd) file, this option has no effect. See .NET Framework Support for Windows Store Apps and Windows Runtime.
/pubonly Disassembles only public types and members. Equivalent to /visibility:PUB.
/quoteallnames Includes all names in single quotes.
/raweh Shows exception handling clauses in raw form.
/source Shows original source lines as comments.
/tokens Shows metadata tokens of classes and members.
/visibility: Disassembles only types or members with the specified visibility. The following are valid values for :PUB — PublicPRI — PrivateFAM — FamilyASM — AssemblyFAA — Family and AssemblyFOA — Family or AssemblyPSC — Private Scope For definitions of these visibility modifiers, see MethodAttributes and TypeAttributes.

The following options are valid for .exe, .dll, and .winmd files for file or console output only.

Option Description
/all Specifies a combination of the /header, /bytes, /stats, /classlist, and /tokens options.
/classlist Includes a list of classes defined in the module.
/forward Uses forward class declaration.
/headers Includes file header information in the output.
/item: ] Disassembles the following depending upon the argument supplied: — Disassembles the specified .- Disassembles the specified of the .- Disassembles the of the with the specified signature . The format of is: [] (, , …, )Note In the .NET Framework versions 1.0 and 1.1, must be followed by a closing parenthesis: . Starting with the Net Framework 2.0 the closing parenthesis must be omitted: .
/noil Suppresses IL assembly code output.
/stats Includes statistics on the image.
/typelist Produces the full list of types, to preserve type ordering in a round trip.
/unicode Uses Unicode encoding for the output.
/utf8 Uses UTF-8 encoding for the output. ANSI is the default.

The following options are valid for .exe, .dll, .obj, .lib, and .winmd files for file or console output only.

Option Description
/metadata Shows metadata, where is:MDHEADER — Show the metadata header information and sizes.HEX — Show information in hex as well as in words.CSV — Show the record counts and heap sizes.UNREX — Show unresolved externals.SCHEMA — Show the metadata header and schema information.RAW — Show the raw metadata tables.HEAPS — Show the raw heaps.VALIDATE — Validate the consistency of the metadata. You can specify /metadata multiple times, with different values for .

The following options are valid for .lib files for file or console output only.

Option Description
/objectfile= Shows the metadata of a single object file in the specified library.

Note

All options for Ildasm.exe are case-insensitive and recognized by the first three letters. For example, /quo is equivalent to /quoteallnames. Options that specify arguments accept either a colon (:) or an equal sign (=) as the separator between the option and the argument. For example, /output: filename is equivalent to /output= filename.

Литература и веб ресурсы

Beginners

  1. Абель П. Язык Ассемблера для IBM PC и программирования. – М.: Высшая школа, 1992. – 447 с.
  2. Брэдли Д. Программирование на языке ассемблера для персональной ЭВМ фирмы IBM.– М.: Радио и связь, 1988. – 448 с.
  3. Галисеев Г.В. Ассемблер IBM PC. Самоучитель.: – М.: Издательский дом «Вильямс», 2004. – 304 с.: ил.
  4. Дао Л. Программирование микропроцессора 8088. – М.: Мир, 1988. – 357 с.
  5. Жуков А.В., Авдюхин А.А. Ассемблер. – Спб.: БХВ-Петербург, 2003. – 448 с.: ил.
  6. Зубков С.В., Ассемблер для DOS, Windows и UNIX. – М.: ДМК Пресс, 2000. – 608 с.: ил. (Серия «Для программистов»).
  7. Ирвин К. Язык ассемблера для процессоров Intel, 4-е издание.: пер. с англ. – М.: Издательский дом «Вильямс», 2005. – 912 с.: ил. – Парал. тит. англ.(см. также свежее 7-ое издание в оригинале)
  8. Нортон П., Соухэ Д. Язык ассемблера для IBM PC.– М.: Компьютер, 1992.– 352 с.
  9. Пильщиков В.Н. Программирование на языке ассемблера IBM PC.– М.: ДИАЛОГ-МИФИ, 1994–2014 288 с.
  10. Скляров И.С. Изучаем ассемблер за 7 дней www.sklyaroff.ru

Advanced

  1. Касперски К. Фундаментальные основы хакерства. Искусство дизассемблирования. – М.: СОЛОН-Пресс, 2004. 448 с. – (Серия «Кодокопатель»)
  2. Касперски К. Техника отладки программ без исходных текстов. – Спб.: БХВ-Петербург, 2005. – 832 с.: ил.
  3. Касперски К. Компьютерные вирусы изнутри и снаружи. – Спб.: Питер, 2006. – 527 с.: ил.
  4. Касперски К. Записки исследователя компьютерных вирусов. – Спб.: Питер, 2006. – 316 с.: ил.
  5. Кнут Д. Искусство программирования, том 3. Сортировка и поиск, 2-е изд.: пер. с англ. – М.: Издательский дом «Вильямс», 2003. – 832 с.: ил. – Парал. тит. англ.
  6. Колисниченко Д.Н. Rootkits под Windows. Теория и практика программирования «шапок-невидимок», позволяющих скрывать от системы данные, процессы, сетевые соединения. – Спб.: Наука и Техника, 2006. – 320 с.: ил.
  7. Лямин Л.В. Макроассемблер MASM.– М.: Радио и связь, 1994.– 320 с.: ил.
  8. Магда Ю. Ассемблер для процессоров Intel Pentium. – Спб.: Питер, 2006. – 410 с.: ил.
  9. Майко Г.В. Ассемблер для IBM PC.– М.: Бизнес-Информ, Сирин, 1997.– 212 с.
  10. Уоррен Г. Алгоритмические трюки для программистов, 2-е изд.: пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 512 с.: ил. – Парал. тит. англ.
  11. Скляров И.С. Искуство защиты и взлома информации. – Спб.: БХВ-Петербург, 2004. – 288 с.: ил.
  12. Уэзерелл Ч. Этюды для программистов: Пер. с англ. – М.: Мир, 1982. – 288 с., ил.
  13. Электронная библиотека братьев Фроловых www.frolov-lib.ru
  14. Чекатов А.А. Использование Turbo Assembler при разработке программ.– Киев: Диалектика, 1995.– 288 с.
  15. Юров В. Assembler: специальный справочник.– Спб.: Питер, 2001.– 496 с.: ил.
  16. Юров В. Assembler. Практикум. 2-е изд. – Спб.: Питер, 2006. – 399 с.: ил.
  17. Юров В. Assembler. Учебник для вузов. 2-е изд. – Спб.: Питер, 2007. – 637 с.: ил.
  18. Пирогов В. Assembler учебный курс. 2001 Нолидж
  19. Пирогов В. АССЕМБЛЕР учебный курс 2003 Нолидж-БХВ
  20. Пирогов В. Assembler для windows 
    1-ое издание ― М.: изд-во Молгачева С.В., 2002 
    2-ое издание ― СПб.:. БХВ-Петербург, 2003 ― 684 с.: ил. 
    3-ье издание ― СПб.:. БХВ-Петербург, 2005 ― 864 с.: ил. 
    4-ое издание ― СПб.:. БХВ-Петербург, 2012 ― 896 с.: ил.
  21. Пирогов В. Ассемблер на примерах. ― СПб.:. БХВ-Петербург, 2012 ― 416 с.: ил.
  22. Пирогов В. АССЕМБЛЕР и дизассемблирование. ― СПб.:. БХВ-Петербург, 2006. ― 464 с.: ил.
  23. Пирогов В. работа над книгой ’64-битовое программирование на ассемблере (Windows,Unix)’. В книге рассматривается программирование на fasm в 64-разрядных Windows и Unix
  24. Юров В., Хорошенко С. Assembler: учебный курс.– Спб.: Питер, 1999. – 672 с.
  25. Ю-Чжен Лю, Гибсон Г. Микропроцессоры семейства 8086/8088. Архитектура, программирование и проектирование микрокомпьютерных систем.– М.: Радио и связь, 1987.– 512 с.
  26. Agner Fog: Software optimization resources (assembly/c++) 1996 – 2017. Веб-страница
  27. Intel 64 and IA-32 Architectures Optimization Reference Manual
  28. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 1: Basic Architecture
  29. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M
  30. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z
  31. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1
  32. Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3B: System Programming Guide, Part 2
  33. Leiterman J.C. 32/64-BIT 80×86 Assembly Language Architecture. 2005, Wordware Publishing, Inc (568 pages) 2320 Los Rios Boulevard Plano, Texas 75074
  34. Turbo Assembler Version 3.2 User’s Guide Borland International. Inc 1800 Green Hills Road P.O. BOX 660001, Scotts Valley, CA 95067-0001
  35. Статьи с сайта wasm.in
  36. Статьи с сайта sasm.narod.ru
  37. Сайт MASM32 и форум
  38. Сайт FASM и форум
  39. Сайт NASM

Способы декомпиляции EXE-файлов

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

Способ 1: VB Decompiler

Первым рассмотрим VB Decompiler, который позволяет декомпилировть программы, написанные на Visual Basic 5.0 и 6.0.

  1. Нажмите «Файл» и выберите пункт «Открыть программу» (Ctrl+O).

Найдите и откройте программу.

Декомпиляция должна сразу запуститься. Если этого не произошло, нажмите кнопку «Старт».

По завершении внизу окна появится слово «Декомпилировано». В левой части расположено дерево объектов, а в центральной можно просматривать код.

При необходимости, сохраните декомпилированные элементы. Для этого нажмите «Файл» и выберите подходящий вариант, например, «Сохранить декомпилированный проект», чтобы извлечь все объекты в папку на диске.

Способ 2: ReFox

В плане декомпиляции программ, скомпилированных через Visual FoxPro и FoxBASE+, неплохо себя зарекомендовал ReFox.

  1. Через встроенный обозреватель файлов найдите нужный EXE-файл. Если его выделить, то справа будет отображаться краткая информация о нём.

Откройте контекстное меню и выберите пункт «Decompile».

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

По окончании появится такое сообщение:

Можно просмотреть результат в указанной папке.

Способ 3: DeDe

А DeDe будет полезна для декомпиляции программ на Delphi.

  1. Нажмите кнопку «Добавление файла».

Найдите файл EXE и откройте его.

Для запуска декомпиляции нажмите кнопку «Процесс».

При успешном завершении процедуры появится такое сообщение:

В отдельные вкладки будет выведена информация о классах, объектах, формах и процедурах.

Для сохранения всех этих данных откройте вкладку «Project», проставьте галочки рядом с типами объектов, которые нужно сохранить, выберите папку и нажмите «Сделать файлы».

Способ 4: EMS Source Rescuer

Декомпилятор EMS Source Rescuer позволяет работать с EXE-файлами, скомпилированными при помощи Delphi и C++ Builder.

  1. В блоке «Executable File» нужно указать нужную программу.
  2. В «Project name» пропишите имя проекта и нажмите «Next».

Выберите необходимые объекты, укажите язык программирования и нажмите «Next».

В следующем окне исходный код доступен в режиме предпросмотра. Осталось выбрать выходную папку и нажать кнопку «Save».

Опишите, что у вас не получилось.
Наши специалисты постараются ответить максимально быстро.

Репозитории и базы данных малвари

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

  1. Contagio Malware Dump — коллекция последних образцов вредоносов.
  2. Das Malwerk — свежие наборы вредоносов на любой вкус.
  3. KernelMode.info — репозиторий, заточенный под Win32 и rootkit Windows.
  4. DamageLab.in — специализированный форум, где можно найти много полезного, в том числе выкладываемые исследователями распакованные и дешифрованные семплы, методики и рекомендации по их анализу.
  5. MalwareBlacklist — ежедневно обновляемая доска blacklisted URLs, зараженных малварью.
  6. Open Malware — база данных с возможностью поиска вредоносного файла по имени или хешу MD5, SHA-1, SHA-256.
  7. ViruSign — база данных малвари, детектируема антивирусом ClamAV.
  8. VirusShare — обновляемый репозиторий для исследователей и реверсеров.

Usage

  1. Open the profession interface, and then click «Open Shop».
  2. Enter in an amount to charge other players using your disassembler.
  3. With your cursor (which will now have a circle indicator under it), click an area of the ground to set up your shop. You can only place your disassembler in the areas where the indicator turns green; the indicator being red means you are not in a valid area of the map or you are too close to another player’s shop.
  4. You or other players may click on the window above the disassembler, and use it like the Portable Repair Machine

Durability of a disassembler decreases with use, depending on the Rarity of the item being processed; Common items will use up 1 durability, higher ranked items will use up more durability (2,3,4, etc) for each disassembly.

When the disassembler has no more durability, the shop will automatically close. Speak to Abello to repair it.

ПОЧЕМУ DisDoc?

SOURSER — это название знают все, кто хотя бы краем уха слышал о дизассеблировании. Считается, что это дизассеблер замечательный, мощный, не имеющий конкурентов. Я думаю, что слухи об огромных преимуществах SOURSERа силь но преувеличены. У меня сложилось такое впечатление, что при дизассемблирова нии небольших программ (до 7 кб.) SOURSER предпочтительнее. Когда программа велика (в моем случае — 58 кб ), SOURSER работает очень медленно и, на мой взгляд, не дает никаких преимуществ.

Выбор дизассемблера DisDoc 2.3 был для меня во многом случаен. Начиная работу, я получил тексты на ассемблере как с помощью SOURSERa (версия 3.07), так и с помощью дизассемблера DisDoc 2.3. Затем оба текста после устранения очевидных ошибок были ассемблированы. И вот, то, что было выдано SOURSERом, повисло сразу, а то, что выдал DisDoc 2.3, прежде чем повиснуть, вывело на экран несколько линий. Это и определило выбор. В процессе работы я не раз имел возможность оценить основное преимущество дизассемблера DisDoc — интуитивно понятный, неизощренный, удобный и компактный листинг.

Чтобы понять дальнейшее, необходимо познакомиться с отрывком из листинга, который выдает DisDoc 2.3

		mov	cx,WORD PTR ds:d02453	;02430 
b02430:		add	cx,bx			;02434 
		mov	bx,99e7h		;02436 
		mov	dx,WORD PTR ds:d02449	;02439 
		mov	al,BYTE PTR ds:d02446	;0243d 
		call	s383 ;<09060>		;02440 
		push	cs			;02443 
		pop	ds			;02444 
		ret				;02445 
 ;----------------------------------------------------- 
 d02446		db	00			;02446 . 
 d02447		db	00,00			;02447 .. 
 d02449		db	00,00			;02449 .. 

В поле комментариев указано смещение, которое имела данная инструкция в исходной программе. Например, если вы в исходной программе, подвергаемой дизассемблированию, посмотрите отладчиком смещение 02434, то там окажется инструкция add cx,bx — на это можно положиться! Очень хороши названия меток и элементов данных. По ним сразу можно понять, какое смещение они имели в исходной программе. Например, метка b02430 имела смещение 02430, элемент данных d02446 имел смещение 02446 и т.д. То же самое относится и к подпрограммам. После вызова подпрограммы в треугольных скобках указано смещение, которое имела эта подпрограмма в исходной программе. Например, подпрограмма s383 начиналась в исходной программе со смещения 09060. Такая организация листинга позволяет сохранить однозначное соответствие с исходной программой, что дает возможность проверить отладчиком сомнительные куски кода и данных, сравнить текст, выданный дизассемблером с тем, что есть на самом деле. Это поистине драгоценная возможность. Нужно сказать, что DisDoc имеет большие недостатки, о которых речь еще пойдет, и, следовательно, применение того или иного дизассемблера — дело вкуса.

В любом случае обязательно встретятся

Компилятор онлайн

Через пару минут я уже имел на руках скомпилированный бинарник. Помог сервис некоего турецкого программиста, который когда-то озадачился подобной проблемой и реализовал на своем сайте веб-интерфейс для доступа к компилятору. А чтобы пользоваться было еще удобнее, прикрутил компонент для редактирования кода. Подсветка синтаксиса, нумерация строк и даже автодополнения команд — почти маленькая IDE. Собирается в один исходник в один клик или по хоткею Ctrl-F7, после чего сервис отдает готовый бинарник. Если во время сборки произошли ошибки, то сообщения компилятора отобразятся в отдельной панели. Адрес для такого удачного сервиса на редкость странный:

login.php, причем сайт откроется только в Internet Explorer. Другое серьезное ограничение — отсутствие поддержки C++. А куда же сейчас без нее? Поэтому когда зашла речь о компиляции сорца С++, пришлось отыскать замену. К счастью, разработчики прогрессивного компилятора Comeau C/C++ на официальном сайте сделали фронтенд, который выполнен как раз в виде веб-приложения (www.comeaucomputing.com/tryitout).

Допускается выбор различных режимов компиляции, версии Comeau, а также любые другие параметры, которые ты мог передать сборщику через командную строку. Кстати говоря, последние релизы Comeau уже поддерживают большинство расширений C++0x (обновленный и модернизировнный стандарт С++), поддержка которого появилась сейчас в Visual Studio 2010.

«Зачем вообще привязываться к какому-то конкретному языку», — подумали ребята из ideone (ideone.com) и реализовали универсальный компилятор в 40 различных языков. Помимо С/C++ здесь поддерживаются еще и Java, C#, Pascal, Visual Basic .NET, все скриптовые языки, и даже ассемблер

Важно только уложиться в ограничения: 10 секунд на компиляцию, 5 секунд на выполнение, 256 мегабайт памяти. Помимо этого, программа не сможет обращаться в Сеть и работать с файлами

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

Процесс дизассемблирования

Дизассемблер запускается в своём отдельном окне, и вы можете переключаться из окна дизассемблера в основное окно PE Explorer. Дизассемблер поддерживает основные наборы инструкций Intel x86 и расширения MMX, 3D Now!, SSE, SSE2 и SSE3. В начале процесса окно Options предлагает выбрать следующие опции:

Нажатие кнопки Start Now запускает процесс, кнопка Start Later откладывает запуск.

Verify Offsets — При включении этой опции дизассемблер особо тщательно проверяет, является ли анализируемое значение смещением.

Reverse Offset Checking Order — По умолчанию, дизассемблер рассматривает необработанные данные как код, и только потом как смещения к данным. При включении этой опции дизассемблер будет рассматривать необработанные данные как данные.

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

Find ANSI and Unicode Strings — При включении этой опции дизассемблер автоматически обнаруживает текстовые ANSI и Unicode строки длиннее 3-х символов. В отдельных случаях, если результаты анализа позволяют однозначно интерпретировать данные как строку, эта длина может быть и менее 3-х символов.

Find Alignment — Поскольку доступ к выравненным данным происходит быстрее, многие компиляторы выравнивают код, добавляя лишние команды, не влияющие не ход выполнения программы, такие как nop, mov eax,eax и т.п.
При включении этой опции дизассемблер интерпретирует подобный код/данные как выравнивание.

Forcible Find Offsets — При включении этой опции дизассемблер автоматически обнаруживает смещения к данным в коде, который остался нераспознанным после первого прохода по файлу.
Используйте эту опцию с осторожностью, так как правильно определить, являются ли найденные данные смещением или фрагментами кода/данных, довольно сложно. Не рекомендуется использовать эту опцию без особых причин

Analyze Uprocessed Data — Во время дизассемблирования отдельные фрагменты кода по причине отсутствия явных на них ссылок могут оказаться нераспознанными. При включении данной опции дизассемблер проводит дополнительный анализ таких
блоков и пытается определить, являются ли эти фрагменты кодом или данными. Включение этой опции улучшает качество листинга.

Окно Processing Info отображает информацию о ходе процесса дизассемблирования:

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

2.Как отличить данные от команд?

Любой дизассемблер путает данные и команды. Особенно это относится к .COM программам, где все перемешано. Рассмотрим простой пример:

	pop	cx			;03e56 
	ret				;03e57 
;----------------------------------------------------- 
	add	BYTE PTR ,al	;03e58 
	add	BYTE PTR ,al	;03e5a 
m03e5c:	mov	BYTE PTR ds:d05830,01	;03e5c 

В этом фрагменте встретились две вычурных, повисших инструкции:

	add	BYTE PTR ,al	;03e58
	add	BYTE PTR ,al	;03e5a

Сверху они ограничены инструкцией возврата из подпрограммы ret, а снизу — меткой m03e5c. Ясно, что эти инструкции могут быть только данными. После переделки приведенный фрагмент должен выглядеть так:

	pop	cx			;03e56 
	ret				;03e57 
;----------------------------------------------------- 
d03e58	dw 0  	;03e58 
d03e5a 	db 0  	;03e5a 
d03e5b  db 0 
m03e5c:	mov	BYTE PTR ds:d05830,01	;03e5c 

Тут возникает еще один вопрос: почему в одном случае стоит dw, а в другом — db? Ответ содержится в тексте, который выдал дизассемблер. Там можно найти такие инструкции:

 	mov	si,WORD PTR ds:d03e58	;03dd0
	mov	bl,BYTE PTR ds:d03e5a	;03dd4,

Откуда следует, что d03e58 рассматривается как слово, а d03e5a — как байт. Рассмотрим чуть более сложный, но, тем не менее, очень характерный пример.

b03f53:	cmp	al,05			;03f53 
	jnz	b03f6b ;03f55		;Jump not equal(ZF=0) 
..................................................... 
	ret				;03f69 
;----------------------------------------------------- 
	add	BYTE PTR ,bh	;03f6a 
	push	es			;03f6c 
	jnz	b03f79 ;03f6d		;Jump not equal(ZF=0) 

В приведенном фрагменте текста метка b03f6b отсутствует. Между тем эта метка должна «разрубить» пополам инструкцию add BYTE PTR ,bh , которая начинается в оригинальной программе, подвергаемой дизассемблированию, со смещения 03f6a. Выход здесь может быть только один — смещению 03f6a соответствует байт данных, а инструкция начинается со смещения 03f6b. Исправленный фрагмент должен выглядеть так:

b03f53:	cmp	al,05			;03f53 
	jnz	b03f6b ;03f55		;Jump not equal(ZF=0) 
...................................................... 
	ret				;03f69 
;----------------------------------------------------- 
d03f6a	db 0  	;03f6a 
b03f6b:	cmp al,06h			;03f6b 
	jnz	b03f79 ;03f6d		;Jump not equal(ZF=0) 

Путаница между данными и инструкциями возникает довольно часто. SOURSER способен выдавать целые метры бессмысленных инструкций. DisDoc 2.3 в этом отношении ведет себя лучше.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий