Анимация
JavaScript
|
Главная Библионтека Следующий пример выдаст на экран адреса всех существующих точек входа. auto a,i; i=0; while((a=GetEntryOrdinal(i++))) Message("0x%X %x \n",a, GetEntryPoint(a));
success RenameEntryPoint(long ordinal,char name); Позволяет изменить имя точки входа по ординалу. При этом предыдущее имя переносится в комментарий. Если операция завершиться неуспешно, то функция вернет неравное нулю число. Такое может, случиться, например, при попытке передать в качестве нового имени пустую строку. Пример использования:
; start
СТРУКТУРЫ ALMA MATER Строго говоря, в языке процессора - машинном коде - нет ни типов данных, ни тем более структур, - все это привилегии языков высокого уровня. Процессор же оперирует с регистрами и ячейками памяти. Это самый низкий уровень в абстракции данных и приходится вручную разбираться с такими техническими деталями, как интерпретация знаковых битов или разрядностей ячеек. Но ассемблер это не машинный код. Это первый высокоуровневый язык, придуманный человечеством , делающий огромный шаг вперед в абстракции данных. Современные ассемблеры уже трудно назвать языками низкого уровня, ибо они поддерживают макросы, средства автоматизации проектирования, сложные конструкции, типотизацию данных и даже элементы объективно ориентированного программирования! Поддержка структур на этом фоне уже не выглядит чем-то удивительным и активно используется многими программистами. Это позволяет забыть о смещениях и оперировать одними удобочитаемыми метками. Рассмотрим, простой пример, - фрагмент кода, который проходить по цепочке MCB блоков памяти MS-DOS.
Красным цветом выделены константы, которые без знания структуры 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 |