Чаще всего таблица соответствия имен 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
>0x80483d1
>0x80483d3
>0x80483d8
>0x80483dd
>0x80483e0
>0x80483e2
>0x80483e4
>0x80483e5
>End 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 позволяет управлять объектными файлами. Она применяется для отображения символов объектного файла, его заголовка и даже дизассемблирования.