Спасибо всем за участие ! Но если завелся такой спор, то может попробуем реализовать хотябы часть базовых функций для дизассемблирования. Обсуждая их на форуме можно избавиться от неочевидных ошибок и сэкономить время.
Smile К сожалению http://z0mbie.host.sk/disasm.txt Forbidden (You don't have permission to access /disasm.txt on this server.) Не монимаю почему это должны быть именно IF, имхо они тормозные - почему не прямой jmp\mov или хтя бы сall ? Выскажитесь остальные - много IF это тормоз или нет ? Есть смысл, если возможно, не испльзовать IF. В том что дизассемблер сделает мне это кодом, а не данными. Идиотский IDA е.р. даже ресурсы за код считает и соотв. их дизасмит
>Идиотский IDA прежде, чем чего-либо хаять, подумай, а сможешь ли написать хотя бы приблизительно ткой же "идиотский" дизассемблер?
Если захочу да, и это займет неск. лет времени, но зачем ? он уже и так есть. Мне все-таки больше нравится WinDasm
zzzyab К сожалению http://z0mbie.host.sk/disasm.txt Forbidden http://z0mbie.host.sk/disasme.txt - это тоже самое, только на английском Не монимаю почему это должны быть именно IF, имхо они тормозные - почему не прямой jmp\mov или хтя бы сall а куда и как ты будешь делать jmp или call? очевидно что-то типа jmp [eax]? так это и называется табличкой. Выскажитесь остальные - много IF это тормоз или нет ? ес-но! при табличной эмуляции ты делаешь переход на декодер по некоторому критерию (упрощенно скажем по первому байту опкода) за одну команду - jmp [eax] в противном случае, выход на декодер будет выполняться за тучу if-ов, что будет существенно медленнее, типа Код (Text): shl al,1 jc 1xxxxxxx 0xxxxxxx: ... 1xxxxxxx: ... если тебе нужен именно дизассемблер, бери olly, как тебе советовал Володя - он самый безглючный, хотя с ним не так просто разобраться (коментариев нет, малопонятные аббревиатуры и т.п.) если нужен только дизассемблер длин, бери движок от z0mbie, рекомендую xde - он корректно декодирует опкоды с инвалидным полем codr (он же ttt, он же reg, кто как называет ) а начнешь писАть свой движок - в конечном итоге напишешь тот же xde added похоже, по внешним ссылкам на статьи z0mbie не зайти - надо зайти в корень (http://z0mbie.host.sk), а там уже искать статью "Disassemblers within viruses"
Да, я за jmp, вот уже и начало декодера: пример дизасма add al,immed Код (Text): decoder: sub eax,eax mov al,byte ptr [esi]; начало кода к-рый дизасм. mov edx,opcode[eax*4] jmp edx add_accb: mov dword ptr [edi],' dda' add edi,4 jmp _accb _accb: mov dword ptr [edi],' la,' add edi,3 inc esi push [esi] inc esi call hex4outb ; байт в ascii и добав. 'h' jmp decoder .data opcode dd add_rmb,add_rm,add_rb,add_r,add_accb,add_acc,push_es,pop_es........ ИМХО декодер инструкций, не самая сложная задача, - намного сложнее определение данных и работа с условными переходами, - создание рабочих asm файлов. Если Olly создает asm файлы к-рые компилятся и потом прога с них работает (для теста достаточно notepad и сalc потом wordpad....), то я стану его использовать. А создавать свой дизасм тоже интересно. Я не в прикол это делаю - все для практ. использования - хочу еще занятся дизасмом драйверов. Посмотрел исходник этого Olly http://home.t-online.de/home/Ollydbg/disasm.zip - не понимаю чем он хорош. Те же if\case и asm файлы он не делает. Так что я орентируюсь на WinDasm.
zzzyab вот уже и начало декодера как говорится, самое сложное - это начать mov al,byte ptr [esi] mov edx,opcode[eax*4] jmp edx к сожалению, не все опкоды можно однозначно идентифицировать по первому байту, и уж тем более их операнды - есть еще modrm-байт, sib-байт, поле codr, префиксы, которые влияют на размер адреса/данных etc. если ты все это будешь зашивать в таблицу (как ты уже начал), она получится мягко говоря очень большой, а наполнять данными ее будут еще твои внуки ) советую почитать сначала лит-ру по структуре опкода, потом посмотреть как делают люди (в том же olly или xde), а уж потом начинать писАть свой дизассемблер. ИМХО декодер инструкций, не самая сложная задача глубокое заблуждение намного сложнее ... работа с условными переходами а вот анализ и учет кросс-референсов это как два пальца... А создавать свой дизасм тоже интересно полностью с тобой согласен, но на некотором этапе работ это начинает надоедать и хотца взять че нить готовое, чем обычно и заканчивается кстати, тока вспомнил, z0mbie в одном из своих движков делал пример полного дизасма файла с последующим ассемблированием - вроде как на FAR'е проверял, и вроде как работало, так что ищи на его сайте...
Да... я так понимаю, что зря я затеял это все Писать свой дизасм (как мне представляется) необходимо все-таки уже имея на руках какие-то наработки. 1. Я сейчас пользуюсь дизассемблером длин z0mbie, но хотелось бы иметь и свой (это не к вопросу о изобретении велосипеда, а понять как это делается и может быть придумать что-то новое) 2. Я тогда упрощу задачу. Мне, в самом деле, и не нужет дизассемблер целиком (хотя и интересно написать свой). Мне нужно было, используя его, определять команды переходов (jxx) и изменять адреса переходов. Тоесть копируя часть функции в буфер эти Jxx уже будут указывать на валидные адреса - и вот их и надо было изменять. Сложно ли это сделать ?
Asterix htm2chm из http://yarix.by.ru/ - нерабочая. Наверне из-за того что у меня нет МСИЕ. Artem У тебя пример дизасма с использованием ООП - имхо для дизасма ООП не нужно. Max Про все эти sib и моdr я знаю,и соласен таблица опкодов большая и она там не одна, а про внуков ты сильно приувеличел, - в ваших дизасмах тоже самое, только там еще и if\case,а мой кусок кода это всего лиш пример работающей без сase\if. На форуме обсуждать идею создания дизасма я только начал, но в жизни - уже давно, и у меня есть соотв. инфо и исходники - и Olly имхо заслуживает внимания не намного больше остальных. zss Вот проги-"велосипеда" делающией рабочие asm файлы; правильно определяющей данные и ресурсы еще нет. Пока есть только неудачные разработки. Изменять переходы, и не только их, совсем не сложно, но для этого нужны совсем другие проги (ер. hiew - редактор; Soft-ice - поиск нужных мест в коде)
Извините, что не по теме. imho если уж начинать, то тогда так: Код (Text): decoder: ;sub eax,eax movzx eax,byte ptr [esi];mov al,byte ptr [esi]; начало кода к-рый дизасм. inc esi;mov edx,opcode[eax*4] jmp opcode[eax*4];edx По теме: ещё есть такая штука как RosAsm. C notepad и сalc он с налёту не пока справляется, но сама концепция интересная и opensource. Синтаксис.. хм, в общем это не MASM =)
zzzyab >Про все эти sib и моdr я знаю,и соласен таблица опкодов большая и она там не одна а про внуков ты сильно приувеличел, - в ваших дизасмах тоже самое В моей таблице ~214 эелементов по 9 байт (1.8кб), там все общие инструкции c дополнительными группами. Это по-твоему большая таблица? >только там еще и if\case, Код фукции декодирования ~1400 батй (1.4кб) да в ней достаточно много команд сравненя(test и cmp всего ~100) и что? Первую версию я писал на ассемблере, естественно, код быль лучьше, таблица ~1.0кб(без индексов имен и псевдо операндов) функция ~400 байт,вносить частые изменения и менять код очень проблематично и долго >а мой кусок кода это всего лиш пример работающей без сase\if. А многоли ты выиграешь от такого подхода, по скорости да, а в остальном?
zzzyab Вообще редкий проект проиграет от использования ООП. Но мой код очень легко переделать в вариант без ООП - просто вынести из классов методы и всё!
zzzyab > htm2chm из _http://yarix.by.ru/ - нерабочая. Наверне из-за того что у меня нет МСИЕ. МСИЕ это что, IE что-ли? Почему нерабочая, ты в винде, что прога то пишет? Надеюсь ты русскую версию скачал(бесплатная, полнофункциональная), у меня htm2chm 3.0.6
Asterix htm2chm включается, но все функции не выполняются - "сlass not registered", - ИЕ не установлен, и не собираюсь его устанавливать, потому и нужна подобная прога, работающая без ИЕ. Smile да у меня больше таблиц - все 4 байтные:превичный опкод (на все 256),вторичный опкод (уже меньше раза в 2),modrm,sib,регистры это все маленькие таблички так что это еще меньше, - не больше 1,8 кб это точно. О таблицах уже достаточно. Давайте перейдем к алгоритмам определения данных и ветвлению. У кого есть примеры кода?
zzzyab > ИЕ не установлен, и не собираюсь его устанавливать, потому и нужна подобная прога, работающая без ИЕ. Не понял, IE ведь ставится виндой по умолчанию и его вроде как нельзя удалить? Потом, чем тебе IE мешает? Я пользуюсь Оперой, но это не мешает быть установленным и IE, они никак не конфликтуют.
Люди, объясните мне кто-нибудь, почему Оля вдёт себя следующим образом: Я пишу в тексте программы Int3. При передаче управления на эту команду винда показывает мне приглашение отладиться. Если я выбираю "отмена" (т.е. отладка), то грузится отладчик по умолчанию - Оля. (здесь пока всё ясно) А вот тогда и начинается непонятное: Int3 в совокупности в предыдущим байтом считается какой-либо недопустимой командой (например in или запись/чтение в/из недоступной области памяти). Приходится писать Nop Int3 Nop. Чтобы было понятно, что предшествующая Int3 команда закончилась и Int3 - это новая команда. P.S. Вроде как раз по теме вопрос.
Foamplast По теме? Мужык, вполне возможно, что ставишь ты int3 в конце неполной инструкции или переход попадает не на int3, а предидущий байт или другая инструкци портит код, например: jmp $+3 db 0xE6 int3 зпись в порт не из 98/me, наверное рапрещена? и поэтому тебе кажется что ты вылетаешь по int3, не надо бросать презрительный вгзляд на олю, проверь еще раз тк хз, что у тебя там случилось
Это не в тему. ИЕ создает угрозу безопасности, - у меня свой вариант установки win98 типо 98lite, в 2000 пока не умею делать установку чистой от ИЕ системы. И мне не нужны проги, к-рые без этого ИЕ, имхо побочного в системе, не работают. И для этой темы можно создать отдельный пост (ер. "Нужен ли ИЕ ?" ). А сдесь давайте про соотв. алгоритмы.
zzzyab Пока нету времени добавить в движок анализ инструкции и некоторые дополнительные структуры, а ты уже говоришь о разделении кода/данных,определении ветвлений, как только будет готова следующая вервсия, приму участие в обсуждении