Здравствуйте, Васмовцы. Очень надеюсь на вашу помощь, ибо обратиться больше не к кому. Программирую для себя, в свободное от земных дел время, прогрммированию нигде не учился, поэтому прошу отнестись с пониманием. Очень давно уже вынашиваю идею написать дизассемблер, можно сказать это моя мечта, если я это реализую можно считать, что я добился своего в этой области, поэтому очень прошу помочь. Я перечитал все подобные темы на форуме, прочёл мануалы интела, изучил, насколько смог, исходники OllyDASM, но поскольку учить меня некому и не программист я по жизни, мне сложно это всё осмыслить, тем более с английским не всё так гладко. Скажите, насколько я понимаю процесс дизассемблирования строится следующим образом: 1. Определение префиксов команды. 2. Разбор опкода(т.е. парсинг полей s/w/reg, но из мануалов мне непонятно наличие или отсутствие этих полей в том или ином опкоде, объсните, если не затруднит). 3. Парсинг байта mod r/m(если можно объясните на чём строится принцип парсинга, я так понял нужно просто загнать те таблицы, что даны в мануалах интела и по ним производить поиск нужного значения?). 4. Парсинг байта sib(его наличие в команде мне вообще непонятно как определить и как его интерпретировать я тоже затрудняюсь ответить). 5. Поля смещения и непосредственного операнда(ну тут всё ясно, если я до этого дойду, то справлюсь сам) Но самое главное, что должна содержать главная таблица? Насколько я понял из OllyDASM: [операнд][длину операнда][мнемонику] Это мне понятно, но значение остальных полей загадка: const t_cmddata cmddata[] = { { 0x0000FF, 0x000090, 1,00, NNN,NNN,NNN, C_CMD+0, "NOP" }, { 0x0000FE, 0x00008A, 1,WW, REG,MRG,NNN, C_CMD+0, "MOV" }, { 0x0000F8, 0x000050, 1,00, RCM,NNN,NNN, C_PSH+0, "PUSH" }, 0x0000FF - вот это вообзе загадка всех загадок Написано, что это вроде "Mask for first 4 bytes of the command", но зачем эта маска нужна? Т.е. я понимаю, что WW указывает на аличие бита W, но откуда узнать наличие этих битов во всех командах? Далее на примере того же MOV: #define REG 1 // Integer register in Reg field #define MRG 12 // Memory/register in ModRM byte REG,MRG,NNN - почему именно так, я не пойму? Назначение C_XXX+n мне тоже не совсем ясно. Помогите разобраться с этой кашей в голове, буду очень вам признателен за это.
Для каждой команды указано. Значит плохо читал мануалы. Присутствие этого байта можно определить из ModR/M. Текущий байт/word/dword and Mask, и потом сравнивается с опкодом. Это как раз чтобы игнорировать изменяющиеся части опкода, биты s,w,reg.
ERROR_OR После п.2 иногда требуется посмотреть на сво-ва опкода и если есть ситуация что перед данным опкодом может стоять 0x66, 0xF2,0xF3, SSE,SSE2 etc команды, нужно глянуть на выделенные префиксы, на этапе парсинга префиксов. А вообще, анализирую чужие исходники дизасмов, алгоритма дизассемблирования как такового нет! Более по духу мне пришелся сорец движка Ms-Rem зы: Пиши в личку свою аську!
Где указано? Не вижу и всё тут... Ага, вот это увидел, разобрался. Текущий b/w/d чего? Т.е. например есть команда MOV, она имеет несколько опкодов в зависимости от типа адресации и эта маска позволяет игнорировать тип адресации и выделять непосредственно мнемонику?
Я его тоже долгое время изучал, мне показалось, что рему удалось выделить полную закономерность построения кодов команд, но для изучения прицнипов его дизассемблер совсем не годится, очень трудно даётся мне. А мне как раз и хочется понять всю суть, а не тупо использовать готовые решения. PS Удалось-таки зайти под своим аккуантом, ERROR_OR - это я.
Ну я смотрел у Зубкова, что под руку попало =) А так можешь сравнивать разные опкоды одной инструкции. Например mov r/m, r. Для Imm8 и Imm16/32 различается в бите d. Входного потока данных. 8A /r MOV r8,r/m8 8B /r MOV r32,r/m32 В таблице OllyDasm { 0x0000FE, 0x00008A, 1,WW, REG,MRG,NNN, C_CMD+0, "MOV" } Или другой пример Push reg, кодируется как 50-58, 0x58 & 0xF8 == 0x50.
> эта маска позволяет игнорировать тип адресации и выделять непосредственно мнемонику? Нет, это означает что ОЛЯ тупо брутфорсит опкоды по своей таблице, накладывая маски. Т по этому скоростью не отличается. Хотя на самом деле надо было сделать один switch для простых опкодов, и второй switch для 0x0f, и расставить в них флажки для опкодов - есть mod/rm или нет, некоторые редкие исключения, и т.д. Все остальное для х386 элементарно разбирается на основе полученных флажков, префиксов, и последующих байт. С расширенным набором есть подводные камни, типа когда fpu опкод с безобидным префиксом оказывается sse3 командой, это тока по докам внимательно смотреть =)
так для ольки скорость и не нужна этож тебе не емуль в антивире и этой хватает к стати доктор ты уже того трояна миссис что я давал задетектил ?
ахтунк Ахтунк Миссис незамедлительно задавайте ваши исходники а стало быть и минусдейный шелкод хранящийся по адресу Z:\NewProjects\spambot\new\driver\objfre\i386\driver.pdb В бэхоце иначе , каманда бравых войдохедов примет меры Ваши данные уходят тем кто ))