Проблема несколько упрощается, если исследователь в состоянии разобраться с ассемблерным кодом, генерируемым декомпилятором. В этом случае декомпилятор особенно полезен. Рассмотрим пример результатов работы декомпилятора.
Среди коммерческих декомпиляторов для Windows хорошая репутация у IDA Pro компании DataRescue (пример работы декомпилятора показан на рис. 4.1). IDA Pro может декомпилировать программный код многих процессоров, включая виртуальную машину Java.
Рис. 4.1. Пример работы IDA Pro
На рисунке показан пример применения декомпилятора IDA Pro для дизассемблирования программы pbrush.exe (Paintbrush). IDA Pro нашел секцию внешних функций, используемых программой pbrush.exe. Если программа выполняется под управлением операционной системы, которая поддерживает разделяемые библиотеки (например, под управлением операционных систем Windows или UNIX), то она содержит список необходимых ей библиотек. Обычно этот список представлен в удобочитаемом виде, который легко обнаружить при экспертизе выполняемого кода. Для выполнения программ операционной системе также требуется этот список, поэтому она загружает его в память. В большинстве случаев это позволяет декомпилятору вставить список в двоичный код программы, сделав его более понятным.
Чаще всего таблица соответствия имен pbrush.exe недоступна, поэтому в большей части сгенерированного декомпилятором ассемблерного кода отсутствуют имена.
Оценочную версию IDA Pro, пригодную для первоначального знакомства с программой, можно загрузить с www.datarescue.com/idabase/ida.htm. SoftICE компании Numega – другой популярный отладчик. Дополнительные сведения о нем можно найти по адресу www.compuware.com/products/numega/drivercentral/.
Для сравнения была написана небольшая программа на языке C (классическая небольшая программа, выводящая строку «Hello World»). Для отладки использовался отладчик GNU (GDB). Код программы представлен ниже:
#include
int main ()
{
printf (“Hello World\n”);
return (0);
}
Программа была скомпилирована с включением отладочной информации (был включен переключатель —g):
[elliptic@]$ gcc -g hello.c -o hello
[elliptic@ellipse]$ ./hello
Hello World
Пример протокола отладки под управлением GDB показан ниже:
[elliptic@ellipse]$ gdb hello
GNU gdb 19991004
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public
License, and you are welcome to change it and/or
distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show
warranty” for details.
This GDB was configured as “i386-redhat-linux”...
(gdb) break main
Была установлена точка прерывания при входе в функцию main. При ее достижении выполнение программы было приостановлено для выполнения программистом действий по отладке программы. Контрольная точка была установлена до выдачи команды run.
Breakpoint 1 at 0x80483d3: file hello.c, line 5. (gdb) run
Команда runначинает выполнение программы под управлением отладчика.
Starting program: /home/ryan/hello
Breakpoint 1, main () at hello.c:5
5 printf (“Hello World\n”);
(gdb) disassemble
После того достижения программой точки прерывания и начала сессии отладки была выдана команда disassemble,позволяющая вывести дополнительную отладочную информацию о программе.
Dump of assembler code for function main:
0x80483d0
: push %ebp
0x80483d1
: mov %esp,%ebp
0x80483d3
: push $0x8048440
0x80483d8
: call 0x8048308
0x80483dd
: add $0x4,%esp
0x80483e0
: xor %eax,%eax
0x80483e2
: jmp 0x80483e4
0x80483e4
: leave
0x80483e5
: retEnd of assembler dump.
Протокол отображает ассемблерный код программы «hello world», соответствующий ассемблеру x86 Linux. Исследование собственных программ в отладчике – хороший способ изучения листингов ассемблерного кода.
(gdb) s
printf (format=0x8048440 “Hello World\n”) at printf.c:30
printf.c: No such file or directory.
После задания командой s(«step») режима пошагового выполнения программы в отладчике выполняется переход к вызову функции printf. GDB сообщает о невозможности дальнейшей детализации функции printf из-за отсутствия в распоряжении отладчика исходного кода функции printf.
(gdb) s
31 in printf.c
(gdb) s
Hello World
35 in printf.c
(gdb) c
Continuing.
Далее выполняется несколько шагов реализации программы внутри функции printf и программа завершается. По команде c(«continue») программа будет выполнена до следующей точки прерывания или будет завершена.
Program exited normally. (gdb)
В число аналогичных программ входят программы nm и objdump пакета GNU. Программа objdump позволяет управлять объектными файлами. Она применяется для отображения символов объектного файла, его заголовка и даже дизассемблирования. Nm выполняет аналогичные действия, что и objdump, позволяя просматривать символьные ссылки на объектные файлы.
Читать дальше
Конец ознакомительного отрывка
Купить книгу