Вот много читал про то, что их используют например StarForce, ACProtect, VMProtect... Но вот не нашёл в инете ни одной статьи насчёт того, что представляет из себя виртуальная машина и не нашёл исходников никаких на эту тему. Может кто подскажет?
Да, вот это интересно... Интересно как ВМПротект работает и как это можно реализовать на Делфи или Си. Кто знает как записать в екзешник свою процедуру, реализовав это на вышеназванных языках?
Причем тут "виртуальные машины"? Это "протекторы" - "защитники", если угодно. Виртуальные машины (Virtual Machines) - это "VMware Workstation", "Microsoft Virtual PC" и т.д. Служат для полной (якобы) эмуляции персоналки, например, под WinXP (в виртуальной машине) можно поставить DOS, Unix или что-то еще и они будут нормально функционировать одновременно (как в окне, так и на полном экране). Очень удобно при отладке программы под разными платформами, или при изучении возможностей ОС. Про что именно вы спрашиваете?
Мне интересно, свзяно-ли понятие виртуальная машина с каким-нибудь интерфейсом windows. Вот например ВМпротект просто переводит скормленный ему код в последовательность байтов а потом просто выполняется программа, которая в зависимости от того, что там за последовательность байтов получилась, выполняет различные команды? Так? И с виндой это получается никак не связано? Обычная програма получается?
2 Grig de Griz: сабж поднимается на тему интерпретаторов. То что ты говоришь, тоже являются интерпретаторами - эмулируют работу определенного процессора\системы. В кодинге, интерпретатор переводит понятный ему код в код понятный процессору. 2 Drakon: ты прав, насколько я знаю работу этой программы. это обычная программа - а как же еще!? Просто изначально код шифруется(переводится в так называемый p-code), а затем, при вызове этого участка кода, интерпретатор ВМПротекта переводит шифрокод в код понятный процу. Вот этот алгоритм шифровки/дешифровки и есть так называемая виртуальная машина - код работает не напрямую с процом, а через интерпретатор. 2 All: кто знает как это реализовать на Delphi или C? подскажите плз...
baduin, короче можно сказать, что это распаковка по одной инструкции. Без записи её куда-либо. P-code... Хм... Где ты такое слово нашёл? Ведь наверняка в инете есть статьи и исходники на эту тему +)
Вообще, я тут недавно нарыл исходники Real Permutation Engine by Z0mbie. Вот там вроде код переводится в какую-то сощность с полным изменение (обработка всех переходов и джампов). Я думаю, надо начать оттуда.
Drakon: К интерфейсом windows виртуальные машины отношения не имеют 8). P-code - это из бейсика, программа на бейсике переводится в P-code. baduin имел в виду принцип действия. Статей я не видел - рано еще наверно. А так берешь хоть IDA, хоть дебагер от Delphi и изучаешь, если так интересно и времени не жаль. Всем: VMProtect не «виртуальная машина». VMProtect РАБОТАЕТ КАК виртуальная машина (но это громко сказано), путем преобразования участков кода, указанных разработчиком в собственный формат команд. В процессе выполнения этого кода не производится расшифровка, а VMProtect непосредственно работает как интерпретатор процессорных команд. Важный недостаток интерпретаторов в том, что они очень медленно работают. Что касается зашиты, то сейчас у них постоянны сигнатуры участков выполнения - 58 61 9В С3 (POP EAX; POPAD; POPFD; RET), что сильно упрощает взлом. Правда, начиная с версии 1.1, доступна опция "Шифрование регистров при переходах" – эта штука не позволяет увидеть оригинальные значения регистров при условных и безусловных переходах. Однако, как это тоже замедляет выполнение программы! В общем случае, изучать программу защищенную VMProtect сейчас можно по следующей схеме: 1. Ищем в защищенном файле сигнатуру 58 61 9В С3 (POP EAX; POPAD; POPFD; RET); 2. Вычисляем адрес, по которому это все будет отображено в памяти (зависит от места загрузки секций .vmp0 и .vmp1); 3. Ставим точку останова на этот адрес. Каждое срабатывание этой точки останова соответствует переходу к оригинальной (незащищенной) процедуре (JMP, CALL, JNZ и т.д.). В общем, отлавливаем все вызовы, которые делает процедуры защищенные VMProtect. По большому счету, из-за скорости работы пользоваться VMProtect не стоит, т.к. в большинстве серьезных программ скорость выполнения критична. Да и баловство все эти защиты, т.к. «Что один человек сделал, другой завсегда разломать сможет!».
2 Drakon: Некоторый процесс, который, подаваемые ему на вход команды (понятные только ему) преобразует в команды, понятные процессору(системе), на которой работает ВМ. p-code - это не только для бэйсика применяется(хотя может они это понятие и ввели). native-code - это и есть машинный код, а p-code - это код для интерпретирования на ВМ. 2 All: ну дык, кто знает как это реализовать на Delphi или C? подскажите плз...
dermatolog: То, что закрыли сигнатуры, это, собственно, было ожидаемо (я давно этим интересовался). A разработчики DAEMON Tools... Ну, это понятно. Еще бы они так считали! Drakon: По поводу виртуальных машин - см. на сайтах их производителей: VMware Workstation - http://www.vmware.com Virtual PC - http://www.microsoft.com/windows/virtualpc В двух словах я и так описал, а больше смотри в их мануалах. VMware Workstation - Довольно большой, сложный и многофункциональный, кроме ДОС, всех Виндов, поддерживает с десяток клонов Юникса. Однако весьма сложен в настройке, особенно пока разбираешься с нуля. Virtual PC - Простой как три рубля, очень подходит для геймеров интересующихся старыми досовскими играми. Но особо ничего не умеет.
Процесс генерации p-code можно представить как процесс компиляции (не важно что было на входе - программа на языке выского уровня или машинные команды). Т.е. тебе нужно "всего-то" написать такой "компилятор" (ну и ессно первым делом придумать принцип работы ВМ).
лады, сделаем совсем просто: надо просто запоролить запуск файла, как это сделать? Чисто теоретически я знаю(может быть я дУмаю, что знаю) как это работаетк виртуальной машине это мало отношения имеет, но все же) берем старую точку входа; сохраняяем ее; указываем новую точку входа, где будет моя процедура для ввода пароля; xor'ом проверяем пароль и если все ок, переходим на начало выполнения проги. Как это сделать практически, какие функции использовать надо, что делать то вообще?????
1. Способ классический. Сделать свой загрузчик и интегрировать его с закрываемой программой (как это делает тот же ASProtect). Нужно много знать, начиная с формата PE и т.д. (то что ты предлагаешь). 2. Самый простой способ (но не самый красивый) добавить закрываемый файл как ресурс к своей программе, которая запрашивает пароль. После проверки пароля загружать данные ресурса и что-то с ними делать. Если это exe, то запускать через CreateProcess. Это версию можно сделать за 10 минут и не мучиться. Любой из описанных способов грешит тем, что с помощью любого дизассемблера знающий человек такую защиту сломает в пять секунд. Именно поэтому и пишутся всякие ASProtect, VMProtect и еже с ними, эти защиты уже может взломать меньшее число народа, но взламывают. Пароль лучше хранить не по XOR, а например в MD5 (хеш функции). Хоть твой пароль раздавать не будут, придется им патч писать.
во-во, про первый способ я и говорю... как его делают то? как сделать саму интеграцию? я так понимаю свой загрузчик надо сначала откомпилить, потом его записать в файл, перед запуском загрузить его, и далее саму прогу... И как же этот загрузчик вставить то в файл? з.ы. есесно пароль надо шифровать не ксором, это я просто для примера привел, чтобы не заморачиваться на самом пароле. А вообще, я имел ввиду ксорить старую точку входа с введеным паролем(точка входа уже отксоренная хранится в файле), т.е. если ксор пройдет успешно, то управление передастся на нужное место, иначе - прога просто выдаст ошибку.
Готового примера у меня нет (так что народ у кого есть, пишите, сам хотел бы посмотреть). А общая идея, в принципе-то, понятна, мы ее описали. Кроме того, что, насколько я понимаю, на конечной стадии работы, загрузчик должен отобразить загружаемый EXE в свое\новое адресное пространство. Но информация все равно может храниться по методу 2.