Анимация
JavaScript
|
Главная Библионтека success SegAddrng(long ea,long use32) Функция изменяет разрядность сегмента, определяя каким образом будет дизассемблироваться машинные инструкции. На платформе Intel 386+ префикс 0x66 перед инструкцией в 16-разрядном сегменте указывает на использование 32-битных операндов и, соответственно, в 32-разрядном сегменте наоборот. Изменение адресации так же затрагивает интерпретацию префикса предопределения адреса - 0x67, видов адресации и т.д. Неверный выбор разрядности сегмента приводит к некорректному дизассемблированию - появлению бессмысленного «мусора», бессвязных инструкций. IDA определяет разрядность сегмента на основе информации, содержащейся в заголовках файлов. При загрузке бинарных файлов, равно как и MS-DOS exe файлов разрядность созданных сегментов по умолчанию равна нулю. Если IDA неправильно определила разрядность одного или нескольких сегментов, ее следует исправить вручную. Внимание: изменение разрядности сегмента уничтожает все результаты дизассемблирования - метки, функции, переменные и т.д. Аргумент ea задает любой линейный адрес, принадлежащий сегменту. Если передать адрес не принадлежащий никакому сегменту, функция возвратит ошибку. Нулевое значение аргумента use32 указывает на 16-битовую разрядность сегмента и приводит к помещению в ассемблерный листинг атрибута размера сегмента use16; в противном случае сегмент считается 32-разрядным, а атрибут размера сегмента - use32. Независимо от разрядности сегмента, IDA всегда выражает смещения 32-битовыми значениями и допустимо создания 16-разрядного сегмента размером более 64 килобайт, однако, следует помнить, что в дальнейшем такой «большой» сегмент не сможет быть ассемблирован. Функция не учитывает выбранный тип процессора и допускает использование 32-разрядного режима даже с 8086 (!) процессором. Пример использования: SegCreate(0x1000,0x2000,0x100,0,0,0); a) Создание 16-разрядного сегмента seg000:0000 seg000 segment at 100h private use16 b) Сегмент успешно создан. Атрибут размера сегмента выделен жирным шрифтом. SegAddrng(0x1000,1); c) Вызов функции SegAddrng для изменения разрядности сегмента seg000:00000000 seg000 segment at 100h private e) Разрядность сегмента успешно изменена use32 ??? #верстальщику - change table
Родственные функции: SegCreate Интерактивный аналог: "~View\Segments", <Ctrl-E>; <Alt-S> success SegAlign(long ea,long alignment) Функция управляет выравниванием сегмента, помещая в ассемблерный текст соответствующий атрибут вырывания (byte, word, dword, para, page, mempage). Подробнее о каждом из этих атрибутов можно прочитать в документации, прилагаемой к используемому линкеру. Никакого влияния на дизассемблируемый образ файла функция не оказывает и не выравнивает сегмент в виртуальной памяти. Это подтверждает следующий эксперимент: SegCreate(0x1003,0x2000,0x100,0,0,0); a) создание нового сегмента с адресом начала равным 0x1003 seg000:0003 seg000 segment at 100h private use16 b) сегмент создан; смещение первого байта в сегменте равно трем Message(">1%x\n",SegAlign(0x10 03,saRelWord)); c) вызов функции SegAlign для выравнивания сегмента по границе слова segment word private use16 seg000:0003 seg000 >1 d) результат - функция поместила в ассемблерный текст атрибут выравнивания word (он выделена жирным шрифтом) и сигнализировала об успешном завершении. Но линейный адрес начала сегмента не был изменен (он выделен жирным шрифтом)! Атрибут выравнивания возымеет действие только на стадии компоновки объективного файла, расположив сегмент по адресу, кратным двум. Это приведет к несоответствию смещений в дизассемблируемом и целевом файле, что, скорее всего, вызовет невозможность корректного выполнения откомпилированной программы. Для выравнивания сегмента в виртуальной памяти следует воспользоваться функцией SegBounds для перемещения его начала по заданному адресу. Аргумент ea задает любой линейный адрес, принадлежащий сегменту. Если передать адрес не принадлежащий никакому сегменту, функция возвратит ошибку. Аргумент alignment представляет собой атрибут выравнивания сегмента и может принимать одно из значений, перечисленных в таблице ???
Не поддерживается стандартным линкером LINK. Таблица 5 ??? #верстальщику - change table
Родственные функции: SegCreate Интерактивный аналог: "~View\Segments", <Ctrl-E>; <Alt-S> success SegComb(long segea,long comb) Функция управляет объединением сегментов, помещая в ассемблерный листинг атрибут комбинирования (private, public, common, at, stack). Атрибут комбинирования указывает компоновщику как следует комбинировать сегменты различных модулей, имеющие одно и то же имя. Подробную информацию о каждом из атрибутом можно найти в документации, прилагаемой к используемому линкеру. Аргумент segea задает любой линейный адрес, принадлежащий сегменту. Если передать адрес не принадлежащий никакому сегменту, функция возвратит ошибку. Аргумент comb представляет собой атрибут выравнивания, и может принимать одно из значений, приведенных в Таблице ??? Пример использования: SegCreate(0x10 0 0,0x2 0 0 0,0x10 0,0,0,scPub); a) создаем новый сегмент с атрибутом комбинирования public seg000:0000 seg000 segment at 100h public b) сегмент успешно создан, атрибут комбинирования выделен жирным шрифтом SegComb(0x10000,scStack); c) вызываем функцию SegComb для изменения атрибута комбинирования сегмента seg000:0000 seg000 segment at 100h stack d) атрибут комбинирования изменен
Таблица 6 ??? #верстальщику - change table 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 |