Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Написание виртуальной машины
<< . 1 . 2 . 3 .
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 июля 2006 12:46
· Личное сообщение · #1

Добрый день/вечер/утро.
Не подскажите, где можно почитать про создание вирутальных машин. Что то типа как в СтарФорс или протекторах разных... Простенькие примеры там какие может...
Спасибо.



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 09 августа 2006 12:25
· Личное сообщение · #2

n1kto
Ты на форуме видать не живешь и топики не читаешь, иначе бы ты знал, что об архитектуре ЭВМ я наслышан и даже очень(читай тему про xor). Но что толку от того, если я задам скажем логику PDP-11, все равно это будет подчиняться логика, а где логика там и догадки, следовательно,Хоть и трудно но разобрать можно!

Ты сталкивался, с криптографическими алгоритмами, где действия как надо расшифровывать, хранятся в самом ключе? Вот именно этого я и хотел бы, потому что нет логики, не очем судить, да даже если ключ есть, то если он каждый раз уникален и вирт.машина кажд.раз разная, то мало разобрать машину, надо еще понять, как его туда всунуть! То бишь задать логику работы программы для интерпретатора вирт.машины выносной и записать его в ключ-активации

-----
My love is very cool girl.




Ранг: 54.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 09 августа 2006 12:59
· Личное сообщение · #3

theCollision пишет:
Ты на форуме видать не живешь и топики не читаешь, иначе бы ты знал, что об архитектуре ЭВМ я наслышан и даже очень(читай тему про xor). Но что толку от того, если я задам скажем логику PDP-11, все равно это будет подчиняться логика, а где логика там и догадки, следовательно,Хоть и трудно но разобрать можно!

засмущал тогда я определение алгоритма приводить не буду, хорошо?
хотя из него следует что алгоритм без логики конечно возможен, но
вычислительно бесполезен
theCollision пишет:
Ты сталкивался, с криптографическими алгоритмами, где действия как надо расшифровывать, хранятся в самом ключе?

ага. я такое даже разрабатывал.
theCollision пишет:
Вот именно этого я и хотел бы, потому что нет логики, не очем судить, да даже если ключ есть, то если он каждый раз уникален и вирт.машина кажд.раз разная, то мало разобрать машину, надо еще понять, как его туда всунуть! То бишь задать логику работы программы для интерпретатора вирт.машины выносной и записать его в ключ-активации

это все реализуемо. и даже реализовано. но не работает упирается в систему программирования (писалось как препроцессор для дельфи)
простенький вариант - nand cpu, emulme(?) by Leon, год 90-какойто. там ключом задается часть программы, а программа реализуется ВМ. простенько и со вкусом.
theCollision пишет:
То бишь задать логику работы программы для интерпретатора вирт.машины выносной и записать его в ключ-активации

такое работает только для схемы регистрации с перегенерацией кода для каждого юзера. т.е. он тебе деньги и данные, ты ему (недостающие?) модули системы. с ватермарками, проверками и прочим.
тоже реализовывалось. тяжело. трудоемко. очень немного проектов где это действительно надо
было сделано на основе обсфукации+мусор+перемешивание. Обсфукация в виде КА с рандомной
реализацией ВМ. т.е. по сути команды ВМ написаны на одном языке, а потом транслируются в код ВМ
при этом правила трансляции генерятся рандомно, т.е. мусор туда впихивается и запутывается алгоритм (лишние ветки, условия, циклы и т.п. - по идее имитовставки в криптографии).
до конца (рождения?) не дожило, было брошено по причине надоедания



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 09 августа 2006 13:38
· Личное сообщение · #4

n1kto
Занятно написал, спасибо!

-----
My love is very cool girl.




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 августа 2006 19:39 · Поправил: net3ton
· Личное сообщение · #5

Я вот тут повыкупал немного...
Вот к примеру на основе машины Тьюринга, выходт че то примерно такое:

Исходную прогу разбиваю на фрагменты. Например:

mov eax,011 1
cmp ebx,eax 1
je L1:
xor eax,eax 2
L1: mov ebx,02 3

И получаю ленту и прогу для машины Тьюринга:
________________ |
Состояние ленты: 0 1 2

Прога:
___сотояние 0 |_ сотояние 1 |
0 | команда 1 __ комманда 2
1 |___________ комманда 3
2 |

комманда 1 = 0R1 и выполнение фрагмента 1, кроме того в зависимости от результата cmp ebx,eax под коретку (она уже в 1) пишем 0 или 1.
комманда 2 = 1S1 и выполняем фрагмент 2.
комманда 3 = 1R2 и выполняем фрагмент 3.

Кроме того можно еще динамически шифровать/дешифровать комманды. В каждой комманде делать запись на ленту (чтобы не бросались в глаза комманды перехода). Заметаморфить и обфусцировать выполняемые фрагменты кода. Запутать саму программу на машине Тьюринга.

Получаем что комманды переходов реализуются самой машиной Тьюринга, а остальные выполняеются в живую...
Вобщем вот такое в голову пришло...
А есть ссылочки именно на реализацию ВМ на машине Тьюринга?
--------------------------
Насчет AsProtect. Я сильно не разбирался, но судя по статьям он ворует инструкции и исполняет их своей универсальной функцией, в которой сначало определяет что за инструкция. Он ворует только jxx и call. А что мешает к примеру сначало пройти по файлу и найти часто встречающиеся последовательности инструкций и воровать их. При этом в каждой проге будут сперты разные инструкции и их последовательности. Или это реализовать очень сложно?

А вообще, что труднее для реверсинга выходит - ВМ на Тьюринга или спертые инструкции?



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 22 августа 2006 21:24
· Личное сообщение · #6

net3ton
Почитал я статью Криса Касперски, про обфускаци, начал читать его ссылки, плюс ковыряние кейгенми Ms-Rem`a (на основе Машины Тьюринга) понял, что надо сейчас нечто другое! Почему:

1. Раз есть вм-опкод, значит есть последовательность опкодов x86 проца, которая выполнит вм-опкод, отсюда можно написать декомпилятор из вм-опкода в -листинг на ассемблере, который про оптимизировать и получится оригинальный алгоритм
2. Если применялась обфускация, можно попробовать прогнать через оптимизаторы кода (они существуют).

-----
My love is very cool girl.




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 августа 2006 23:28
· Личное сообщение · #7

theCollision
Но мне кажется, что можно хорошо это дело запутать через запутывание уже вм-опкодов. Например касательно Машины Тьюринга, то введение липовых комманд и состояний. Тада нужен будет какой нить трейсер этой самой машины.
Можно как нить шифровать хитро вм-опкоды, там пересекающимися областями, чтобы было трудно все расшифровать...
Плюс опять же в той же машине Тьюринга переходы уже будут на уровне логики машины. Хотя конечно в принципе разобраться можно со всем, к тому же наверно дофига алгоритмов восстановления.

А не подскажешь ссылочку на статью Касперски про обфускацию? И на кейгенми Ms-Rem'а.



Ранг: 54.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 22 августа 2006 23:46
· Личное сообщение · #8

www.insidepro.com/kk/080/080r.shtml



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 23 августа 2006 08:24
· Личное сообщение · #9

theCollision пишет:
написать декомпилятор из вм-опкода в -листинг на ассемблере, который про оптимизировать и получится оригинальный алгоритм

псевдокод в правильных вм в чистом виде не лежит, следовательно борода твоему т.н. декомпилятору, для декомпиляции обязательно потребуется трейсер, который будет отслеживать моменты расшифровки\мат. преобразования псевдокодов и уже после этого передавать их для декопиляции твоему декомпилеру
А если вм каждый раз видоизменяется, то простому декомпилеру - вообще грош цена. Не забывай, что есть куча антитрассировочных приёмов, которые еще надо учесть и обойти в трейсере

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 23 августа 2006 12:10
· Личное сообщение · #10

Smon
Да ты прав, я видать сужу по вм применненной в keygenme Ms-Rem`ом.

ЗЫ:
может кто подскажет линки по вирт.машинам, вообще что есть по данной тематике. То что я нашел, мне мало! МНОГО ХАЧУ

-----
My love is very cool girl.





Ранг: 71.9 (постоянный), 4thx
Активность: 0.040
Статус: Участник

Создано: 24 августа 2006 16:09 · Поправил: jangle
· Личное сообщение · #11

Блин, меня тоже интересуют виртуальные стековые машины!
Кстати, кто-нибудь проектировал псевдокоды для управления арифметическим стеком?
Я сейчас эти занимаюсь, вот хочу реализовать эти команды (взял из Форта)
Подскажите, может еще нужны какие-то команды, или этих хватит на все случаи жизни?


DROP ( n - ) Очищает вершину стека
DUP ( n - n n ) Делает копию числа на вершине стека
SWAP ( n1 n2 - n2 n1 ) Переставляет местами два числа
OVER ( n1 n2 - n1 n2 n1 ) Копирует второе число на вершину
ROT ( n1 n2 n3 - n2 n3 n1 ) Перекладывает третье число на вершину
n PICK ( n1 ... - n1 ... n1 ) Кладет на вершину копию п-го элемента
n ROLL ( n1 ... - ... n1) Перекладывает п-й элемент на вершину
?DUP ( n - n n ) или ( 0 - 0 ) Выполняет операцию DUP, если n == 0
DEPTH ( ... - n ) Возвращает в стек n -- число элементов




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 27 августа 2006 08:25
· Личное сообщение · #12

jangle
Наконец-то нашел, для тебя чтиво:
www.wasm.ru/forum/viewtopic.php?id=8642

-----
My love is very cool girl.





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 08 февраля 2007 00:59
· Личное сообщение · #13

Появился вопрос по теме - как лучше организовать работу стека?
Если ВМ использует стек программы, то надо будет организовать обращение к параметрам вызываемой функции. Если создать свой, то тогда с этим проблем не будет, но появится проблема с SEH. Какой способ лучше?



Ранг: 128.8 (ветеран), 21thx
Активность: 0.060.05
Статус: Участник

Создано: 08 февраля 2007 22:35
· Личное сообщение · #14

www.unpack.c n/viewthread.php%3Ftid%3D3629%26extra%3D%26page%3D1

Кое-что о виртуальной машине WinLicense от Orean



Ранг: 128.8 (ветеран), 21thx
Активность: 0.060.05
Статус: Участник

Создано: 08 февраля 2007 22:40
· Личное сообщение · #15

Уточнение
www.unpack.cn/viewthread.php?tid=3629



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 08 февраля 2007 23:05
· Личное сообщение · #16

HoBleen
Шо есть стек? Какие виды команд при работе со стеком и как случается эксепшен!
Ты можешь заменить на равно значную логику,но более гибку, я по пробывал воспользваться двух.связными списками!
К примеру, есть память линейная когда чтобы обратиться к байту надо знать адрес, чтобы к следущему надо адрес + 1 и т.д.
А теперь можно по эксперементировать:
DwordMemory {
{A4+}
DwordPtrPrev : Cardinal; // Адрес предудущего dword
DwordPtrNext : Cardinal; // Адрес следующего dword
DwordValue : Cardinal; // Значение этой ячейки
{A4-}

Потом:

MemorySegm : array[0..SizeOfMem] of DwordMemory;

Тогда при такой работе с памятью, усложнится визуальный анализ, да и написание ПО для анализа, тоже может усложниться. Если это сделать еще в виде виртуального шелл-памяти и виртуального шелл-кода, думаю будет занятно реверсить, но это имхо.
Какже организовать SEH, да также как система это делает, на нуле ловит аппаратное и давай обрабатывать )))

-----
My love is very cool girl.





Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 08 февраля 2007 23:48
· Личное сообщение · #17

theCollision пишет:
Какже организовать SEH, да также как система это делает, на нуле ловит аппаратное и давай обрабатывать )))

Дело в том, что если заменять стек на свой созданный, то при возникновении исключения система не захочет его обрабатывать. Источник: wasm.ru/article.php?article=Win32SEHPietrek3
Поэтому я и спрашиваю - легче использовать общий стек, но при обращении к аргументам изменять указатель с поправкой на локальные переменные виртуальной машины. Либо делать как в ASPr'е - загонять в стек часть стека ниже себя в количестве, достаточном для захватывания всех аргументов.

Получается ни у кого такой проблемы не возникало?)



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 09 февраля 2007 00:29
· Личное сообщение · #18

HoBleen
SEH же не аппаратно реализован!!! А большую часть программно! Почему бы тебе не сделать свой SEH ?
Т.е. при анализе работы кода, если ты видишь установку SEH, заменяешь его на свой код которые делает свою реализацию SEH

-----
My love is very cool girl.



<< . 1 . 2 . 3 .
 eXeL@B —› Программирование —› Написание виртуальной машины
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати