Анимация
JavaScript
|
Главная Библионтека
Родственные функции: SegCreate Интерактивный аналог: "~View\Segments", <Ctrl-E>; <Alt-S> success SegClass(long ea,char class) Функция изменяет атрибут класса сегмента, помещая в ассемблерный листинг атрибут класса. Атрибут класса представляет собой текстовую строку, указывающую линкеру порядок следования сегментов. Если это не запрещено комбинаторным атрибутом (см. описание SegComb), линкер объединяет вместе сегменты с одинаковым именем. Рекомендуется назначать имена так, чтобы они отображали функциональное назначение сегментов, например, "CODE", "DATA", "STACK" и т.д. Общепринятые имена перечислены в таблице ???. Замечание: большинство линкеров требуют, чтобы в объективном файле присутствовал хотя бы один сегмент с именем "CODE", в противном случае, они могут отказаться обрабатывать такой файл или обработают его неправильно. Пример использования: SegCreate(0x10 0 0,0x2 0 0 0,0,0,scPub); a) создаем сегмент с атрибутом public seg000:0000 seg000 segment at 100h public b) сегмент создан, по умолчанию атрибут класса сегмента отсутствует SegClass(0x1000,"MySegment"); c) вызываем функцию SegClass для изменения атрибута класса сегмента seg000:0000 seg000 segment at 100h public MySegment d) атрибут класса сегмента изменен (в тексте он выделен жирным шрифтом)
Таблица 7 Общепринятые наименования классов сегментов ??? #верстальщику - change table
Родственные функции: SegCreate Интерактивный аналог: "~View\Segments", <Ctrl-E>; <Alt-S> success SegDefReg(long ea,char reg,long value) Функция определяет значение сегментных регистров, помещая в ассемблерный текст директиву ASSUME. Это указывает дизассемблеру (ассемблеру) к какому именно сегменту обращается тот или иной адресный операнд. Более подробную информацию по этому вопросу можно получить, обратившись к описанию директивы ASSUME в документации, прилагаемой к используемому ассемблеру или справочной (учебной) литературе по языку ассемблера. Аргумент ea задает любой линейный адрес, принадлежащий сегменту, в которой необходимо поместить директиву ASSUME. Аргумент reg задает сегментный регистр в символьном представлении, например, "DS","ES","SS" и т.д. Строчечные и прописные символы не различаются. Тип процессора при назначении сегментного регистра учитывается. Аргумент value содержит базовый адрес сегмента, загружаемый в регистр и выраженный в параграфах. Если сегмента с указанным базовым адресом не существует, регистр приобретает неопределенное ("nothing") значение. В реализации этой функции допущена одна ошибка - независимо от успешности выполнения, возвращаемое значение никогда не сигнализирует об ошибке. Пример использования (см. файл "assume.idb", содержащийся на диске, прилагаемом к книге): пусть имеется один сегмент кода ("seg00") и два сегмента данных ("seg001" и "seg002"), содержащих переменные "My666" и "My777" соответственно. По умолчанию значения сегментных регистров неопределенны и IDA не может определить к каким именно сегментам происходит обращения в командах "mov ax,ds:[0]" и "mov dx,es:[0]", поэтому, вынуждена оставить операнды в виде непосредственных смещений. (в тексте они выделены жирным шрифтом) seg000:0000 seg000 segment byte public CODE seg000:0000 assume cs:seg000 seg000:0000 assume es:nothing, ss:nothing, ds:nothing seg000:0000 nov ax, ds:0 seg000:0003 mov dx, es:0 seg000:0003 seg000 ends seg000:0003 seg001:0000 ; seg001:0000 seg001:0000 ; Segment type: Pure data seg001:0000 seg001 segment byte public DATA seg001:0000 assume cs:seg001 seg001:0000 My666 dw 6666h seg001:0000 seg001 ends seg001:0000 seg002:0000 ; seg002:0000 seg002:0000 ; Segment type: Pure data seg002:0000 seg002 segment byte public DAT seg002:0000 assume cs:seg002 seg002:0000 My777 dw 7777h seg002:0000 seg002 ends Задать значения сегментных регистров можно с помощью функции DefSegReg, вызов которой может выглядеть так: DefSegReg(SegByName("seg000"), "DS", SegByName("seg001")»4); DefSegReg(SegByName("seg000"), "ES", SegByName("seg002")»4); В результате ее выполнения, IDA смогла отследить обращения к переменным, автоматически подставив их имена вместо смещений (в тексте они выделены жирным шрифтом). Поместив курсор в границы того или другого имени, нажатием клавиши <Enter> можно перейти к соответствующей ячейке памяти. seg000:0000 seg000 segment byte public CODE seg000:0000 assume cs:seg000 seg000:0000 assume es:seg002, ss:nothing, ds:seg001 seg000:0000 mov ax, seg000:0003 mov dx, es:777 seg000:0003 seg000 ends seg000:0003 seg001:0000 ; seg001:0000 seg001:0000 ; Segment type: Pure data seg001:0000 seg001 segment byte public DATA seg001:0000 assume cs:seg001 seg001:0000 My666 dw 6666h ; DATA XREF: seg000:0000r seg001:0000 seg001 ends seg001:0000 seg002:0000 ; seg002:0000 seg002:0000 ; Segment type: Pure data seg002:0000 seg002 segment byte public DATA seg002:0000 assume cs:seg002 seg002:0000 My777 dw 7777h ; DATA XREF: seg000:0003r seg002:0000 seg002 ends seg002:0000 ??? #верстальщику - change table
Родственные функции: нет Интерактивный аналог: "~Edit\Segments\Change segment register value", <Alt-G> 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 |