eXeL@B —› Программирование —› Написание виртуальной машины |
<< . 1 . 2 . 3 . |
Посл.ответ | Сообщение |
|
Создано: 25 июля 2006 12:46 · Личное сообщение · #1 |
|
Создано: 09 августа 2006 12:25 · Личное сообщение · #2 n1kto Ты на форуме видать не живешь и топики не читаешь, иначе бы ты знал, что об архитектуре ЭВМ я наслышан и даже очень(читай тему про xor). Но что толку от того, если я задам скажем логику PDP-11, все равно это будет подчиняться логика, а где логика там и догадки, следовательно,Хоть и трудно но разобрать можно! Ты сталкивался, с криптографическими алгоритмами, где действия как надо расшифровывать, хранятся в самом ключе? Вот именно этого я и хотел бы, потому что нет логики, не очем судить, да даже если ключ есть, то если он каждый раз уникален и вирт.машина кажд.раз разная, то мало разобрать машину, надо еще понять, как его туда всунуть! То бишь задать логику работы программы для интерпретатора вирт.машины выносной и записать его в ключ-активации ----- My love is very cool girl. |
|
Создано: 09 августа 2006 12:59 · Личное сообщение · #3 theCollision пишет: Ты на форуме видать не живешь и топики не читаешь, иначе бы ты знал, что об архитектуре ЭВМ я наслышан и даже очень(читай тему про xor). Но что толку от того, если я задам скажем логику PDP-11, все равно это будет подчиняться логика, а где логика там и догадки, следовательно,Хоть и трудно но разобрать можно! засмущал тогда я определение алгоритма приводить не буду, хорошо? хотя из него следует что алгоритм без логики конечно возможен, но вычислительно бесполезен theCollision пишет: Ты сталкивался, с криптографическими алгоритмами, где действия как надо расшифровывать, хранятся в самом ключе? ага. я такое даже разрабатывал. theCollision пишет: Вот именно этого я и хотел бы, потому что нет логики, не очем судить, да даже если ключ есть, то если он каждый раз уникален и вирт.машина кажд.раз разная, то мало разобрать машину, надо еще понять, как его туда всунуть! То бишь задать логику работы программы для интерпретатора вирт.машины выносной и записать его в ключ-активации это все реализуемо. и даже реализовано. но не работает упирается в систему программирования (писалось как препроцессор для дельфи) простенький вариант - nand cpu, emulme(?) by Leon, год 90-какойто. там ключом задается часть программы, а программа реализуется ВМ. простенько и со вкусом. theCollision пишет: То бишь задать логику работы программы для интерпретатора вирт.машины выносной и записать его в ключ-активации такое работает только для схемы регистрации с перегенерацией кода для каждого юзера. т.е. он тебе деньги и данные, ты ему (недостающие?) модули системы. с ватермарками, проверками и прочим. тоже реализовывалось. тяжело. трудоемко. очень немного проектов где это действительно надо было сделано на основе обсфукации+мусор+перемешивание. Обсфукация в виде КА с рандомной реализацией ВМ. т.е. по сути команды ВМ написаны на одном языке, а потом транслируются в код ВМ при этом правила трансляции генерятся рандомно, т.е. мусор туда впихивается и запутывается алгоритм (лишние ветки, условия, циклы и т.п. - по идее имитовставки в криптографии). до конца (рождения?) не дожило, было брошено по причине надоедания |
|
Создано: 09 августа 2006 13:38 · Личное сообщение · #4 |
|
Создано: 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. А что мешает к примеру сначало пройти по файлу и найти часто встречающиеся последовательности инструкций и воровать их. При этом в каждой проге будут сперты разные инструкции и их последовательности. Или это реализовать очень сложно? А вообще, что труднее для реверсинга выходит - ВМ на Тьюринга или спертые инструкции? |
|
Создано: 22 августа 2006 21:24 · Личное сообщение · #6 net3ton Почитал я статью Криса Касперски, про обфускаци, начал читать его ссылки, плюс ковыряние кейгенми Ms-Rem`a (на основе Машины Тьюринга) понял, что надо сейчас нечто другое! Почему: 1. Раз есть вм-опкод, значит есть последовательность опкодов x86 проца, которая выполнит вм-опкод, отсюда можно написать декомпилятор из вм-опкода в -листинг на ассемблере, который про оптимизировать и получится оригинальный алгоритм 2. Если применялась обфускация, можно попробовать прогнать через оптимизаторы кода (они существуют). ----- My love is very cool girl. |
|
Создано: 22 августа 2006 23:28 · Личное сообщение · #7 theCollision Но мне кажется, что можно хорошо это дело запутать через запутывание уже вм-опкодов. Например касательно Машины Тьюринга, то введение липовых комманд и состояний. Тада нужен будет какой нить трейсер этой самой машины. Можно как нить шифровать хитро вм-опкоды, там пересекающимися областями, чтобы было трудно все расшифровать... Плюс опять же в той же машине Тьюринга переходы уже будут на уровне логики машины. Хотя конечно в принципе разобраться можно со всем, к тому же наверно дофига алгоритмов восстановления. А не подскажешь ссылочку на статью Касперски про обфускацию? И на кейгенми Ms-Rem'а. |
|
Создано: 22 августа 2006 23:46 · Личное сообщение · #8 |
|
Создано: 23 августа 2006 08:24 · Личное сообщение · #9 theCollision пишет: написать декомпилятор из вм-опкода в -листинг на ассемблере, который про оптимизировать и получится оригинальный алгоритм псевдокод в правильных вм в чистом виде не лежит, следовательно борода твоему т.н. декомпилятору, для декомпиляции обязательно потребуется трейсер, который будет отслеживать моменты расшифровки\мат. преобразования псевдокодов и уже после этого передавать их для декопиляции твоему декомпилеру А если вм каждый раз видоизменяется, то простому декомпилеру - вообще грош цена. Не забывай, что есть куча антитрассировочных приёмов, которые еще надо учесть и обойти в трейсере ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels |
|
Создано: 23 августа 2006 12:10 · Личное сообщение · #10 |
|
Создано: 24 августа 2006 16:09 · Поправил: jangle · Личное сообщение · #11 Блин, меня тоже интересуют виртуальные стековые машины! Кстати, кто-нибудь проектировал псевдокоды для управления арифметическим стеком? Я сейчас эти занимаюсь, вот хочу реализовать эти команды (взял из Форта) Подскажите, может еще нужны какие-то команды, или этих хватит на все случаи жизни? DROP ( n - ) Очищает вершину стека
|
|
Создано: 27 августа 2006 08:25 · Личное сообщение · #12 |
|
Создано: 08 февраля 2007 00:59 · Личное сообщение · #13 |
|
Создано: 08 февраля 2007 22:35 · Личное сообщение · #14 |
|
Создано: 08 февраля 2007 22:40 · Личное сообщение · #15 |
|
Создано: 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. |
|
Создано: 08 февраля 2007 23:48 · Личное сообщение · #17 theCollision пишет: Какже организовать SEH, да также как система это делает, на нуле ловит аппаратное и давай обрабатывать ))) Дело в том, что если заменять стек на свой созданный, то при возникновении исключения система не захочет его обрабатывать. Источник: wasm.ru/article.php?article=Win32SEHPietrek3 Поэтому я и спрашиваю - легче использовать общий стек, но при обращении к аргументам изменять указатель с поправкой на локальные переменные виртуальной машины. Либо делать как в ASPr'е - загонять в стек часть стека ниже себя в количестве, достаточном для захватывания всех аргументов. Получается ни у кого такой проблемы не возникало?) |
|
Создано: 09 февраля 2007 00:29 · Личное сообщение · #18 |
<< . 1 . 2 . 3 . |
eXeL@B —› Программирование —› Написание виртуальной машины |