Описание функций встроенного языка
Скачать 2.86 Mb.
|
seg000:0000 aHelloSailor db 'Hello, Sailor' a) исходные данные Message(“>%x\n”,MakeByte(SegByName(“seg000”))); b) вызываем функцию MakeByte для преобразования элемента типа «строка» в элемент типа «байт», передавая ей линейный адрес головы данного элемента seg000:0000 aHelloSailor db 48h seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o seg000:0005 db 2Ch ; , seg000:0006 db 20h ; seg000:0007 db 53h ; S seg000:0008 db 61h ; a seg000:0009 db 69h ; i seg000:000A db 6Ch ; l seg000:000B db 6Fh ; o seg000:000C db 72h ; r seg000:000D db 66h ; f >1 c) результат- успешное преобразование; хвост элемента типа строка преобразован в бестиповые байты. 3. эксперимент seg000:0000 aHelloSailor db 'Hello, Sailor' a) исходные данные Message(“>%x\n”,MakeByte(1+SegByName(“seg000”))); b) вызываем функцию MakeByte для преобразования ячейки, принадлежащей хвосту элемента данных типа «строка», в элемент типа «байт». seg000:0000 aHelloSailor db 'Hello, Sailor' >0 c) результат – функция возвратила ошибку, не выполнив преобразования 4. эксперимент seg000:0000 PUSH AX a) исходные данные Message(“>%x\n”,MakeByte(1+SegByName(“seg000”))); b) вызываем функцию MakeByte для преобразования элемента кода в элемент данных типа байт seg000:0000 PUSH AX >0 c) результат – функция возвратила ошибку, не выполнив преобразования ??? #Верстальщику – change table аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных 100 =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeWord, MakeDword, MakeQword, MakeFloat, MakeDouble, MakePAckReal, MakeTbyte. Интерактивный аналог: “Edit\Data”; Функция создает по переданному ей линейному адресу ea элемент данных типа слово, длиной два байта. Порядок следования младших и старших байт зависит от выбранного процессора. На микропроцессорах серии Intel 80x86 младший байт располагается по меньшему адресу и, соответственно, наоборот. Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в слово, а хвост элемента (если он есть) – в бестиповые байты. Если размер элемента недостаточен для преобразования, но следом за его хвостом находятся бестиповые байты, они будут автоматически присоединены к новому элементу. В противном случае (если размер элемента недостаточен для преобразования, а следом за его хвостом находится другой элемент не находится ничего) функция возвратит ошибку не выполнив преобразования. Для выполнения такого преобразования необходимо предварительно уничтожить мешающие элементы вызовом MakeUnkn (см. описание функции MakeUnkn) Ошибка возвратится и в том случае если по переданному функции линейному адресу находится хвост элемента данных, голова или хвост элемента кода. Если хотя бы один из двух байт имеет неинициализированное значение, все слово приобретает неинициализированное значение. Пример использования: 1. эксперимент seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored a) исходные данные Message(“>%x\n”,MakeWord(SegByName(“seg000”))); b) вызываем функцию MakeWord для создания нового элемента данных типа слово, передавая ей адрес цепочки из двух бестиповых байта seg000:0000 dw ? >1 с) результат – элемент данных типа слво успешно создан 2. эксперимент seg000:0000 db ? ; unexplored seg000:0001 db ? a) исходные данные Message(“>%x\n”,MakeWord(SegByName(“seg000”))); b) вызываем функцию MakeWord для создания нового элемента данных типа слово, передавая ей адрес бестипового байта seg000:0000 db ? ; unexplored seg000:0001 db ? 101 >0 c) результат – функция завершилась с ошибкой, т.к. для создания нового элемента не достаточно места – по адресу seg000:0001 находится элемент данных типа байт, который не может быть автоматически присоединен к слову. Для выполнения преобразования его необходимо уничтожить вызовом MakeUnkn MakeUnkn(SegByName("seg000")+1,0); d) вызываем функцию MakeUnkn для удаления элемента данных, расположенного по адресу “seg000:0001” seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored e) резултат – элемент данных успешно разрушен. Message(“>%x\n”,MakeWord(SegByName(“seg000”))); f) повторно вызываем функцию MakeWord, на этот раз передавая ей адрес цепочки из двух бестиповых байт seg000:0000 dw ? >1 g) результат – элемент данных типа слво успешно создан ??? #Верстальщику – change table аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeByte, MakeDword, MakeQword, MakeFloat, MakeDouble, MakePAckReal, MakeTbyte. Интерактивный аналог: “Edit\Data”; Функция создает по переданному ей линейному адресу ea элемент данных типа двойное слово, длиной четыре байта. Порядок следования младших и старших байт зависит от выбранного процессора. На микропроцессорах серии Intel 80x86 младший байт располагается по меньшему адресу и, соответственно, наоборот. Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в двойное слово, а хвост элемента (если он есть) – в бестиповые байты. Если размер элемента недостаточен для преобразования, но следом за его хвостом находятся бестиповые байты, они будут автоматически присоединены к новому элементу. В противном случае (если следом за его хвостом находится другой элемент не находится ничего) функция возвратит ошибку не выполнив преобразования. Для выполнения такого преобразования необходимо предварительно уничтожить мешающие элементы вызовом MakeUnkn (см. описание функции MakeUnkn) Ошибка возвратится и в том случае если по переданному функции линейному адресу находится хвост элемента данных, голова или хвост элемента кода. Если хотя бы один из двух байт имеет неинициализированное значение, все двойное слово приобретает неинициализированное значение. Пример использования: 102 1. эксперимент seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 db ? ; unexplored seg000:0003 db ? ; unexplored a) исходные данные Message(“>%x\n”,MakeDword(SegByName(“seg000”))); b) вызываем функцию MakeDword для создания нового элемента данных типа двойное слово, передавая ей адрес цепочки из четырех бестиповых байта seg000:0000 dd ? >1 с) результат – элемент данных типа двойное слово успешно создан 2. эксперимент seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 dw ? a) исходные данные Message(“>%x\n”,MakeDword(SegByName(“seg000”))); b) вызываем функцию MakeDword для создания нового элемента данных типа двойное слово, передавая ей адрес бестипового байта seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 dw ? >0 c) результат – функция завершилась с ошибкой, т.к. для создания нового элемента не достаточно места – по адресу seg000:0002 находится элемент данных типа слово, который не может быть автоматически присоединен к двойному слову. Для выполнения преобразования его необходимо уничтожить вызовом MakeUnkn MakeUnkn(SegByName("seg000")+2,0); d) вызываем функцию MakeUnkn для удаления элемента данных, расположенного по адресу “seg000:0002” seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 db ? ; unexplored seg000:0003 db ? ; unexplored e) резултат – элемент данных успешно разрушен. Message(“>%x\n”,MakeDword(SegByName(“seg000”))); f) повторно вызываем функцию MakeDword, на этот раз передавая ей адрес цепочки из четырех бестиповых байт seg000:0000 dd ? >1 g) результат – элемент данных типа слво успешно создан ??? #Верстальщику – change table аргрумент пояснения 103 ea линейный адрес бестипового байта или головы элемента данных =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeByte, MakeWord, MakeQword, MakeFloat, MakeDouble, MakePackReal, MakeTbyte. Интерактивный аналог: “Edit\Data”; Функция создает по переданному ей линейному адресу ea элемент данных типа четвертное слово, длиной восемь байт. Порядок следования младших и старших байт зависит от выбранного процессора. На микропроцессорах серии Intel 80x86 младший байт располагается по меньшему адресу и, соответственно, наоборот. Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в четвертное слово, а хвост элемента (если он есть) – в бестиповые байты. Если размер элемента недостаточен для преобразования, но следом за его хвостом находятся бестиповые байты, они будут автоматически присоединены к новому элементу. В противном случае, если следом за его хвостом находится другой элемент или не находится ничего, функция возвратит ошибку, не выполнив преобразования. Для выполнения преобразования необходимо предварительно уничтожить мешающие элементы вызовом MakeUnkn (см. описание функции MakeUnkn). Ошибка возвратится и в том случае если по переданному функции линейному адресу находится хвост элемента данных, голова или хвост элемента кода. Если хотя бы один из двух байт имеет неинициализированное значение, все двойное слово приобретает неинициализированное значение. Пример использования: seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 db ? ; unexplored seg000:0003 db ? ; unexplored seg000:0004 db ? ; unexplored seg000:0005 db ? ; unexplored seg000:0006 db ? ; unexplored seg000:0007 db ? ; unexplored a) исходные данные Message(“>%x\n”,MakeQword(SegByName(“seg000”))); b) вызываем функцию MakeQword для создания нового элемента данных типа четвертное слово, передавая ей адрес цепочки из восьми бестиповых байта seg000:0000 dq ? >1 с) результат – элемент данных типа четвертное слово успешно создан ??? #Верстальщику – change table аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных =return пояснения return ==1 успешное завершение 104 ==0 ошибка Родственные функции: MakeByte, MakeWord, MakeDword, MakeFloat, MakeDouble, MakePackReal, MakeTbyte. Интерактивный аналог: (“Options\Setup data types”;
105 аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeByte, MakeWord, MakeDword, MakeQword, MakeDouble, MakePackReal, MakeTbyte. Интерактивный аналог: (“Options\Setup data types”; Замечение: для включения типа «четвертного слова» в список типов данных, пролистываемых нажатием клавиши “Setup data types” установить галочку напротив пункта “Float ”. success MakeDouble(long ea) Функция создает по переданному ей линейному адресу ea элемент данных типа double, длиной восемь байт. Представление типа double зависит от выбранного процессора. На микропроцессорах серии Intel 80x86 он имеет следующее строение (см. рисунок ???) З н а к Порядок (11 бит) мантисса (52 бит) Рисунок 24 Представление типа double на микропроцессорах серии Intel 80x86 Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в четвертное слово типа double, а хвост элемента (если он есть) – в бестиповые байты. Если размер элемента недостаточен для преобразования, но следом за его хвостом находятся бестиповые байты, они будут автоматически присоединены к новому элементу. В противном случае, если следом за его хвостом находится другой элемент или не находится ничего, функция возвратит ошибку, не выполнив преобразования. Для выполнения преобразования необходимо предварительно уничтожить мешающие элементы вызовом MakeUnkn (см. описание функции MakeUnkn). Ошибка возвратится и в том случае если по переданному функции линейному адресу находится хвост элемента данных, голова или хвост элемента кода. Если хотя бы один из восьми байт имеет неинициализированное значение, все четверное слово приобретает неинициализированное значение. Пример использования: seg000:0000 db 48h ; H seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o seg000:0005 db 2Ch ; , seg000:0006 db 20h ; seg000:0007 db 53h ; S a) исходные данные 106 Message(“>%x\n”,MakeDouble(SegByName(“seg000”))); b) вызываем функцию MakeDouble для создания нового элемента данных типа double, передавая ей адрес цепочки из восьми бестиповых байта seg000:0000 dq 2.635692361932979e92 >1 с) результат – элемент данных типа double успешно создан ??? #Верстальщику – change table аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeByte, MakeWord, MakeDword, MakeQword, MakeQword, MakePackReal, MakeTbyte. Интерактивный аналог: (“Options\Setup data types”; Замечение: для включения типа «четвертного слова» в список типов данных, пролистываемых нажатием клавиши “Setup data types” установить галочку напротив пункта “Double ”. success MakePackReal(long ea) Функция создает по переданному ей линейному адресу ea элемент данных типа packed real, занимающий в результате от обстоятельств от десяти до двенадцати байт. Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в packed real, а хвост элемента (если он есть) – в бестиповые байты. Если размер элемента недостаточен для преобразования, но следом за его хвостом находятся бестиповые байты, они будут автоматически присоединены к новому элементу. В противном случае, если следом за его хвостом находится другой элемент или не находится ничего, функция возвратит ошибку, не выполнив преобразования. Для выполнения преобразования необходимо предварительно уничтожить мешающие элементы вызовом MakeUnkn (см. описание функции MakeUnkn). Ошибка возвратится и в том случае если по переданному функции линейному адресу находится хвост элемента данных, голова или хвост элемента кода. Если один или более байт имеют неинициализированное значение, они никак не влияют на содержимое остальных и вся цепочка байт packed real не принимает неинициализированного значения. Пример использования: seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 db ? ; unexplored seg000:0003 db ? ; unexplored seg000:0004 db ? ; unexplored seg000:0005 db ? ; unexplored seg000:0006 db ? ; unexplored seg000:0007 db ? ; unexplored seg000:0008 db ? ; unexplored seg000:0009 db ? ; unexplored a) исходные данные 107 Message(“>%x\n”,MakePackReal(SegByName(“seg000”))); b) вызываем функцию MakePackReal для создания нового элемента данных типа packed real, передавая ей адрес цепочки из десяти бестиповых байта seg000:0000 db ?, ?, ?, ?, ?, ?, ?, ?, ?, ? >1 с) результат – элемент данных типа packed real успешно создан ??? #Верстальщику – change table аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeByte, MakeWord, MakeDword, MakeFloat, MakeQword, MakeDouble, MakeTbyte. Интерактивный аналог: (“Options\Setup data types”; Замечение: для включения типа «четвертного слова» в список типов данных, пролистываемых нажатием клавиши “Setup data types” установить галочку напротив пункта “Packeed real”. success MakeTbyte(long ea) Функция создает по переданному ей линейному адресу ea элемент данных типа tbyte, длиной десять байт. Порядок следования младших и старших байт зависит от выбранного процессора. На микропроцессорах серии Intel 80x86 младший байт располагается по меньшему адресу и, соответственно, наоборот. Если по данному адресу находится голова ранее созданного элемента данных, функция преобразует его в tbyte, а хвост элемента (если он есть) – в бестиповые байты. Если размер элемента недостаточен для преобразования, но следом за его хвостом находятся бестиповые байты, они будут автоматически присоединены к новому элементу. В противном случае, если следом за его хвостом находится другой элемент или не находится ничего, функция возвратит ошибку, не выполнив преобразования. Для выполнения преобразования необходимо предварительно уничтожить мешающие элементы вызовом MakeUnkn (см. описание функции MakeUnkn). Ошибка возвратится и в том случае если по переданному функции линейному адресу находится хвост элемента данных, голова или хвост элемента кода. Если один или более байт имеют неинициализированное значение, они никак не влияют на содержимое остальных и вся цепочка байт tbyte не принимает неинициализированного значения. Пример использования: seg000:0000 db ? ; unexplored seg000:0001 db ? ; unexplored seg000:0002 db ? ; unexplored seg000:0003 db ? ; unexplored seg000:0004 db ? ; unexplored seg000:0005 db ? ; unexplored seg000:0006 db ? ; unexplored seg000:0007 db ? ; unexplored 108 seg000:0008 db ? ; unexplored seg000:0009 db ? ; unexplored a) исходные данные Message(“>%x\n”,MakeQword(SegByName(“seg000”))); b) вызываем функцию MakeTbyte для создания нового элемента данных типа tbyte, передавая ей адрес цепочки из десяти бестиповых байта seg000:0000 db ?, ?, ?, ?, ?, ?, ?, ?, ?, ? >1 с) результат – элемент данных типа tbyte успешно создан ??? #Верстальщику – change table аргрумент пояснения ea линейный адрес бестипового байта или головы элемента данных =return пояснения ==1 успешное завершение return ==0 ошибка Родственные функции: MakeByte, MakeWord, MakeDword, MakeQword, MakeFloat, MakeDouble, MakePackReal. Интерактивный аналог: (“Options\Setup data types”; Замечение: для включения типа «четвертного слова» в список типов данных, пролистываемых нажатием клавиши “Setup data types” установить галочку напротив пункта “Tbyte. success MakeStr(long ea,long endea) Функция преобразует последовательность бестиповых байт в ASCII-строку, автоматически назначая ей метку, стиль которой задается вызовом “SetLongPrm(INF_STRTYPE)” (см. описание функции SetLongPrm). Аргумент ea задает линейный адрес начала цепочки бестиповых байт или головы элемента данных, преобразуемого в строку. Если по данному адресу находится хвост элемента данных, голова или хвост элемента кода, функция возвратит ошибку, не выполнив преобразования. Аргумент endea задает линейный адрес конца строки. Если передать функции значение BADADDR, то IDA предпримет попытку вычислить адрес конца автоматически. Поддерживаются следующие типы строк – ASCIIZ-строки, заканчивающиеся символом нуля; PASCAL-строки, начинающиеся с байта, содержащего длину строки и DELPHI- строки, начинающиеся со слова (двойного слова), содержащего длину строки. Если строка не принадлежит ни к одному из этих трех типов, концом строки считается: а) первый нечитабельный ASCII-символ. Перечень читабельных символов содержится в поле “AsciiStringChars” конфигурационного файла da.cfg>. Любой символ, не входящий в этот список, трактуется ограничителем длины строки. По умолчанию содержимое поля “AsciiStringChars” для кодировки cp866 следующее: "\r\n\a\v\b\t\x1B" " !\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "`abcdefghijklmnopqrstuvwxyz{|}" 109 "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" "абвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐" "└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀" "рстуфхцчшщъыьэюя"; b) неинициализированный байт c) голова элемента кода или данных d) конец сегмента Если на пути от адреса начала строки до адреса ее конца встретится хотя бы один неинициализированный байт, элемент кода или данных, функция возвратит ошибку без преобразования строки. Замечание: вплоть до версии 3.85 эта функция была реализована с ошибкой и передача значения BADADDR не приводила к автоматическому определиению конца строки. Пример использования: seg000:0000 db 48h ; H seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o seg000:0005 db 2Ch ; , seg000:0006 db 20h ; seg000:0007 db 53h ; S seg000:0008 db 61h ; a seg000:0009 db 69h ; i seg000:000A db 6Ch ; l seg000:000B db 6Fh ; o seg000:000C db 72h ; r seg000:000D db 0 ; а) исходные данные – ASCIIZ-строка. MakeStr(SegByName(“seg000”),BADADDR); b) вызываем функцию MakeStr для преобразования цепочки бестиповых байтов в ASCII-строку с автоматическим определением ее конца seg000:0000 aHelloSailor db 'Hello, Sailor',0 с) результат – успешное создание строки с автоматическим назначением метки, состоящей из допустимых в имени символов ??? #Верстальщику change table аргумент пояснения ea линейный адрес начала цепочки бестиповых байт или головы элемента данных !=BADADDR линейный адрес коцна строки endea ==BADADDR указание вычислять адрес конца строки автоматически =return пояснения ==1 успешное завершение операции return ==0 ошибка 110 Родственные функции: нет Интерактивный аналог: “Edit\ASCII”; Замечение: при нажатии клавиши , IDA пытаестя создать по текущему адресу, ASCII-строку автоматически определяя ее длину. Для явного задания требуемой длины, необходимо предварительно выделить соответствующую область курсорными клавишами, удерживаня нажатым удерживая нажатой правую кнопку. success MakeArray(long ea,long nitems) Функция создает массив состоящий из данных одного типа – байтов, слов, двойных слов, четверных слов, двойных слов в формате float, четверных слов в формате double, packed real, tbyte. Бестиповые байты могут стать частью массива любого типа. Строки не могут быть элементами никакого массива. Тип массива определяется типом его первого элемента. Все остальные элементы массива на момент его создания должны быть представлены бестиповыми байтами, - последовательность типизированных данных не может быть преобразована в массив. Элементы массива записываются в строку, отделяясь друг от друга знаком запятой. Если два или более подряд идущих элемента имеют одно и то же значение (в том числе и неинициализированное) для сокращения ассемблерного листинга используется конструкция “DUP”. Аргумент ea задает линейный адрес первого элемента массива или линейный адрес начала цепочки бестиповых байт. Аргумент nitems задает размер массива, выраженный в количестве элементов. Массив создается даже в том случае, когда nitems равен единице. Пример использования: seg000:0000 db 48h ; H seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o seg000:0005 db 2Ch ; , seg000:0006 db 20h ; seg000:0007 db 53h ; S seg000:0008 db 61h ; a seg000:0009 db 69h ; i seg000:000A db 6Ch ; l seg000:000B db 6Fh ; o seg000:000C db 72h ; r a) исходные данные MakeArray(SegByName(“seg000”),14); b) вызываем функцию MakeArray для преобразования последовательности бестиповых байт в массив байт seg000:0000 db 48h, 65h, 2 dup(6Ch), 6Fh, 2Ch, 20h, 53h, 61h, 69h seg000:0000 db 6Ch, 6Fh, 72h, 0 с) результат – успешно созданный массив. Внимание: если все элементы массива не умещаются на одной строке, они 111 автоматически переносятся на следующую, но слева от них указывается не адрес данного элемента массива, а адрес головы массива! Замечание: для изменения размеров массива (усечения или расширения) достаточно передать функции адрес его начала и новую длину. ??? #Верстальщику – change table аргумент пояснения ea линейный адрес первого элемента массива или линейный адрес головы уже существующего массива nitems размер массива, выраженный в количестве элементов =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: нет Интерактивный аналог: “Edit\Array”; <*> success MakeAlign(long ea,long count,long align) Функция помещает в ассемблерный файл директиву выравнивания align и исключает из дизассемблируемого листинга байты, используемые для выравнивания. Замечание: микропроцессоры серии Intel 80x86 используют выравнивание используется для ускорения доступа к данным и инструкциям (подробнее об этом можно технической документации фирмы Intel), но существуют процессоры, которые требуют обязательного выравнивания и при обращении к не выровненным данным (инструкциям) генерируют исключение. Аргумент ea задает линейный адрес первого байта, использующегося для выравнивания. Если по этому адресу расположен хвост элемента данных, голова или хвост элемента кода, функция возвратит ошибку. Аргумент count задает количество байт, использующихся для выравнивания. Значение count должно быть больше нуля и меньше кратности выравнивания, т.е. 2 align > count > 0, в противном случае функция возвратит ошибку. Аргумент align задает кратность выравнивания и представляет собой показатель степени с основанием два. Т.е. если align равен четырем, то кратность выравнивания – шестнадцати, т.к. 2 4 =16. Если align равен нулю, функция определяет необходимую степень выравнивания автоматичен, используя наибольшее возможное значение. Для изменения величины выравнивания достаточно передать функции MakeAlign линейный адрес уже существующей директивы Align и новые значения count и align. Пример использования: seg000:0000 db 48h ; H seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o a) исходные данные MakeAlign(SegByName(“seg000”)+1,3,2); 112 b) вызываем функцию MakeAlign для помещения по адресу seg000:0001 директивы align 4. Для выравнивания используются три байта – seg0001, seg0002 и seg0003. seg000:0000 db 48h ; H seg000:0001 align 4 seg000:0004 db 6Fh ; o c) результат – успешное создание директивы выравнивания ??? #верстальщику – change table аргумент пояснения ea линейный адрес первого байта, использующегося для выравнивания или уже существующей директивы align count число байт, использующихся для выравнивания =align пояснения ==[1..5] показатель степени выравнивания с основанием два align ==0 автоматическое определение кратности выравнивания =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: нет Интерактивный аналог: “Edit\Structs\Other\ Create alignment directive”; Функция создает по указанному адресу элемент кода, выполняя дизассемблирование первой машинной инструкции. Если это возможно, автоматически дизассемблируется и другие инструкции. Это происходит в следующих случаях: а) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты; b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование. Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки. Подробнее об этом можно прочитать в главах «Перекресые ссылки» и «Глобальные настойки» соотвественно. Замечание: IDA эмулирует выполнение кода на виртуальном процессоре, с целью отслеживания изменения регистра указателя команд, и дизассемблирует все инструкции, на которые он указывает или может указывать при определенных обстоятельствах. Благодаря этому дизассемблируется все вызываемые функции, условные переходы и все косвенные ссылки, которые IDA в состоянии распознать (например, если это не запрещено настойками, она может автоматически преобразовывать 32-разрядные непосредственные операнды по модулю больше 0x10000 в смещения на код – см. главу «Глобальные настойки»). При успешном завершении функция возвращает длину первой дизассемблированной инструкции, выраженную в байтах, в противном случае возвращается ноль, сигнализируя об ошибке. 113 Переча линейного адреса головы уже существующего элемента кода, привет к повторному анализу инструкции; будут заново созданы перекрестные ссылки, авто генерируемые метки и т.д., а функция возвратит длину инструкции, расположенной по линейному адресу ea. Пример использования: seg000:0100 start db 83h ; Г seg000:0101 db 0C6h ; ╞ seg000:0102 db 6 ; seg000:0103 db 0FFh ; seg000:0104 db 0E6h ; ц seg000:0105 db 0B9h ; ╣ seg000:0106 db 0BEh ; ╛ seg000:0107 db 14h ; seg000:0108 db 1 ; seg000:0109 db 0ADh ; н seg000:010A db 91h ; С seg000:010B db 56h ; V seg000:010C db 80h ; А seg000:010D db 34h ; 4 seg000:010E db 66h ; f seg000:010F db 46h ; F seg000:0110 db 0E2h ; т seg000:0111 db 0FAh ; · seg000:0112 db 0FFh ; seg000:0113 db 0E6h ; ц seg000:0114 db 18h ; seg000:0115 db 0 ; a) исходные данные Message(">%X\n",MakeCode(SegByName("seg000")+0x100)); b) вызываем функцию MakeCode для дизассемблирования кода seg000:0100 add si, 6 seg000:0103 jmp si seg000:0103 ; ─────────────────────────── seg000:0105 db 0B9h ; ╣ seg000:0106 db 0BEh ; ╛ seg000:0107 db 14h ; seg000:0108 db 1 ; seg000:0109 db 0ADh ; н seg000:010A db 91h ; С seg000:010B db 56h ; V seg000:010C db 80h ; А seg000:010D db 34h ; 4 seg000:010E db 66h ; f seg000:010F db 46h ; F seg000:0110 db 0E2h ; т seg000:0111 db 0FAh ; · seg000:0112 db 0FFh ; seg000:0113 db 0E6h ; ц seg000:0114 db 18h ; seg000:0115 db 0 ; >3 с) результат – функция дизассемблировала две инструкции и остановилась, 114 встретив регистровый переход, целевой адрес которого она предсказать не в силах; по завершению дизассемблирования функция возвратила длину первой инструкции, равную трем байтам Message(">%X\n",MakeCode(SegByName("seg000")+0x106)); d) повторно вызываем функцию MakeCode, передавая ей адрес следующей инструкции (значение регистра SI при загрузке com файла равно 0x100, а после выполнения инструкции ADD SI, 6 – 0x106, следовательно целевой адрес перехода JMP SI равен 0x106) seg000:0100 add si, 6 seg000:0103 jmp si seg000:0103 ; ─────────────────────────────────────────────────────────────── seg000:0105 db 0B9h ; ╣ seg000:0106 ; ─────────────────────────────────────────────────────────────── seg000:0106 mov si, 114h seg000:0109 lodsw seg000:010A xchg ax, cx seg000:010B push si seg000:010C seg000:010C loc_0_10C: ; CODE XREF: seg000:0110j seg000:010C xor byte ptr [si], 66h seg000:010F inc si seg000:0110 loop loc_0_10C seg000:0112 jmp si seg000:0112 ; ─────────────────────────────────────────────────────────────── seg000:0114 db 18h ; seg000:0115 db 0 ; >3 e) результат – функция продолжила дизассемблирование, автоматически создавая перекрестные ссылки и автогенерируемые метки, до тех пор пока не встретила инструкцию регистрового перехода, целевой адрес которого предсказать не в силах. ??? #Верстальщику – chabge table аргумент пояснения ea линейный адрес бестипового байта или головы уже существующего элемента кода =return пояснения !=0 длина первой дизассемблируемой инструкции return ==0 ошибка Родственные функции: нет Интерактивный аналог: “Edit\Code”’ Функция возвращает символьную мнемонику инструкции элемента кода, расположенного по линейному адресу ea. Для получения операндов (если они есть) следует воспользоваться функцией GetOpnd (см. главу «Операнды») Пример использования: seg000:0000 mov ah, 9 a) исходные данные – требуется получить символьную мнемонику инструкции 115 Message(“>%s\n”,GetMnem(SegByName(“seg000”))); b) вызов функции GetMnem >mov c) результат – мнемоника инструкции в символьном представлении ??? #Верстальщику – chabge table аргумент пояснения ea линейный адрес элемента кода =return пояснения !=”” мнемоника в символьном представлении return ==”” ошибка Родственные функции: GetOpnd Интерактивный аналог: нет void MakeUnkn(long ea,long expand) Функция разрушает элемент, заданный любым принадлежащим ему адресом, превращая его содержимое в бестиповые байты. Объекты, связанные с элементом (например, метки, комментарии) при этом не уничтожаются. Замечание: автогенирируемые метки, назначаемые ASCII-строкам при их разрушении удаляется Аргумент ea задает любой линейный адрес, принадлежащий разрушаемому элементу. Аргумент expand будучи неравным нулю указывает на необходимость разрушения всей цепочки элементов, связанных друг с другом перекрестными ссылками типа «ссылка на следующую инструкцию» (см. главу «Перекрестные ссылки») Пример использования: 1. Эксперимент seg000:0000 aHelloSailor db 'Hello, Sailor',0 a) исходные данные MakeUnkn(SegByName(“seg000”)+0x1,0); b) вызов функции MakeUnkn для разрушения элемента данных типа «ASCII-строка» seg000:0000 db 48h ; H seg000:0001 db 65h ; e seg000:0002 db 6Ch ; l seg000:0003 db 6Ch ; l seg000:0004 db 6Fh ; o seg000:0005 db 2Ch ; , seg000:0006 db 20h ; seg000:0007 db 53h ; S seg000:0008 db 61h ; a 116 seg000:0009 db 69h ; i seg000:000A db 6Ch ; l seg000:000B db 6Fh ; o seg000:000C db 72h ; r с) результат – элемент данных разрушен 2. Эксперимент seg000:0100 add si, 6 seg000:0103 jmp si a) исходные данные MakeUnkn(SegByName(“seg000”),0); b) вызов функции MakeUnkn для разрушения только одного элемента кода seg000:0100 start db 83h ; Г seg000:0101 db 0C6h ; ╞ seg000:0102 db 6 ; seg000:0103 ; ───────────────────────── с) разрушен один элемент кода 3. Эксперимент seg000:0100 add si, 6 seg000:0103 jmp si a) исходные данные MakeUnkn(SegByName(“seg000”),1); b) вызов функции MakeUnkn для разрушения всей цепочки элементов кода seg000:0100 start db 83h ; Г seg000:0101 db 0C6h ; ╞ seg000:0102 db 6 ; seg000:0103 db 0FFh ; seg000:0104 db 0E6h ; ц seg000:0105 db 0B9h ; ╣ с) результат – вся цепочка элементов кода разрушена ??? #верстальщику – change table агрумент пояснения ea любой линейный адрес, принадлежащий разрушаемому элементу ==0 разрушение только одного элемента кода или данных expand !=0 разрушение всей цепочки элементов кода или только одного элемента данных. =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: нет Интерактивный аналог: “Edit\Undefine”; Замечение: нажатие равносильно вызову MakeUnk(ScreenEA(),1) и 117 разрушает всю цепочку элементов кода. При необходимости разрушения одного элемента, его следует предварительно выделить курсорными клавишами, удерживая нажатым long FindCode(long ea,long flag) Функция ищет ближайший к переданному ей линейному адресу ea элемент кода, возвращая в случае успешного завершения поиска адрес его головы. В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим). Переданный функции линейный адрес в этот диапазон поиска не входит и не обязательно должен принадлежать какому-нибудь сегменту. Аргумент flag задает направление поиска – если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот. Пример использования: seg000:0100 mov ax, 9 seg000:0103 mov dx, 133h a) исходные данные – требуется получить линейный первого элемента кода Message(“>%s\n”,atoa(FindCode(0,1))); b) вызов функции FindCode – адрес начала поиска равен нулю, единичное значение флага направление указывает вести поиск с увеличением адресов >seg000:0100 результат – линейный первого элемента кода ??? #Верстальщику – change table аргумент пояснения ea линейный адрес начала поиска, не обязательно принадлежащий какому-нибудь сегменту =flag пояснения ==1 прямое направление поиска flag ==0 обратное направление поиска =return пояснения !=BADADDR линейный адрес элемента кода return ==BADADDR ошибка Родственные функции: FindData, FindExplored, FindUnexplored Интерактивный аналог:”Nabigate\Search for\Next Code”; Функция ищет ближайший к переданному ей линейному адресу ea элемент кода, возвращая в случае успешного завершения поиска адрес его головы. В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим). Переданный функции линейный адрес в этот диапазон поиска не входит и не обязательно должен принадлежать какому-нибудь сегменту. Аргумент flag задает направление поиска – если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот. Пример использования: 118 seg000:0000 mov ah, 9 seg000:0002 mov dx, 108h seg000:0005 int 21h seg000:0005 seg000:0007 retn seg000:0007 ; ────────────────────────────── seg000:0008 aHelloIda db 'Hello, IDA' a) исходные данные – требуется получить линейный последнего элемента данных Message(“>%s\n”,atoa(FindData(BADADDR,0))); b) вызов функции FindData >seg000:0108 результат – линейный адрес последнего элемента данных ??? #Верстальщику – change table аргумент пояснения ea линейный адрес начала поиска, не обязательно принадлежащий какому-нибудь сегменту =flag пояснения ==1 прямое направление поиска flag ==0 обратное направление поиска =return пояснения !=BADADDR линейный адрес элемента данных return ==BADADDR ошибка Родственные функции: FindCode, FindExplored, FindUnexplored Интерактивный аналог:”Nabigate\Search for\Next Data”; Функция ищет ближайший к переданному ей линейному адресу ea элемент кода или данных, возвращая в случае успешного завершения поиска адрес его головы. В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим). Переданный функции линейный адрес в этот диапазон поиска не входит и не обязательно должен принадлежать какому- нибудь сегменту. Аргумент flag задает направление поиска – если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот. Пример использования: seg000:0100 DB 99h ; Щ seg000:0101 DW 666h a) исходные данные – требуется получить линейный первого элемента кода или данных Message(“>%s\n”,atoa(FindExplored(0,1))); b) вызов функции FindExplored – адрес начала поиска равен нулю, единичное значение флага направление указывает вести поиск с увеличением адресов >seg000:0101 результат – линейный первого элемента 119 ??? #Верстальщику – change table аргумент пояснения ea линейный адрес начала поиска, не обязательно принадлежащий какому-нибудь сегменту =flag пояснения ==1 прямое направление поиска flag ==0 обратное направление поиска =return пояснения !=BADADDR линейный адрес элемента любого вида return ==BADADDR ошибка Родственные функции: FindCode, FindData, FindUnexplored Интерактивный аналог:”Nabigate\Search for\Next explored”; Функция ищет ближайший к переданному ей линейному адресу ea бестиповой байт, возвращая в случае успешного завершения поиска его адрес. В зависимости от флага направления поиск может идти как вперед (от младших адресов к старшим), так и назад (от старших адресов к младшим). Переданный функции линейный адрес в этот диапазон поиска не входит и не обязательно должен принадлежать какому-нибудь сегменту. Аргумент flag задает направление поиска – если его младший бит установлен поиск идет от младших адресов к старшим и, соответственно, наоборот. Пример использования: seg000:0100 DW 666h seg000:0102 DB 99h ; Щ a) исходные данные – требуется получить линейный первого бестипового байта Message(“>%s\n”,atoa(FindUnexplored(0,1))); b) вызов функции FindUnexplored – адрес начала поиска равен нулю, единичное значение флага направление указывает вести поиск с увеличением адресов >seg000:0102 результат – линейный первого бестипового байта ??? #Верстальщику – change table аргумент пояснения ea линейный адрес начала поиска, не обязательно принадлежащий какому-нибудь сегменту =flag пояснения ==1 прямое направление поиска flag ==0 обратное направление поиска =return пояснения !=BADADDR линейный адрес бестипового байта return ==BADADDR ошибка Родственные функции: FindCode, FindData, FindExplored Интерактивный аналог:”Nabigate\Search for\Next Unexplored”; 120 ОПЕРАНДЫ #definition Элементы могут содержать один и более операндов, включающих в себя непосредственные значения. Одно и то же непосредственное значение может являться и константой, и смещением в сегменте, и базовым адресом сегмента. Константа в свою очередь может отображаться в двоичной, восьмеричной, десятичной и шестнадцатеричной системе исчисления или символьной ASCII-строки. Тип и представление каждого операнда определяется значением соответствующих битов флагов (см. таблицу 14). Две группы битов определяют представление первого и второго операнда; если же элемент содержит более двух операндов, третий и все последующие операнды имеют тот же самый тип и представление, что и второй операнд. Если ни один бит атрибутов операнда не установен, операнд не имеет никакого типа, (т.е. имеет тип “void”) и отображается в системе исчисления принятой по умолчанию. В зависимости от настоек IDA Pro бестиповые операнды могут отображаться другим цветом (по умолчанию красным). Определить имеет ли некий элемент кода непосредственный операнд или нет можно анализом бита FF_IMMD флагов. Если он установлен – элемент кода имеет непосредственный операнд, и, соответственно, наоборот. Значение бита FF_IMMD не зависит от типа непосредственного операнда – чем бы он ни был: смещением, константой, базовым адресом сегмента или имел тип void, – флаг FF_IMMD указывает на сам факт наличия (отсутствия) непосредственного операнда, но никак не связан с его типом. В полностью дизассемблированной программе не должно быть ни одного операнда с типом void, – типы всех операндов должны заданы явно в соответствии с их назначением, которое можно узнать путем анализа программы. В некоторых случаях IDA Pro позволяет автоматически отличить смещения от констант: а) используя информацию о перемещаемых элементах (fixup info) IDA Pro может автоматически преобразовать бестиповые операнды в базовые адреса сегментов и смещения b) в 32-разрядном сегменте, инструкция, имеющая непосредственный операнд, содержащий значение 0x10000 и выше, автоматически преобразуется в смещение, если это разрешено настойками c) то же, что и в пункте b но для данных d) непосредственный операнд инструкции push, следующей за инструкцией, заносящий в стек базовый адрес сегмента, автоматически преобразуется в смещение, если это разрешено настройками e) непосредственный операнд, копируемый инструкций MOV в один из регистров общего назначения, автоматически преобразуется в смещение, если он предшествует инструкции MOV, заносящий в один из сегментных регистров базовый адрес сегмента f) непосредственный операнд, копируемый инструкций MOV в ячейку памяти независимо от способа ее адресации, автоматически преобразуется в смещение, если он предшествует инструкции MOV, заносящий в ячейку памяти базовый адрес сегмента. Авто-анализатор IDA Pro непрерывно совершенствуется, и новые версии становятся способными автоматически распознать смещения все в большем и большем числе случаев, - однако, вместе с этим увеличивается и процент ложных срабатываний, поэтому, окончательная доводка дизассемблируемого листинга ложится на плечи пользователя. 121 представление первого слева операнда флаг # представление FF_0VOID 0x00000000 тип void FF_0NUMH 0x00100000 шестнадцатеричное представление FF_0NUMD 0x00200000 десятичное представление FF_0CHAR 0x00300000 символьное представление FF_0SEG 0x00400000 представление в виде базового адреса сегмента FF_0OFF 0x00500000 представление в виде смещения в сегменте FF_0NUMB 0x00600000 бинарное представление FF_0NUMO 0x00700000 восьмеричное представление FF_0ENUM 0x00800000 представление в виде перечисления FF_0FOP 0x00900000 пользовательское представление FF_0STRO 0x00A00000 представление в виде смещения в структуре FF_0STK 0x00B00000 представление в виде стековой переменной представление второго слева операнда флаг # представление FF_1VOID 0x00000000 тип void FF_1NUMH 0x00100000 шестнадцатеричное представление FF_1NUMD 0x00200000 десятичное представление FF_1CHAR 0x00300000 символьное представление FF_1SEG 0x00400000 представление в виде базового адреса сегмента FF_1OFF 0x00500000 представление в виде смещения в сегменте FF_1NUMB 0x00600000 бинарное представление FF_1NUMO 0x00700000 восьмеричное представление FF_1ENUM 0x00800000 представление в виде перечисления FF_1FOP 0x00900000 пользовательское представление FF_1STRO 0x00A00000 представление в виде смещения в структуре FF_1STK 0x00B00000 представление в виде стековой переменной Таблица 13 возможные представления непосредственных операндов элементов типа данные и код Сводная таблица функций функции, изменяющие отображение операндов название функции краткое описание success OpBinary(long ea,int n) отображает операнд (операнды) в двоичном виде success OpOctal(long ea,int n) отображает операнд (операнды) в восьмеричном виде success OpDecimal(long ea,int n) отображает операнд (операнды) в десятичном виде success OpHex(long ea,int n) отображает операнд (операнды) в шестнадцатеричном виде success OpChr (long ea,int n) отображает операнд (операнды) в символьном виде success OpNumber(long ea,int n) отображает операнд (операнды) в систем исчисления принятой по умолчанию success OpOff (long ea,int n,long base) отображает операнд (операнды) в виде смещения, отсчитываемого относительно начала сегмента 122 success OpOffEx(long ea,int n,long reftype,long target,long base,long tdelta) отображает операнд (операнды) в виде смещения, отсчитываемого относительно любого адреса, принадлежащего сегменту success OpSeg(long ea,int n) отображает операнд (операнды) в виде имени сегмента, базовый адрес которого равен значению операнда success OpAlt(long ea,long n,char str) отображает операнд (операнды) в виде символьной строки, заданной пользователем success OpSign(long ea,int n) отображает операнд (операнды) в знаковой или целочисленной форме (функция работает как триггер) success OpStkvar(long ea,int n) отображает непосредственное значение, использующее для базовой адресации в виде имени локальной переменной функции, возвращающие операнды название функции краткое описание char GetOpnd(long ea,long n) возвращает операнд в символьном представлении long GetOpType(long ea, long n) возвращает тип операнда long GetOperandValue (long ea,long n) возвращает значение операнда char AltOp (long ea,long n) возвращает операнд, определенный пользователем функции, обеспечивающие поиск операндов название функции краткое описание long FindVoid(long ea, long flag) возвращает линейный адрес очередного операнда неопределенного типа long FindImmediate (long ea, long flag, long value); возвращает линейный адрес очередного элемента с операндами, имеющими указанное значение char Demangle (char name, long disable_mask) возвращает незамангленное имя метки success OpBinary(long ea,int n) Функция отображает операнд (операнды) в двоичном виде, добавляя в его конце суффикс ‘b’. Пример использования: seg000:0000 mov ax,41h a) исходные данные OpBinary(SegByName(“seg000”),1); b) вызов функцию OpBinary для преобразования второго слева операнда в двоичный вид. seg000:0000 mov ax, 1000001b с) результат – второй слева операнд преобразован в двоичный вид ??? #верстальщику – change table 123 аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n операнд ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: OpOcatl, OpDeciminal,.OpHex, OpChr, OpNumer Интерактивный анлог: “Edit\Operand types\Binary”; success OpOctal(long ea,int n) Функция отображает операнд (операнды) в восьмеричном виде, добавляя в его конце суффикс ‘o’. Пример использования: seg000:0000 mov ax,41h a) исходные данные OpOctal(SegByName(“seg000”),1); b) вызов функцию OpOctal для преобразования второго слева операнда в восьмеричный вид. seg000:0000 mov ax, 101o с) результат – второй слева операнд преобразован в восьмеричный вид ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n операнд ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: OpBinary, OpDeciminal,.OpHex, OpChr, OpNumer Интерактивный анлог: «Edit\Operand types\Octal» success OpDecimal(long ea,int n) Функция отображает операнд (операнды) в десятичном виде. Пример использования: seg000:0000 mov ax,41h 124 a) исходные данные OpDecimal(SegByName(“seg000”),1); b) вызов функцию OpDecimal для преобразования второго слева операнда в десятичный вид. seg000:0000 mov ax, 65 с) результат – второй слева операнд преобразован в десятичный вид ??? #верстальщику – change table аргумент пояснения ea линейный адрес элемента, которому принадлежит операнд =n операнд ==0 первый слева операнд ==1 второй слева, третий (если он есть) и все остальные операнды n ==-1 все операнды =return пояснения ==1 успешное завершение операции return ==0 ошибка Родственные функции: OpBinary, OpOctal,.OpHex, OpChr, OpNumer Интерактивный анлог: «Edit\Operand types\Decimal»; |