Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

Сели тут со знакомым и за два дня ...   Найти похожие ветки 

 
Rouse_ ©   (2015-10-23 20:47) [0]

...сделали мутатор на NOR базисе с примитивной обфускацией.
И самое интересное, что так, как мы его сделали, похоже будет просто объяснить остальным.

К примеру, возьмем обычное сложение а = 10 + 20.
При обфускации это выльется вот в такой код: http://rouse.drkb.ru/tmp/vm_add_10_20.zip

Это результат декомпиляци в IDA Pro c использование Hex-Rase. В асм коде это около 83 тысяч инструкций :)

А изначальный исходный код состоял всего из 70-80 строчек.

Заинтересовались?
Ну тогда, кому интересно - ставьте плюс.
Статья будет долгой и тяжелой :)


 
Palladin ©   (2015-10-23 20:59) [1]

дело было вечером, дело было в пятницу
+


 
Sha ©   (2015-10-23 21:56) [2]

+ конечно, интересно


 
Rouse_ ©   (2015-10-23 23:39) [3]

Постараюсь к новому году завершить.
Самое смешное в том что я тестировал VMProtect и решил реализовать аналог, чтоб проще хэндлеры было разбирать, а тут вон оно в что вылезло :)


 
Германн ©   (2015-10-24 00:55) [4]


> Rouse_ ©   (23.10.15 20:47)
> Заинтересовались?

+


 
Rouse_ ©   (2015-10-24 11:12) [5]

Палладин мне тут в аське намекнул, мол откуда 70-80 строчек, если делаем сложение :)
Так то оно да, но сложение делаем как:

A = vmAdd(10, 20)

А 80 строчек, это реализация этого самого vmAdd :)


 
ksergey ©   (2015-10-24 17:14) [6]

Rouse_ ©   (24.10.15 11:12) [5]
> А 80 строчек, это реализация этого самого vmAdd :)


Я извиняюсь, а обсускация в таком случае точно требуется? типа без неё всё слишком понятно?


 
Rouse_ ©   (2015-10-24 19:15) [7]

А vcl понятен?
А это тоже обфускация :)


 
Германн ©   (2015-10-25 01:53) [8]


> Rouse_ ©   (24.10.15 19:15) [7]
>
> А vcl понятен?
> А это тоже обфускация :)
>  

Ну скорее не сама VCL, а Дельфи/Паскаль. Как и все языки высокого уровня.
Последний раз когда я видел декомпиллер способный восстановить исходник из исполняемого файла был в замшелых 60-х. И то это был исполняемый файл от ТП3.


 
Омлет ©   (2015-10-25 11:34) [9]

+


 
brother ©   (2015-11-02 11:15) [10]

+ но я не понял

> К примеру, возьмем обычное сложение а = 10 + 20.
> При обфускации это выльется вот в такой код: http://rouse.drkb.ru/tmp/vm_
> add_10_20.zip

это одно и тоже? тогда приче тут

> А изначальный исходный код состоял всего из 70-80 строчек.

?


 
brother ©   (2015-11-02 11:16) [11]

и еще, а зачем так над процом издеваться? потеря производительности то зачем, вроде всегда оптимальный код хотели...


 
Rouse_ ©   (2015-11-02 12:23) [12]


> brother ©   (02.11.15 11:16) [11]
> и еще, а зачем так над процом издеваться?

Сие называется обфускация алгоритма. Дабы никто не влез и ничего не поменял там где не надо.


 
brother ©   (2015-11-02 12:49) [13]

> Сие называется обфускация алгоритма.

спс кэп)

> Дабы никто не влез и ничего не поменял там где не надо.

это понятно кэп...


 
Rouse_ ©   (2015-11-02 12:53) [14]

Тогда я не понял что ты не понял :)


 
brother ©   (2015-11-02 13:11) [15]

начнем с [10] :)


 
Rouse_ ©   (2015-11-02 15:29) [16]

Ответ был дан еще в [5] :)


 
DayGaykin ©   (2015-11-02 15:59) [17]


> A = vmAdd(10, 20)
> А 80 строчек, это реализация этого самого vmAdd :)

А если я сделаю:
A = vmAdd(10, 20)
B = vmAdd(A, 30)
То итоговый код этих команд будет идти по порядку сначала первой команды, а потом второй или смешается между собой?


 
Rouse_ ©   (2015-11-02 16:06) [18]

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


 
brother ©   (2015-11-02 16:50) [19]

а чет пропустил... все понятно...


 
Rouse_ ©   (2015-11-02 17:53) [20]


> DayGaykin ©   (02.11.15 15:59) [17]

В сишной реализации мы сейчас поэксперементировали и такое возможно (основной фреймворк мы на С++ пишем) а на дельфи наверное врятли, но я попробую поэксперементировать, мне тут подсказали пару идеек, как заставить компилятор работать так как мне удобно, поэтому ближе к статье отвечу.


 
DayGaykin ©   (2015-11-03 15:41) [21]

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

У меня работа с этим не пересекается (и даже не предвидится), поэтому это лишь фантазии.


 
Rouse_ ©   (2015-11-03 19:06) [22]


> DayGaykin ©   (03.11.15 15:41) [21]
> Мне интересна такая техника, когда код сжимается, оптимизируется
> и смешивается

Это не ко мне, у меня наоборот раздувание и деоптимизация.

Смешивается так, что вообще ничего не разобрать
Вот это уже ближе.


> Там чтобы исходник нельзя было восстановить даже теоретически.
>  Мне интересно возможно ли такое.

Да, такое возможно, но смысл?
Задача обфускации заключается в затруднении восстановления алгоритма, а не исходника.
А вот запретить восстановить алгоритм - это не возможно.

Вот тебе к примеру моя старая статья: http://habrahabr.ru/post/218887/
- Исходный код восстановлен?
- Да
- Алгоритм из него изначально понятен?
- Нет
- Задача решена?
- Да


 
DayGaykin ©   (2015-11-03 19:31) [23]

Интересная статья - читал.

Могу поспорить, что смогу написать keygenme, для которого не получится сделать keygen за разумное количество времени (неделю например).


 
Kerk ©   (2015-11-03 19:40) [24]

Я уже написал keygenme, для которого вообще невозможно сделать keygen :)


 
DVM ©   (2015-11-03 21:51) [25]


> Rouse_ ©   (03.11.15 19:06) [22]


> А вот запретить восстановить алгоритм - это не возможно.

А если часть алгоритма или отдельные его примитивы реализованы аппаратно на USB ключе и алгоритм оттудова неизвлекаем?


 
Rouse_ ©   (2015-11-03 22:00) [26]


> DVM ©   (03.11.15 21:51) [25]
> А если часть алгоритма или отдельные его примитивы реализованы
> аппаратно на USB ключе и алгоритм оттудова неизвлекаем?

Атака на черный ящик, частотная и по графам (долго, муторно, но решаемо).
Хасп и первый Стелс так и ломали.


> Kerk ©   (03.11.15 19:40) [24]
> Я уже написал keygenme, для которого вообще невозможно сделать
> keygen :)

Я тоже, меня Зотыч научил :)


 
Kerk ©   (2015-11-03 22:04) [27]


> Rouse_ ©   (03.11.15 22:00) [26]
>
> > Kerk ©   (03.11.15 19:40) [24]
> > Я уже написал keygenme, для которого вообще невозможно сделать
> > keygen :)
>
> Я тоже, меня Зотыч научил :)

Вряд ли Зотыч изобрел RSA и прочие асимметричные алгоритмы :)

Все это запутывание алгоритма, то есть "security through obscurity" - это забавно как головоломка, типа кроссворд. Но на практике написать генератор ключей, для которого невозможно сделать сторонний keygen, слишком просто, чтобы пренебречь такой возможностью.


 
Rouse_ ©   (2015-11-03 22:05) [28]


> DayGaykin ©   (03.11.15 19:31) [23]
> Интересная статья - читал.
>
> Могу поспорить, что смогу написать keygenme, для которого
> не получится сделать keygen за разумное количество времени
> (неделю например).

Даж не сомневаюсь, это делается на любой комбинаторике, к примеру возьмем N-мерный куб, проведите шарик по лабиринту в данных измерениях, где ключ является неким маршрутом (даж обфускации не надо, устанешь решать, если не понимаешь алгоритма).

Я тебе для теста в статье выкачу два кейгенми, один на основе кода идущего к статье, и второй на базе нашего фреймворка, решишь за 3 месяца - с меня коньяк :)


 
Rouse_ ©   (2015-11-03 22:06) [29]


> Kerk ©   (03.11.15 22:04) [27]
> Вряд ли Зотыч изобрел RSA и прочие асимметричные алгоритмы :)

Ромч ты даже не представляешь насколько легко взламывается защита, основанная на RSA :)


 
Kerk ©   (2015-11-03 22:21) [30]


> Rouse_ ©   (03.11.15 22:06) [29]
>
>
> > Kerk ©   (03.11.15 22:04) [27]
> > Вряд ли Зотыч изобрел RSA и прочие асимметричные алгоритмы
> :)
>
> Ромч ты даже не представляешь насколько легко взламывается
> защита, основанная на RSA :)

Давай проведем эксперимент. Я делаю простенький пример с использованием виндового CryptoAPI. Строчек 50 займет максимум. У тебя месяц на написание кейгена. Не кряка, не патча, а именно кейгена. Чтобы генерировал настоящие валидные ключи, которые эта программа примет.

Уверен, человек, который, не имея приватного ключа, сможет генерировать валидные цифровые подписи, станет всемирно заменит. Дерзай :)


 
Kerk ©   (2015-11-03 22:23) [31]

Я этот пример вместе с исходниками отдам, чтобы проще анализировать алгоритм было :)


 
Rouse_ ©   (2015-11-03 22:26) [32]


> Kerk ©   (03.11.15 22:21) [30]

Ром не старайся, я просто заменю публичный ключ :)


 
Rouse_ ©   (2015-11-03 22:29) [33]

Поясню, любой софт с RSA полагает что что-то, что он может расшифровать свои пабликом, считается валидным.
Атака на такую схему защиты заключается в изменении публичного ключа, после чего все это RSA идет в лес :)


 
Kerk ©   (2015-11-03 22:29) [34]


> Rouse_ ©   (03.11.15 22:26) [32]
>
> > Kerk ©   (03.11.15 22:21) [30]
>
> Ром не старайся, я просто заменю публичный ключ :)

Почему-то я так и думал, что ты сведешь все к крякам да патчам. Хотя речь-то шла о том, что кейген написать невозможно.

Хотя речь шла о (дословно): "Но на практике написать генератор ключей, для которого невозможно сделать сторонний keygen, слишком просто, чтобы пренебречь такой возможностью."


 
Rouse_ ©   (2015-11-03 22:30) [35]

Кстати я тебе это рассказывал когда консультировал тебя по защите твоего софта и ты тогда сказал что цимес понял :)


 
Rouse_ ©   (2015-11-03 22:33) [36]


> Kerk ©   (03.11.15 22:29) [34]
> Хотя речь-то шла о том, что кейген написать невозможно.

Я такого не говорил, я говорил о затруднении понимания алгоритма генерации ключа, а о невозможности, я говорил только в том ключе, что это невозможно запретить :)


 
Kerk ©   (2015-11-03 22:37) [37]


> Rouse_ ©   (03.11.15 22:33) [36]
>
> > Kerk ©   (03.11.15 22:29) [34]
> > Хотя речь-то шла о том, что кейген написать невозможно.
>
> Я такого не говорил

А я-то говорил.
Ты читай на что отвечаешь :)))

Судя по названию keygenme, по условиям задачи нужно написать именно кейген, а не патчить да крякать.

Что я имею ввиду.

Автор этого keygenme из статьи очень старался, запутывал алгоритм, не одни сутки наверно потратил на отладку. А нафига? В итоге для этой программы кейген написать все равно можно. Именно поэтому его опыты годятся разве что в качестве кроссворда.

Если все его старания заменить на вызов трех API-функций, то на выходе получится 100% защита от кейгенов.


 
Rouse_ ©   (2015-11-03 22:45) [38]


> Судя по названию keygenme, по условиям задачи нужно написать
> именно кейген, а не патчить да крякать.
>
> Что я имею ввиду.

А, ты в этом плане.
Тогда да согласен, конечно за приемлимое время на 1024 ключе разложение не сделаешь.


> Автор этого keygenme из статьи очень старался, запутывал
> алгоритм, не одни сутки наверно потратил на отладку. А нафига?

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


 
Rouse_ ©   (2015-11-03 22:48) [39]

Кстати, вдруг кому будет интересно: эмуляция asm инструкции CMP (результат в виде набора флагов)

http://rouse.drkb.ru/tmp/cmp.zip

ЗЫ: это в качестве понимания, что именно сейчас пишется.


 
Kerk ©   (2015-11-03 22:54) [40]

Просто, по-моему если доступен надежный инструмент в виде CryptoAPI, надо им пользоваться.

100% простая защита от кейгенов у нас есть, а от кряков к сожалению нет.  Запутывания пригодятся, например, чтоб спрятать проверку целостности exe. Или логику программы сделать зависимой от значения 3го и 5го байтов публичного ключа. Ну и т.п.

Но кряки относительно безобидны. Изменил пару строк, перекомпилировал программу и кряк скорее всего уже не работает. А вот если кейген появится на просторах сети, то туши свет.


 
Rouse_ ©   (2015-11-03 22:59) [41]


> Kerk ©   (03.11.15 22:54) [40]

Ром ты рассматриваешь это в некой абстракции, а я на практике.
Так вот утвердительно на 99.9% я смогу ответить только в том случае, если у меня спросят - наступит ли завтра утро.
А на практике я еще не встречал ни одной программы защищенной неким серийником, которая держалась бы долго только на проверке оного. Просто поверь моему опыту :)


 
DVM ©   (2015-11-03 23:37) [42]


> Rouse_ ©   (03.11.15 22:29) [33]
> Поясню, любой софт с RSA полагает что что-то, что он может
> расшифровать свои пабликом, считается валидным.
> Атака на такую схему защиты заключается в изменении публичного
> ключа, после чего все это RSA идет в лес :)

Подробнее можно, а то из этого предложения ничего не понятно. Как можно кого то заставить использовать твой публичный ключ вместо настоящего?


 
DVM ©   (2015-11-03 23:40) [43]


> Как можно кого то заставить использовать твой публичный
> ключ вместо настоящего?

Предполагается, что есть доступ к исполняемому файлу процесс которого оперирует ключом, что ли?


 
Rouse_ ©   (2015-11-03 23:41) [44]


> VM ©   (03.11.15 23:40) [43]
> Предполагается, что есть доступ к исполняемому файлу процесс
> которого оперирует ключом, что ли?

Конечно


 
Kerk ©   (2015-11-04 00:16) [45]


> Rouse_ ©   (03.11.15 22:59) [41]

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


 
Rouse_ ©   (2015-11-04 00:40) [46]

Удалено модератором


 
Германн ©   (2015-11-04 01:18) [47]

Вот только вчера в поисках нужной статьи на королевстве наткнулся на цикл статей Дмитрия Логинова 15-16 летней давности.
Вот вроде почти уже сто лет прошло, а аргументы сторонников защиты путем серийников (любых) всё ещё приводятся.


 
DayGaykin ©   (2015-11-04 03:17) [48]

Меня ещё позабавил кейген для IDEA. Кейген на яве с исходниками - такая ирония:)

Я сам за веб - хорошо, что там эта проблема не стоит.
Писал ещё софт для терминалов - там тоже не стояла.


 
Игорь Шевченко ©   (2015-11-04 10:23) [49]

А вот Oracle без всяких кейгенов и серийников, и ничего, процветает.


 
Юрий Зотов ©   (2015-11-04 17:56) [50]

> Kerk ©   (03.11.15 22:04) [27]

Зотыч, конечно, RSA не изобретал. Но каждый день с ним работает.

:o)


 
Eraser ©   (2015-11-04 22:05) [51]

да, триал-стоп и кейген - самые неприятные вещи. ну а кряки - что с них взять )


 
Германн ©   (2015-11-05 01:42) [52]

Удалено модератором
Примечание: Создание пустых сообщений


 
Вопрошающий2015 ©   (2015-11-10 23:57) [53]


> Kerk ©   (03.11.15 22:21) [30]


> Давай проведем эксперимент. Я делаю простенький пример с
> использованием виндового CryptoAPI. Строчек 50 займет максимум.
>  У тебя месяц на написание кейгена. Не кряка, не патча,
> а именно кейгена. Чтобы генерировал настоящие валидные ключи,
>  которые эта программа примет.

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

Подозреваю, что есть какая-то хитрость, любопытно какая, хотя бы намеки.


 
Kerk ©   (2015-11-11 00:01) [54]


> Ведь публичный ключ шифрует данные, секретный расшифровывает,
>  а не наоборот.

Наоборот тоже можно. Так что программа с помощью публичного ключа расшифровывает то, что было зашифровано секретным ключом.


 
Вопрошающий2015 ©   (2015-11-11 00:46) [55]


> Kerk ©   (11.11.15 00:01) [54]

Спасибо за наводку, посмотрю в этом направлении.


 
Rouse_ ©   (2015-11-11 09:45) [56]


> Вопрошающий2015 ©   (10.11.15 23:57) [53]

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


 
Eraser ©   (2015-11-11 19:09) [57]


> Rouse_ ©   (11.11.15 09:45) [56]


> любое сообщение зашифрованное приватным, сможет расшифровать
> любой, но никто не сможет создать такое-же зашифрованное
> сообщение.

цифровая подпись? )


 
Kerk ©   (2015-11-11 19:10) [58]


> цифровая подпись? )

Ну она так и работает. Обычно шифруют секретным ключом хэш сообщения. Любой желающий может пересчитать хэш, расшифровать твою версию и сравнить.


 
Rouse_ ©   (2015-11-11 20:09) [59]


> Eraser ©   (11.11.15 19:09) [57]
> цифровая подпись? )

Да, если не использовать скомпроментированный SHA1, цифровая подпись работает на этом-же принципе, как Рома выше и сказал :)


 
Rouse_ ©   (2015-11-12 18:41) [60]

Ну собственно фреймворк (для C++14) готов, на выходных буду часть его переводить под Дельфи и готовится к статье.
Почему часть? Ну потому что есть у меня свои идеи по развитию данного проекта, и не всем готов открыто поделиться. Сори.

Впрочем, кто там говорил что хочет посмотреть кейгенми?
Так у меня есть он: http://rouse.drkb.ru/tmp/keygenme.zip

Файл не запакован, не зашифрован, антиотладки и прочих трюков нет.
Адрес обработчика кнопки: 00401270

В этом же виде он выложен на "crackmes.de", но пока не прошел модерацию, скоро должен открыться по данной ссылке: http://www.crackmes.de/users/rouse/keygenme_1/
Как раз к выходу статьи и посмотрим, насколько хороша технология, о которой собираюсь рассказать :)

ЗЫ в дополнению к вопросу:


> DayGaykin ©   (02.11.15 15:59) [17]
> А если я сделаю:
> A = vmAdd(10, 20)
> B = vmAdd(A, 30)
> То итоговый код этих команд будет идти по порядку сначала
> первой команды, а потом второй или смешается между собой?


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


 
Rouse_ ©   (2015-11-12 18:52) [61]

ЗЫ: забыл особо указать на то, что это результат работы обычного компилятора.
Т.е. файл вот как он был скомпилирован, так и был выложен. Никаких последующих махинаций с ним не производилось.
При этом (даже вот в таком простом случае) IDA Pro, уже отказывается строить граф хэндлера.
В Delphi, конечно, именно такого результата не добиться, но что-то очень сильно приближенное, и практически так-же усложняющее анализ логики, скорее всего получится.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.62 MB
Время: 0.006 c
15-1441106416
Rouse_
2015-09-01 14:20
2016.07.24
Небольшой анонс по поводу FWZip


15-1442611639
DayGaykin
2015-09-19 00:27
2016.07.24
Помощник игры в Сапера.


15-1441920602
Юрий
2015-09-11 00:30
2016.07.24
С днем рождения ! 11 сентября 2015 пятница


15-1447058234
K-1000
2015-11-09 11:37
2016.07.24
Record -> String (2)


2-1416746513
Max
2014-11-23 15:41
2016.07.24
Сортировка в ListView WinApi.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский