Анимация
JavaScript
|
Главная Библионтека
Message("%d \n", GetSpDiff(0x10013) Message("%d \n", GetSpDiff(0x10016) Что бы узнать значение SP после завершения команды add sp, cx IDA, очевидно, должна знать чему равен регистр CX. Что бы его отследить пришлось бы включать в дизассемблер полноценный эмулятор 0x86 процессора. Пока это еще не реализовано и IDA предполагает, что значение CX равно нулю и, таким образом, уже неправильно определяет значение SP во всех нижележащих точках функции. Исправить положение можно ручной коррекцией значения SP. Функция SetSpDiff задает изменение регистра SP после выполнения команды. Для этого необходимо передать линейный адрес конца, а не начала команды. В нашем случае необходимо скорректировать величину изменения SP командами ADD SP, CX расположенными по адресам seg000:0011 и seg000:0014. Линейные адреса команд соответственно равны seg000:0013 и seg000:0016. Их и необходимо передать функции вместе с действительной величиной изменения SP. SetSpDiff(0x10013,2); SetSpDiff(0x10016,2); seg000:0000 000 seg000:0000 start seg000:0000 seg000:0001 002 seg000:0002 004 public start proc near push ax push ax push bp
success MakeLocal(long start,long end,char location,char name) версия 3.74 и старше С версии 3.74 IDA поддерживает локальные переменные, которые в большинстве же случаев распознает и создает автоматически. Но иногда она не способна правильно их распознать, и тогда эта миссия ложиться на плечи пользователя. Подробнее о локальных переменных можно прочитать в специальной главе «Локальные переменные» посвященной непосредственно им. MakeLocal полный аналог («~Edit\Functions\Stack variables»). В прототипе функции MakeLocal указывается область видимости локальной переменной (start и end), однако существующие версии IDA (вплоть до IDA 4.0) не поддерживает такой возможности и область видимости локальной переменной распространяется целиком на всю функцию. Функция принимает следующие операнды:
Кроме локальных переменных этой же функцией можно создавать и размещенные в стеке аргументы, т.к. фактически это те же локальные переменные, только размещенные по другую сторону кадра стека (с положительным смещением, а не отрицательным). IDA в большинстве случаев самостоятельно автоматически определяет аргументы функций (называя их arg xx) и вмешательство пользователя обычно не требуется. Пример: MakeLocal(ScreenEA(),0,"[bp+0x4]","MyVar"); proc near = dword ptr 4 push [esp+MyVar] .text:00401124 sub 0 401124 .text:00401124 .text:00401124 MyVar .text:00401124 .text:00401124 success SetReg (long ea,char reg,long value); Функция устанавливает значение сегментных регистров. IDA автоматически отслеживает их значение (и изменение) и хранит его для каждой точки кода. Этот механизм достаточно совершенен и обычно вмешательства не требуется, однако в некоторых случаях IDA неправильно вычисляет значение сегментых регистов, например, если модификацией управляет отдельный поток и тогда требуется вмешательство пользователя. SetReg генерирует директиву ассемблера ASSUME, помещаемую в исходный код. При этом регистр должен указывать на начало сегмента. Все существующие ассемблеры поддерживают именно такой режим, но программистам иногда требуется установить сегментный регистр по произвольному адресу внутри сегмента (например, для организации плавающего кадра окна для преодоления 64 КБ барьера реального режима на сегмент) SetReg нормально принимает такие значения. Например: dseg:0000 start dseg:0000 dseg:0003 dseg:0005 dseg:0005 dseg:0008 proc near mov ax, seg dseg mov ds, ax assume ds:dseg mov dx, offset aHelloSailor ; call WriteLn 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 |