Доброго времени суток форумчане. Помогите пытливому уму осознать что такое "эмуляция кода" и с чем её едят. Вот как я себе представляю эмуляцию инструкции "mov ecx,eax" Пусть дана виртуальная память с правами чтение\запись, и её виртуальный адрес [00440000]. Допустим двойное слово по адресу [00440000] соответсвует регистру eax А следующее двойное слово [00440004] регистру ecx. Код (Text): eax equ _eax equ dword ptr ds:[00440000] ecx equ _ecx equ dword ptr ds:[00440004] Вот собственно вопрос: Является ли этот код ... Код (Text): movd MM0, _eax movd _ecx, MM0 ... эмуляцией инструкции mov ecx,eax ? (и если не яв-ся, то почему ?)
Если ты убежден, что MM0 не будет у тебя использоваться больше нигде, то да, является эмуляцией. Не забудь, что эмулировать может потребоваться и сами регистры MMX. А еще нужно учитывать флаги и стек. Но в самом простом виде да, это эмуляция.
spa Если я вас правильно понял, то моё приложение читает езешник с целью эмуляции выполнения и встретив в читаемом файле опкод "mov ecx,eax", заменит "где-то у себя" этот опкод на " movd MM0, _eax \ movd _ecx, MM0 " то такое распознание и называется эмуляция. А если я сам в своём исходнике "изменил" строчку " mov ecx,eax ", то тогда это уже называется обфускацией. Я правильно понял ваш вопрос?
MSoft Вопрос же вроде не технический а философский. Как я понял автор хочет определения "эмуляции". Или может я не прав7
inshade да, абсолютно правильно. И да не обязательно обфускацией, дольше уже от целей зависит. Если цель скрыть или запутать алгоритм, то да. Если цель перенести на другую платформу, то я даже не знаю как это назвать, ретрансляция какая-нибудь ( что уже ближе к эмуляции ) . PS понятно что все это мое личное.
С этим понятно, что "эквивалентный код" в разных ситуациях называется по разному. А из чего состоит эмулятор кода? Мне представляется это так: Эмулятор в первую очередь должен дизассемблировать код. То есть перевести машинные инструкции в понятную ему (эмулятору) кодировку. Для того чтобы правильно составить "эквивалент" считанной инструкции. Например: в туже аски-кодировку типа => 8BC8 "переводится" в стоку mov ecx,eax. Делаее парсится cтрока "mov eax,ecx", затем буквы "eax" в этой строке заменяются на буквы "dword ptr ds:[00440000]" а буквы "ecx" - "dword ptr ds:[00440004]" получая аски-строку "mov dword ptr ds:[00440004], dword ptr ds:[00440000]" для того чтобы перевести уже обратно в машинный код, который записывается в отведённую для исполнения память. Наверное начал не с самого удачного примера, так как такая пересылка данных не годится. Но всё же апуская исключительные ситуации, именно так происходит распознование эмулятором кода, который следует проэмулировать?
В тех эмуляторах, которые я встречал, было немного иначе. Сам дизассемблер я не смотрел, а обработчик выглядел так: для каждой инструкции был свой отдельный обработчик. Например, есть команда mov eax,55. Эмулятор определяет, что инструкция пишет в регистр еах. Вызывает соответствующую функцию.Функция выглядит так: mov [eax_var],55. Если инструкция воздействует на флаги, то там сложнее. Но декомпиляции в текстовый вид, парсинга строк и обратной компиляции ессно нет
Разумеется что моё представление о работе эмулятора не является рациональным. MSoft скажите, а в тех эмуляторах которые вы встречали, там код предназначенный для эмуляции по одной команде эмулятор "перекодировал", далее выполнил, затем следующую инструкцию "распознал" и выполнил и так далее... или же сразу весь транслировался а затем выполнялся? Хотя возможно что в разных эмуляторах по-разному. А как вы считаете более рационально - транслировать весь код срау или по одной команде ?
1) я толком не смотрел. Я просто видел, как устроены обработчики (у того же нода) 2) ессно надо транслировать по одной команде. Вдруг код самоперекрывающийся. Или данные внутри кода. Или прыжок вообще в неизвестном направлении, а ты тратишь время на код, который не выполнится никогда
Прощу прощенья за тупость, просто как-то не подумал об самомодификации кода. Дело в том что выдумал простецкий код (из трёх инструкций): плюс\минус\присвоить значение. И задал себе вопрос: как бы я это проэмулировал. Вот собственно единственная мысль это запустить утилиту \masm32\bin\dumppe.exe с ключём -disasm fil_emul.exe, которая выдаст мне дизассемблированный листинг в аски-коде. Хотя как обратно преобразовать строку в маш.код не понял, но думал прибегнуть к помощи ml.exe и link.exe с соответсвующими ключами. Это к тому, почему вдруг эмулятор должен код транслировать в аски-кодировку. А то что изначально в голове крутится код из трёх нструкций, то как бы о самомодификации и не подумал вовсе. А цель этого всего осознать "блок-схему" эмуляции кода.
Цель одна, осознать как работает эмулятор, из каких деталей состоит, как происходит эмуляция. (для чего происходит эмуляция - это другой вопрос). Постарался ответить сам себе. Понимаю что техническая сторона моего ответа самому себе (на вопрос как бы я это проэмулировал) является, мягко говоря, бредом сивой кабылы. Но думаю что эмуляторы исполняемого кода примерно так и делают, а именно: транслируют код для эмуляции в понятный для себя "hex" и далее составляют "эквивалент" машинной команды, выполнение которой следует проэмулировать. Никаких технических целей я не приследую, хочу просто понять "что\где\когда"... Возможно в ком-то из мастеров проснётся инстинкт учителя, и он (мастер) доведёт "бегинера" до сути. Вот вы, например, deLight как себе представляете процес эмуляции кода?
inshade зайди на avschool.ru или как-то так. Это проект каспеского. Там есть статья об основах создания эмулятора в антивирусах
Я вас понял, сорри за несколько ламерских килобайт в базе данных. [оффтоп] на счёт школы: не пойду я туда учится, слишком высокого ихней лидер о себе мнения. На форуме ав-касперского читал топ один и однажды, там может и толковые люди сидят в плане кодерства, но жапализы ихнее модераторы. Да и вапще реверс руткита давным давно в паблике валялся, а ихняя лаборатория так и не закрыла в своих продуктах инжект через AddPrintProvidorW. Делая вид что у них всё веригуд как у мелкомягких. [/оффтоп] P.S. У модераторов прошу прощенья за оффтоп.
Видимо я вас не правильно понял, думал вы меня гоните туда. Мол иди учи уроки, осенние каникулы уже закончились. Thank you MSoft. Ваши грибы вывели меня из леса. Даже очень стыдно за то что поисковиком по wasm'y невоспользовался. Вообщем нашёл статью Uinc. Эмуляция програмного кода а там вапще в заключении написано: WASM. Эмуляция програмного кода Стыдно, очень стыдно. Простите модераторы за ламоКб в базе.