Анимация
JavaScript
|
Главная Библионтека
long MK FP (long seg,long off) Функция преобразует сегментный адрес в линейный по следующей схеме ea = seg * 0x10 + off. Перед ее использованием необходимо убедится что "seg" представляет собой именно базовый адрес сегмента, выраженный в параграфах, а не селектор, иначе полученный результат будет неверен. Оператор "квадратные скобки" полностью аналогичен функции MK FP, но обладает более компактной формой записи (6 символов "MK FPO" вместо двух "[]"). Замечание: в комментариях, содержащихся в файле <idc.idc>, часто используется конструкция ["имя сегмента", смещение]. Попытка использования этой схематической конструкции в коде скриптов приведет к появлению синтаксической ошибки, но если передать имя сегмента в строковой переменной, оператор «квадратные скобки» автоматически подставит его базовый адрес - если, конечно, такой сегмент существует; в противном случае строка будет преобразована в число, согласно правилам преобразования «строка- число» в IDA-Cu (см. «Язык скриптов IDA Си» - «Объявление переменных, типы переменных, преобразования переменных») Напротив, макрос MK FP всегда преобразует переданное ему имя сегмента в строку, даже если сегмент с таким именем существует. Пример использования: Message(">[seg %X,off%X]=%X=%X\n",0x1000,0x6,MK FP(0x1000,0x6),[0x1000,0x6]); >[seg 1000,off6]=10006=10006 ??? #верстальщику - change table
Родственные функции: оператор [] Интерактивный аналог: "~View\Calculate" <?> char atoa(long ea) Функция преобразует линейный адрес ea в строковой сегментный, действуя по следующему алгоритму: • если линейный адрес ea принадлежит некоторому сегменту, смещение вычисляется относительно его базового адреса, а сам адрес записывается в виде "имя сегмента:смещение" • если линейный адрес ea не принадлежит ни одному сегменту, преобразование выполняется по формуле seg = 0x10; off = ea - seg. Пример использования: Message(">%s\n",atoa(0x2 00010)); >0:00200010 SegCreate(0x200000,0x201000,0x20000,0,0,0); 0. Creating a new segment (002 00000-002 01000) ...... OK Message(">%s\n",atoa(0x2 00010)); >seg000:0010 ??? #верстальщику - change table
Родственные функции: нет Интерактивный аналог: нет success SegCreate(long startea,long endea,long base,long use32,long align,long comb) Функция создает новый сегмент. Сегмент задается линейным адресом начала (startea), линейным адресом конца (endea) и базовым адресом (BASE), использующимся для адресации ячеек внутри сегмента. Адрес начала задает наименьший линейный адрес, принадлежащий данному сегменту, напротив, адрес конца, задает линейный адрес на единицу превышающий наибольший адрес, принадлежащий указанному сегменту. Такая мера необходима для поддержки сегментов нулевой длинны - в силу архитектурных ограничений IDA, один линейный адрес не может является и началом, и концом сегмента одновременно, поэтому, приходится «искусственно» увеличивать адрес конца сегмента. Смещение первого байта внутри сегмента вычисляется по формуле startoffset = startea - BASE * 0x10 . Поддержка базирования позволяет создавать сегменты с произвольным начальным смещением, например, равным 0x100. Поскольку, смещения выражаются неотрицательными величинами, начальный адрес должен быть не меньше базы сегмента, измеряемой в байтах. Напротив, базовый адрес по известному адресу начала сегмента и смещению startea - startoffset первого байта в сегменте вычисляется по формуле BASE =-0xT0- Атрибут use32 задает разрядность сегмента - нулевое значение соответствует 16-разрядному сегменту, любое другое - 32-разрядному. Разрядность оказывает влияние только на способ дизассемблирования машинных инструкций, принадлежащих этому сегменту, но независимо от разрядности смещения в сегменте всегда задаются 32-битовыми значениями. Атрибут align задает кратность выравнивания сегмента, помещая соответствующую директиву в ассемблерный листинг. Никакого влияния на размещение сегмента в виртуальной памяти атрибут align не оказывает! Атрибут comb задает флаг комбинирования, разрешающий (запрещающий) линкеру объединять несколько сегментов в один. Никакого влияния на объединение сегментов в виртуальной памяти атрибут comb не оказывает - независимо от его значения смежные сегменты не будут автоматически объединены. Детали: а) Базовый адрес задается неотрицательным 16-разрядным значением и может с: - 0x10000 * 0x10 Л ,- адресовать не более одного мегабайта памяти I-1024 * 1024 =1J. Если этого недостаточно, следует указать вместо базового адреса селектор, который необходимо предварительно создать вызовом функции SetSelector. Если базовый адрес, переданный функции SegCreate, больше 0x10000, IDA автоматически создаст новый селектор и использует его для адресации данного сегмента. б) Если передать линейный адрес, принадлежащий некоторому сегменту, но отличный от адреса начала (т.е. попытаться создать вложенный сегмент), функция автоматически укорит или разобьет данный сегмент и создаст новый (см. рисунок) seg000-> -1-I SegCreate(x,y, seg000-> seg001-> seg002-> 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 |