Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long MakeCode (long ea)

Функция создает по указанному адресу элемент кода, выполняя дизассемблирование первой машинной инструкции. Если это возможно, автоматически дизассемблируется и другие инструкции. Это происходит в следующих случаях:

а) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты;

b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса

Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование.

Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки. Подробнее об этом можно прочитать в главах «Перекресые ссылки» и «Глобальные настойки» соотвественно.

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

Благодаря этому дизассемблируется все вызываемые функции, условные переходы и все косвенные ссылки, которые IDA в состоянии распознать (например, если это не запрещено настойками, она может автоматически преобразовывать 32-разрядные непосредственные операнды по модулю больше 0x10000 в смещения на код – см. главу «Глобальные настойки»).

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

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

Пример использования:

seg000:0100 start db 83h ; Г

seg000:0101 db 0C6h ; ╞

seg000:0102 db 6 ;

seg000:0103 db 0FFh ;

seg000:0104 db 0E6h ; ц

seg000:0105 db 0B9h ; ╣

seg000:0106 db 0BEh ; ╛

seg000:0107 db 14h ;

seg000:0108 db 1 ;

seg000:0109 db 0ADh ; н

seg000:010A db 91h ; С

seg000:010B db 56h ; V

seg000:010C db 80h ; А

seg000:010D db 34h ; 4

seg000:010E db 66h ; f

seg000:010F db 46h ; F

seg000:0110 db 0E2h ; т

seg000:0111 db 0FAh ; ·

seg000:0112 db 0FFh ;

seg000:0113 db 0E6h ; ц

seg000:0114 db 18h ;

seg000:0115 db 0 ;

a) исходные данные

Message(">%X\n",MakeCode(SegByName("seg000")+0x100));

b) вызываем функцию MakeCode для дизассемблирования кода

seg000:0100 add si, 6

seg000:0103 jmp si

seg000:0103 ; ───────────────────────────

seg000:0105 db 0B9h ; ╣

seg000:0106 db 0BEh ; ╛

seg000:0107 db 14h ;

seg000:0108 db 1 ;

seg000:0109 db 0ADh ; н

seg000:010A db 91h ; С

seg000:010B db 56h ; V

seg000:010C db 80h ; А

seg000:010D db 34h ; 4

seg000:010E db 66h ; f

seg000:010F db 46h ; F

seg000:0110 db 0E2h ; т

seg000:0111 db 0FAh ; ·

seg000:0112 db 0FFh ;

seg000:0113 db 0E6h ; ц

seg000:0114 db 18h ;

seg000:0115 db 0 ;

>3

с) результат – функция дизассемблировала две инструкции и остановилась, встретив регистровый переход, целевой адрес которого она предсказать не в силах; по завершению дизассемблирования функция возвратила длину первой инструкции, равную трем байтам

Message(">%X\n",MakeCode(SegByName("seg000")+0x106));

d) повторно вызываем функцию MakeCode, передавая ей адрес следующей инструкции (значение регистра SI при загрузке com файла равно 0x100, а после выполнения инструкции ADD SI, 6 – 0x106, следовательно целевой адрес перехода JMP SI равен 0x106)

seg000:0100 add si, 6

seg000:0103 jmp si

seg000:0103 ; ───────────────────────────────────────────────────────────────

seg000:0105 db 0B9h ; ╣

seg000:0106 ; ───────────────────────────────────────────────────────────────

seg000:0106 mov si, 114h

seg000:0109 lodsw

seg000:010A xchg ax, cx

seg000:010B push si

seg000:010C

seg000:010C loc_0_10C: ; CODE XREF: seg000:0110j

seg000:010C xor byte ptr [si], 66h

seg000:010F inc si

seg000:0110 loop loc_0_10C

seg000:0112 jmp si

seg000:0112 ; ───────────────────────────────────────────────────────────────

seg000:0114 db 18h ;

seg000:0115 db 0 ;

>3

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

??? #Верстальщику – chabge table

аргумент

пояснения

ea

линейный адрес бестипового байта или головы уже существующего элемента кода

return

=return

пояснения

!=0

длина первой дизассемблируемой инструкции

==0

ошибка

Родственные функции: нет

Интерактивный аналог: “~Edit\Code”’ <C>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]