Описание функций встроенного языка
Скачать 2.86 Mb.
|
Функция отображает операнд (операнды) в шестнадцатеричном виде, добавляя в его конце суффикс ‘h’. Пример использования: seg000:0000 mov ax,65 a) исходные данные OpHex(SegByName(“seg000”),1); b) вызов функцию OpHex для преобразования второго слева операнда в шестнадцатеричный вид. seg000:0000 mov ax, 41h с) результат – второй слева операнд преобразован в шестнадцатеричный вид ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n операнд ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 успешное завершение операции return ==0 ошибка 125 Родственные функции: OpBinary, OpOctal, OpDeciminal,. OpChr, OpNumer Интерактивный анлог: «Edit\Operand types\Hexadeciminal»; success OpChr(long ea,int n) 126 ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды ==-1 все операнды =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: OpBinary, OpOctal, OpDeciminal,. OpHex, OpNumer Интерактивный анлог: «Edit\Operand types\Chaster»; Функция отображает операнд (операнды) в форме исчисления принятой по умолчанию. По умолчанию системой исчисления по умолчанию назначена шестнадцатеричная система исчисления. Пример использования: seg000:0000 mov ax,65 a) исходные данные OpNumber(SegByName(“seg000”),1); b) вызов функцию OpNumber для преобразования второго слева операнда в систему исчисления по умолчанию. seg000:0000 mov ax, 41h с) результат – второй слева операнд преобразован в шестнадцатеричный вид ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n операнд ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: OpBinary, OpOctal, OpDeciminal,. OpHex, OpChr. Интерактивный анлог: «Edit\Operand types\ Number»; <#> success OpOff(long ea,int n,long base) Функция отображает операнд (операнды) в виде смещения относительно заданного сегмента, автоматически создавая автогенерируемую метку по целевому адресу (если целевой адрес не имеет метки) и перекрестную ссылку соответствующего типа (см. главу «Перекрестные ссылки»). Разрядность операнда, представляемого в виде смещения, должна быть равна разрядности соответствующего сегмента, иначе функция возвратит ошибку. Аргумент ea задает линейный адрес элемента, которому принадлежит 127 операнд. Аргумент base задает базовый адрес сегмента, выраженный в байтах (не параграфах!) относительного которого отсчитывается смещение. Аргумент n задает операнд, отображаемый в виде смещения (см. таблицу). Для выполнения обратной операции, т.е. преобразованию смещения к непосредственному значению, достаточно передать функции нулевой базовый адрес сегмента. Пример использования: seg000:0100 start proc near seg000:0100 mov ah, 9 seg000:0102 mov dx, 108h seg000:0105 int 21h seg000:0107 retn seg000:0107 start endp seg000:0107 seg000:0107 ; ────────────────────────────────────────── seg000:0108 db 'Hello,World!',0Dh,0Ah,'$ seg000:0108 seg000 ends a) исходные данные OpOff(SegByName("seg000")+0x102,1,SegByName("seg000")); b) вызов функции OpOff для отображения константы, загружаемой в регистр DX в виде смещения относительно текущего сегмента seg000:0100 start proc near seg000:0100 mov ah, 9 seg000:0102 mov dx, offset asc_0_108 ; "Hello,World!\r\n$" seg000:0105 int 21h seg000:0107 retn seg000:0107 start endp seg000:0107 seg000:0107 ; ────────────────────────────────────────────────────────── seg000:0108 asc_0_108 db 'Hello,World!',0Dh,0Ah,'$' ; DATA XREF: start+2o seg000:0108 seg000 ends с) результат – константа, загружаемая в регистр DX отображена в виде смещения, предваренного директивой “offset”, автоматически создана метка и перекрестна ссылка (в тексте они выделены жирным шрифтом). Ближайший аналог (Edit\Operad types\Offset by any segment) ??? #Верстальщику – change table аргумент пояснения ea линейный адрес элемента, котрому принадлежит операнд =n пояснения ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды base базовый адрес сегмента, выраженный в байтах (не параграфах!) относительного которого отсчитывается смещение =return пояснения return ==1 успешное завершение операции 128 ==0 ошибка Родственные функции: OpOffEx Интерактивный аналог: “Edit\Operad types\Offset by any segment”; Функция отображает операнд (операнды) в виде смещения, отсчитываемого от любого заданного адреса, не обязательно совпадающего с базовым адресом сегмента. Такая необходимость возникает например в случае обращения к элементу структуры, смещение которого требуется отсчитывать относительно начала этой структуры. Данная функция является усовершенствованным вариантом функции OpOff и поддерживает не только смещения, разрядность которых равна разрядности соответствующего сегмента, но смещения записанные в восьми или шестнадцати младших (старших) битах шестнадцати и тридцати двух разрядных операндов соответственно (см. таблицу ???). При этом остальные биты операнда маскируются операцией «логического и» AND. Аргумент ea задает линейный адрес элемента, которому принадлежит операнд. Аргумент n задает операнд, отображаемый в виде смещения (см. таблицу ???) Аргумент reftype задает тип смещения и может принимать одно из значений, перечисленных в таблице ??? Аргумент target задает линейный адрес целевого смещения выраженный в байтах, относительного которого будет отсчитыватся смещение операнда. Если в качестве целевого смещения передать значение BADADDR, целевое смещение будет вычислено автоматически по следующей формуле: target = operand_value - tdelta +base Аргрумент base задает базовый адрес сегмента, выраженный в байтах, относительно которого задается целевое смещение. Аргумент tdelta задает относительное смещение, отсчитываемое относительно целевого смещения.Относительное смещение может быть как положительным, так и отрицательным. Если оно равно нулю, то данная функция становится эквивалентна функции OpOff (см. описание функции OpOff). Значение операнда должно соответствовать следующему соотношению operand_value = target + tdelta - base, в противном случе функция вернет ошибку. определение # тип смещения REF_OFF8 0 8-битное смещение REF_OFF16 1 16-битное смещение REF_OFF32 2 32-битное смещение REF_LOW8 3 смещение представлено 8 младшими битами 16 битного непосредственного значенияt REF_LOW16 4 смещение представлено 16 младшими битами 32 битного непосредственного значенияt REF_HIGH8 5 смещение представлено 8 старшими битами 16 битного непосредственного значенияt REF_HIGH16 6 смещение представлено 16 старшими битами 32 битного непосредственного значенияt 129 Таблица 14 Пример использования: seg000:0100 start: seg000:0100 mov ax, 105h seg000:0103 retn seg000:0103 ; ──────────────────────────────────── seg000:0104 MyStruc db 0 seg000:0105 dw 6666h seg000:0107 dw 9999h seg000:0107 seg000 ends seg000:0107 a) исходные данные – требуется представить непосредственное значение, загружаемое в регистр AX в виде смещения, отсчитываемого относительного начала струкуры MyStruc. OpOffEx(SegByName("seg000")+0x100,1,REF_OFF16, SegByName("seg000")+0x104,SegByName("seg000"),1); b) вызов функции OpOffEx для представления непосредственного значения в виде смещения, отсчитываемого относительно начала структуры MyStruc. Пояснение: линейный адрес структуры MyStruc равен SegByName(“seg000”)+0x104, следовательно, целевой адрес tagreg равен SegByName(“seg000”)+0x104; базовый адрес сегмента, которому принадлежит структура, будучи выраженным в байтах равен SegNyName(“seg000”), следовательно, аргумент base равен SegByName(“seg000”); смещение искомого элемента относительно начала структуры равно operand_value – offset MyStruc, т.е. в непосредственных значениях – 0x105 – 0x104 = 1, следовательно, аргумент tdelta равен 1; операнд представляет собой 16-разрядное непосредственное значение, поэтому, тип смещения - REF_OFF16. seg000:0100 start: seg000:0100 mov ax, offset MyStruc+1 seg000:0103 retn seg000:0103 ; ────────────────────────────────────────── seg000:0104 MyStruc db 0 ; DATA XREF: seg000:0100o seg000:0105 dw 6666h seg000:0107 dw 9999h seg000:0107 seg000 ends с) результат – непосредственное значение теперь представлено в виде смещения, отсчитываемого от начала структуры MyStruc Замечение: в данном примере было допустимо использовать автоматическое определение целевого адреса, однако, для большей ясности оно было вычислено вручную. ??? #Верстальщику – chabge table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд n ==1 второй слева, третий (если он есть) и все остальные операнды 130 ==-1 все операнды ==reftype # тип смещения ==REF_OFF8 0 8-битное смещение ==REF_OFF16 1 16-битное смещение ==REF_OFF32 2 32-битное смещение ==REF_LOW8 3 смещение представлено 8 младшими битами 16 битного непосредственного значенияt ==REF_LOW16 4 смещение представлено 16 младшими битами 32 битного непосредственного значенияt ==REF_HIGH8 5 смещение представлено 8 старшими битами 16 битного непосредственного значенияt reftype ==REF_HIGH16 6 смещение представлено 16 старшими битами 32 битного непосредственного значенияt ==target пояснения !=BADADDR целевое смещение target ==BADADDR вычислять целевое смещение автоматически по следующей формуле target = operand_value - tdelta +base base базовый адрес сегмента, выраженный в байтах (не параграфах!) tdelta относительное смещение, считаемое относительно целевого смещения; может быть как положительным, так и отрицательным =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: OpOff Интерактивный аналог: “Edit\Operad types\User-defined offset”; Функция отображает операнд (операнды) в виде имени сегмента, базовый адрес которого равен значению операнда. Если сегмента с таким базовым адресом не существует, функция возвращает ошибку. Замечание: в процессе загрузки файла IDA автоматически преобразует все перемещаемые элементы в базовые адреса соответствующих сегментов. Пример использования: seg000:0000 mov ax, 1000h a) исходные данные – требуется представить непосредственный операнд, загружаемый в регистр ax в виде имени сегмента OpSeg(SegByName(“seg000”),1); b) вызов функции OpSeg для преобразования непосредсвтенного операнда в имя сегмента с соответствующим базовым адресом seg000:0000 mov ax, seg seg000 c) результат – непосредственный операнд теперь представлен в виде имени сегмента с соответствующим базовым адресом ??? #Верстальщику – change table аргумент пояснения 131 ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 операция выполнена успешно return ==0 ошибка Родственные функции: нет Интерактивный аналог:” Edit\Operand types\ Segment” Функция отображающая операнды в виде символьной строки, заданной пользователем. Никаких ограничений на переданную строку не налагается – она может содержать любые символы, кроме символа с кодом нуля, служащим признаком конца строки. Пример использования: seg000:0000 mov ax, 9 a) исходные данные OpAlt(SegByName(“seg000”),0,”Регистр AX”); b) вызов функции OpAlt для переименования первого слева операнда в строку «Регистр AX». seg000:0000 mov Регистр AX, 9 c) результат – операнд успешное переименован ??? #Верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 операция выполнена успешно return ==0 ошибка Родственные функции: AltOp Интерактивный аналог: “Edit\Operand types\ Enter operand manually”; Функция отображает операнд в знаковой или целочисленной форме, работая как триггер – если до ее вызова операнд отображался в целочисленной форме, после станет отображаться в знаковой и, соответственно, наоборот. 132 Пример использования: seg000:0000 mov ax, 0FFFFh a) исходные данные – требуется отобразить непосредственное значение, загружаемое в регистр AX в знаковой форме OpSign(SegByName(“seg000”),1); b) вызов функции OpSign для отображения непосредственного значения, загружаемого в регистр AX в знаковой форме seg000:0000 mov ax,-1 с) результат - непосредственное значение, загружаемое в регистр AX теперь отображается в знаковой форме. ??? #Верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n пояснения ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 операция выполнена успешно return ==0 ошибка Родственные функции: нет Интерактивный аналог: “Edit\Operand types\ Change Sign”; <-> success OpStkvar(long ea,int n) Функция отображает непосредственное значение, используемые для базовой адресации относительно регистров BP (EBP) и SP (ESP) в виде стековой переменной. Сама стековая переменная должна быть предварительно создана вызовом MakeLoacal (см. описание функции MakeLocal). Значение регистров BP (EBP) и SP (ESP) IDA в каждой точке программы IDA по возможности определяет автоматически, облегчая тем самым анализ кода, генерируемого оптимизируемыми компиляторами, использующими для адресации локальных переменных регистр SP (ESP) значение которого подвержено частым изменениям. Для ручного задания значения регистра SP (ESP) предусмотрена функция SetSpDiff, к вызову которой приходится прибегать в случае невозможности определить значение стекового регистра автоматическим анализатором. Замечание: IDA эмулирует выполнения некоторых наиболее употребляемых инструкций, таких как PUSH, POP, ADD, SUB и т.д., для отслеживания изменения значения регистра SP (ESP). Более сложные операции с регистрами пока не поддерживаются. Пример использования: seg000:0000 start proc near seg000:0000 mov bp, sp seg000:0002 sub sp, 10h 133 seg000:0005 mov word ptr [bp-2], 666h seg000:000A add sp, 10h seg000:000D retn seg000:000D start endp а) исходные данные – требуется представить непосредственное знаечние, вычитаемое из регистра bp в виде имени локальной переменной. MakeLocal(SegByName(“seg000”),SegByName(“seg000”)+0xD,"[BP-2]","MyVar"); b) вызов функции MakeLocal (см. описание MakeLocal) для создания локальной переменной MyVar, расположенной двумя байтам «выше» конца кадра стека OpStkvar(SegByName(“seg000”),0); c) вызов функции OpStkvar для отображения непосредственного значения в виде имени ранее созданной локальной переменной seg000:0100 start proc near seg000:0100 seg000:0100 MyVar = word ptr -2 seg000:0100 seg000:0100 mov bp, sp seg000:0102 sub sp, 10h seg000:0105 mov [bp+MyVar], 666h seg000:010A add sp, 10h seg000:010D retn seg000:010D start endp d) результат – непосредственное значение отображено в виде имени локальной переменной MyVar (в тексте она выделена жирным шрифтом) |