Smile, На Олю взгяд самый лучший, я ей по нескольку часов на дню пользуюсь. Вопрос в том, что я пишу программу: Mov Ax, 0xE566 Xor Ebx, Ebx И вставляю туда Int3: Mov Ax, 0xE566 Int3 Xor Ebx, Ebx Когда запускается Оля она мне пишет: in eax, 0CC xor ebx, ebx При выполнении Step Over (F8) Оля застревает на команде с пояснением: Privileged instruction - use Shift F7/F8/F9 to pass exception to program. О чём я и спрашивал. Это вроде как разбор примера движка дизассемблирования. P.S. Да, кстати Int3 я намеренно вставляю, чтобы отладить программу с определённого места (это я к словам "вылетаешь по Int3"). Только приходится писать не Int3, а Nop Int3 Nop.
Foamplast >О чём я и спрашивал. Это вроде как разбор примера движка дизассемблирования. А вот еще один мистический пример дизассемблирования: если в полнолуние, в ручную, 666h раз, набрать dw 666h а потом дизассемблировать получится 666h инструкций PUSH ESatana
Есть инструкция с числом. Дизасемблируется без проблем, но это может быть как просто число так и offset.Это наверное самое сложное в дизасме - пока нет метода лучше чем у Windasm, но он и половины offset`ов не находит. А как определить размер блока по offset`у вообще не имею понятия. Кто-нить работал над этим ?
zzzyab У Windasm и метода то особого нет - строки только и распознаёт Для начала надо определить, на что указывает число - код или данные (или вообще никуда не указывает). Если на данные - проверить не является ли блок строкой. Также концом блока можно считать ближайший адрес, на который указывает offset в какой-нибудь другой инструкции. Я сейчас работаю над проблемой разделения кода и данных. Фиг знает, когда закончу, т.к. времени очень мало. Но определённые идеи есть.
> это может быть как просто число так и offset. > Это наверное самое сложное в дизасме - пока нет метода лучше чем у Windasm посмоти как это сделано в ИДЕ. она автоматически распознает большинство указателей простыми эврестическими приемами, а вообще в идеале надо писать эмулятор и смотреть - если непосредственное значение используется в косвенной адресации, то это либо индекс, либо указатель. но идексы обычно невелики по модулю, в то время как указатели в win32-программах в 99% случаях находятся за пределами 4 метров, что выдает их с головой. все примемы, которые использует ИДА мне перечислять лениво (тем более, что они уже описаны в "Образе мышления"), вот только пара из них: если непосредственное значение указывает в пределы imagesize и здесь расположен пролог функции (или хотя бы просто код), то это ссылка на код, если здесь расположены данные - это ссылка на данные. прием простой, но он работает тем более, что для библиотечных функций мы можем явно распознать какие их аргументы - указатели, а какие нет.
Когда я только начинал, я испытывал все - остановился на Windasme. У иды очень много ошибок (у меня была тогда вер. 3.х) дизасменные с помощю нее проги и потом опять собраные были не работоспособны. Больше всего мне не нравилось в ИДЕ что она считала кодом все и данные и ресурсы, и даже Debug инфо, а дакже дизасмила только в ТASM совместимом стиле. ер. db STR 'Hello',0 оно или АСМ кодом дизасмило или dd STR 48656c6c,6f006472 А Windasm не лепит такой бред, просто ставятся ссылки "Possible reference" и все оставляется как есть,он в 65% случаях правильно определяет строчные данные и почти все виды ресурсов, и никаких дибильных TACMОвских примочек. Размер блока и я определяю по следующему offset. но если следующего нет ? ер. последний. Все таки я считаю что дизасм должен быть пошаговый,- с точки старта дизасмится только то что исполняется,а остальное уже вручную по выбору. Имхо полностью автоматический - не возможен.
kaspersky Так проблема как раз в том и состоит, чтобы определить, где код, а где данные! zzzyab Конечно, сделать автоматический анализ идеальным практически невозможно. Если говорить о проблеме разделения кода и данных, то вполне реально достичь очень неплохих результатов, а в ряде случаев (я бы даже сказал, во многих случаях) - 100% правильного разделение кода и данных. Я надеюсь, мой анализатор будет справляться с этим лучше, чем IDA, в основном, за счёт статистического анализа.
Переменную можно организовать следующим образом: Код (Text): var4323: mov eax,87654321h ;так значение переменной загружается в регистр ... mov [var4323 + 1],eax ;так в память сохраняется новое значение переменной Ваши действия?
Я вот как раз это и имел ввиду. Кроме самомодифицирующего кода один из многочисленных возможных примеров например при создании класса окна поместить в указатель имени класса указатель на любой байт кода после которого есть (на разумной дистанции) байт=00. Тут уже не работает логический принцип "исключения" третьего поэтому задача поставленая как симметрическая разность (или это код или это данные, типа поциент либо жив либо мёртв) не разрешима в принципе. Байт кода на который указывает указатель имени класса будет одновременно и рабочим опкодом и данными которые система будет использовать при создании окна.
>>Тоесть придется декодировать каждый опкод, или схожую группу опкодов, примерно так как это сделанно здесь http://z0mbie.host.sk/disasm.txt Только вот для дизассемблера, такой информации бутет явно недостаточно Очень интересная вещица . Раз все говорят, что дизассемблировать необходимо пошагово, то придется так и делать З.Ы. Кстати Smile, а почему ты говоришь, что этого недостаточно ?. Насколько я понимаю алгоритм следующий (применительно к данному движку): 1. Определяется разрядность (проверяется последний бит опкода на 1 и префикс 0x66). Например: Код (Text): BOOL Mode = FALSE; // 0 - 32 bit, 1 - 16 bit Mode = (Opcode & 1); if (flag & Fx66) Mode = !Mode; Сразу вопрос : а как быть если опкод > 1 байта (0xF0, 0x9B, 0xD9 ...) 2. Смотрим есть ли байт ModRm 3. Если есть, то определяем регистр из поля Reg 4. Смотрим на поле Rm. Если = 100b => есть байт Sib 5. Разбираем Sib 6. Записываем результат с учетом напрвления источника и приемника (2 бит в опкоде) Или такой алгоритм работать не будет ? Может еще как ?
Потому, что есть еще и псевдо(операнды по-умолчанию) которые нигде не закодированны, а также размер указателя или операнда не всегда стандартен, например для инструкции bound, может скоро разрожусь(гы) статьей банзай!
Что вы думаете по поводу добавления к дизасемблеру PE базы данных значений EA. Например при изменении ЕA в одном месте автоматически изменяються такиеже EA во всем коде.
Все ЕА по всему коду не выщимишь. Что не будь да пропустишь. А потом будешь чесать репу. Просто возни много.
А как оно эмулируеться ? Мне на ум кроме софтайса нечиго не приходит - это пока очень сложно для меня. И еще такой вопросы: как декодируеться префикс Brunch prediction, в своем дизасме я его ставлю на db - вроде не зависает, но как опредилить работает ли оно. Вообще я решил ставить в db все чего не понимает masm. И какие методы расчета скорости, я придумал пока создание 10mb файла с однотипными иструкциями, выполнение дизасма через софтайс, софтайс показывает потом время торможения например для инстркуций add,adc,or,sub,xor... регистр-регистр ~10 cек
>>А как оно эмулируеться ? Мне на ум кроме софтайса нечиго не приходит - это пока очень сложно для меня. Софтайс не эмулятор, а отладчик. Эмуляция довольно сложная тема. Это исполнение команд не процессором а твоей программой. Как пример можно привести VMWare, Emu8086.