Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.016 c
15-1441200729
DayGaykin
2015-09-02 16:32
2016.07.24
Определить металл


2-1415425555
Signal
2014-11-08 08:45
2016.07.24
Чтение почты через протокол с TLS порт 995


15-1447240616
AndrewAndrey
2015-11-11 14:16
2016.07.24
Права доступа WinServer2012r2


15-1445778899
pavelnk
2015-10-25 16:14
2016.07.24
SEO странность


15-1442179801
Юрий
2015-09-14 00:30
2016.07.24
С днем рождения ! 14 сентября 2015 понедельник