Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 [ 77 ] 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140


Следующий пример выдаст на экран адреса всех существующих точек входа.

auto a,i;

i=0;

while((a=GetEntryOrdinal(i++))) Message("0x%X %x \n",a, GetEntryPoint(a));

0x122C0

122c0

122dd

122e5

1002a

Операнд

Пояснения

ordinal

Ординал точки входа

Return

Завершение

Пояснения

!=BADADDR

Адрес точки входа

==BADADDR

Ошибка

success RenameEntryPoint(long ordinal,char name);

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

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

seg000:22C0 start

proc

near

seg000:22C0

call

My 1

seg000:22C3

call

sub 0

2325

seg000:22C6

call

sub 0

235B

seg000:22C9

call

sub 0

2374

seg000:22CC

call

sub 0

23B6

seg000:22CF

call

sub 0

23F8

seg000:22CF start

endp

RenameEntryPoint(0x122C0,"main");

seg000:22C0 main

proc

near

seg000:22C0

call

My 1

seg000:22C3

call

sub 0

2325

seg000:22C6

call

sub 0

235B

seg000:22C9

call

sub 0

2374

seg000:22CC

call

sub 0

23B6

seg000:22CF

call

sub 0

23F8

seg000:22CF main

endp

; start



Операнд

Пояснения

ordinal

Ординал точки входа

name

Новое имя функции

Return

Завершение

Пояснения

Успешно

Ошибка

СТРУКТУРЫ ALMA MATER

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

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

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

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

CALL

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

while:

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

ES, AX

ES = first MCB

Byte ptr ES:[0],M

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

gmm z

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

next:

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

AX, ES:[3]

; Размер блока

; заголовок MC

Short gmm while

; --> Цикл

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

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

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

IsLastBlock ParentPSPaddr Size dw ?

Name

struc

db ? dw ?

; (sizeof=0x10)

db 11 dup(?)

ends



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

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

CALL .FirstMCB

; Найти

первый MCB

gmm while: MOV

gmm next:

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

ES, AX ; ES = first MCB

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

; Это продолжение цепочки? --> Конец/Обрыв цепочки Следущий элемент цепочки Размер блока заголовок MC --> Цикл

gmm z

ES:[MCB.Size]

Short

gmm while

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

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

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

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

. text:0 04 03A8 0 memset .text:00403A80 .text:00403A80 .text:00403A80 arg 0

text:00403A80 arg 4 text:00403A80 arg 8

proc near

= dword ptr 4 = byte ptr 8

= dword ptr 0Ch

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

Memset arg struc

Save reg DD ?

Arg 0 DD ?

Arg 4 DD ?

Arg 8 DD ?

Memset arg ends

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

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 [ 77 ] 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140