Анимация
JavaScript
|
Главная Библионтека void DelEnum(long enum id); Функция удаляет перечисление, заданное идентификатором вместе со всеми его членами. Пример: FFFFFFFF ; enum enum 1 FFFFFFFF enum 1 0 = 1 FFFFFFFF enum 1 2 = 2 FFFFFFFF FFFFFFFF ; ---------------------------- FFFFFFFF FFFFFFFF ; enum enum 2 FFFFFFFF MyEnum = 16h FFFFFFFF DelEnum( GetEnum("enum 2") FFFFFFFF ; enum enum 1 FFFFFFFF enum 10 = 1 FFFFFFFF enum 1 2 FFFFFFFF Операнд Пояснения Enum id Идентификатор перечисления Интерактивно перечисление можно удалить, установив курсор на любой его элемент и нажав клавишу <DEL> success SetEnumIdx(long enum id,long idx); Функция позволяет изменять индекс перечисления в списке. При этом перечисления меняются местами, и затирания не происходит. Например: FFFFFFFF ; enum enum 1 FFFFFFFF enum 1 0 FFFFFFFF enum 1 2 FFFFFFFF FFFFFFFF ; FFFFFFFF FFFFFFFF ; enum MyNewEnum FFFFFFFF MyNewEnum 0 FFFFFFFF FFFFFFFF ; FFFFFFFF FFFFFFFF ; enum enum 9 FFFFFFFF enum 9 0 = 1 = 2 SetEnumIdx( GetEnum("enum FFFFFFFF ; enum MyNewEnum FFFFFFFF MyNewEnum 0 FFFFFFFF FFFFFFFF ; FFFFFFFF FFFFFFFF ; enum enum 1 FFFFFFFF enum 1 0 FFFFFFFF enum 1 2 FFFFFFFF FFFFFFFF ; FFFFFFFF FFFFFFFF ; enum enum 9 FFFFFFFF enum 9 0 FFFFFFFF = 1 = 2
FIXUP ALMA MATER Более привычным синонимом fixup вероятно, окажется термин «перемещаемые элементы». Что это такое? Как можно судить из названия, это относительные адреса, обеспечивающие портабельность кода, то есть независимость от базового адреса загрузки. Поскольку IDA эмулирует загрузку файла в собственное адресное пространство и даже трассирует его выполнение, то она должна поддерживать и перемещаемые элементы. Покажем это на небольшом примере, MS-DOS exe файла. Просмотр с помощью HIEW
seg000:0000 seg000:0000 seg000:0003 seg000:0005 seg000:0005 seg000:0007 seg000:000A Просмотр с помощью IDA start proc near mov ax, 1001h mov ds, ax assume ds:dseg mov ah, 9 mov dx, 0 int 21h Что грузиться в регистр AX? С виду непосредственное значение. Однако, это не так. Если приглядеться, то можно увидеть, что дальше оно помещается в регистр DS и, следовательно, скорее всего указывает на сегмент данных программы. То есть 0x1 это адрес сегмента данных выраженный в параграфах. Знакомым с архитектурой IBM PC может показаться, с чего бы это вдруг он казался расположенным глубоко в таблице векторов прерываний. Но ничего странного нет. И сегмент данных расположен вовсе не там, где можно было бы подумать. Ведь это относительный адрес. Резанный вопрос относительный чего? В exe файлах от отсчитывается от адреса загрузки первого байта, расположенного за заголовком файла. По умолчанию IDA загружает exe файлы по адресу 0x10000. Следовательно, считая в параграфах, 0x1000+0x1 == 0x1001, как видим, результат совпадает с тем, что отобразила IDA. Вот это и понимается под поддержкой перемещаемых элементов. Остается только ответить на вопрос, откуда IDA узнала, как следует трактовать этот непосредственный операнд? Эвристическим анализатором? Нет, конечно. Она поступила точно так же, как и операционная система на ее месте, - просто прочитала заголовок файла. 00000000: 4D 5A 2C 00-02 00 02 00-20 00 00 00-FF FF 00 00 MZ, □ □ 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 |