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

Структуры alma mater

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

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

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

Рассмотрим, простой пример, - фрагмент кода, который проходить по цепочке MCB блоков памяти MS-DOS.

CALL .FirstMCB ; Найти первый MCB

gmm_while: ; Сканируем цепочку MCB

MOV ES, AX ; ES = first MCB

CMP Byte ptr ES:[0],'M'; Это продолжение цепочки?

JNZ gmm_z ; --> Конец/Обрыв цепочки

gmm_next: ; // Следущий элемент цепочки

ADD AX, ES:[3] ; Размер блока

INC AX ; заголовок MC

JMP Short gmm_while ; --> Цикл

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

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

В нашем примере можно поступить так:

MCB struc ; (sizeof=0x10)

IsLastBlock db ?

ParentPSPaddr dw ?

Size dw ?

Name db 11 dup(?)

MCB ends

То есть мы определили новую структуру ”MCB”, и теперь для доступа к ее членам совсем не обязательно знать их смещения, от начала структуры. Это сделает за нас ассемблер!

Тогда исходный текст программы будет выглядеть так:

CALL .FirstMCB ; Найти первый MCB

gmm_while: ; Сканируем цепочку MCB

MOV ES, AX ; ES = first MCB

CMP Byte ptr ES:[MCB.IsLastBlock],'M';

; Это продолжение цепочки?

JNZ gmm_z ; --> Конец/Обрыв цепочки

gmm_next: ; // Следущий элемент цепочки

ADD AX, ES:[MCB.Size] ; Размер блока

INC AX ; заголовок MC

JMP Short gmm_while ; --> Цикл

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

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

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

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

.text:00403A80 _memset proc near

.text:00403A80

.text:00403A80

.text:00403A80 arg_0 = dword ptr 4

.text:00403A80 arg_4 = byte ptr 8

.text:00403A80 arg_8 = dword ptr 0Ch

Действительно, если только немного изменить синтаксис объявления локальных переменных, то он ничем не будет отличаться от структуры:

Memset_arg struc

Save_reg DD ?

Arg_0 DD ?

Arg_4 DD ?

Arg_8 DD ?

Memset_arg ends

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

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

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

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