?

Log in

No account? Create an account
Что останется после моей смерти? - Sitting on the top of the mushroom.
November 18th, 2013
08:57 pm
[User Picture]

[Link]

Previous Entry Share Next Entry
Что останется после моей смерти?
Может быть, немного неплохого кода...

В очередной раз встала задача спрятать кусок кода и программу от врагов. Библиотеки .Net отлично декомпилируются до исходного кода, так что вопрос немного не праздный.
В данном случае предполагается, что враги могут утащить программу и попытаться ей воспользоваться, понять, как она работает и прочие плохие вещи.
Для предотвращения такой ситуации традиционно используют разные сложные защиты, которые более или менее плохо мешают работать.
Я изобрел велосипед следующего вида:
1. Жизненно важная функция программы выносится в отдельную библиотеку.
2. Отдельная программа сжимает библиотеку GZipStream и шифрует ее Rijndael.
3. В ресурсы основной программы добавляется зашифрованный файл.
4. При запуске программы пользователь должен указать пароль для расшифровки.
5. Библиотека расшифровывается в память процесса, к ее классам можно обращаться при помощи Reflection.
Ясно, что такая схема не спасает от ушлого специалиста со специальным отладчиком и перехватчиком нажатий кнопок на клавиатуре. Ну или просто от злонамеренного легального пользователя.
Однако в данном случае мы предполагаем благие намерения легального пользователя. Более того, если разные экземпляры программы шифровать разными ключами, то будет ясно, кто сегодня редиска.

Комментарии приветствуются.

Tags:

(13 comments | Leave a comment)

Comments
 
[User Picture]
From:vilgeforce
Date:November 18th, 2013 05:00 pm (UTC)
(Link)
Перехватить файл на диске в памяти - как два пальца об асфальт :-) VMPROTECT/Armadillo посмотри.
[User Picture]
From:randir_spb
Date:November 18th, 2013 05:14 pm (UTC)
(Link)
Оно, вроде, для нормальных WinExe, не для .Net, нет?
Плюс, выковыривать загруженную сборку из памяти во время работы программы представляется мне достаточно непростой задачей.
[User Picture]
From:vilgeforce
Date:November 18th, 2013 05:28 pm (UTC)
(Link)
Ну ква, не пишите на НЕТе :-) Вроде для них тож есть...
Посмотри в сторону PETools. Оно прекрасно дампит память процесса :-)
[User Picture]
From:randir_spb
Date:November 18th, 2013 06:32 pm (UTC)
(Link)
А нет, надо было поискать. Кто-то эту задачу уже решил.
http://salmanzg.wordpress.com/2010/07/17/assembly-from-dump/
Только я пока не догнал, каким отладчиком человек пользуется.
И это все же требует сотрудничества с легальным пользователем, поскольку нет пароля - нет конфетки.
[User Picture]
From:randir_spb
Date:November 18th, 2013 06:33 pm (UTC)
(Link)
А сейчас ты меня побьешь, но после нескольких лет я имею право сказать, что .Net довольно удобная платформа.
Кстати, описанное работает и под Mono.
[User Picture]
From:cybercat
Date:November 18th, 2013 11:18 pm (UTC)
(Link)
А упаковать всё интересное в исполняемый "чёрный ящик", скомпилированный под нужный процессор и операционку, и оставить пользователю только обёртку от этого ящика в виде .NET-библиотеки?
[User Picture]
From:randir_spb
Date:November 19th, 2013 12:04 am (UTC)
(Link)
Не решит вопрос.
Скомпилированный код можно будет разобрать и понять, что он делает на самом деле. То есть шифровать код все равно придется.
И мне очень сильно лень переписывать этот код.
Плюс, времени на задачу было мало - два-три дня.
[User Picture]
From:move_yo
Date:November 18th, 2013 11:53 pm (UTC)
(Link)
да блин. напиши критичный кусок на чистых плюсах и обфускатором его. и еще пару приколов из серии 2-3 уровней распаковки в рантайме

только надо ли оно на самом деле?

Edited at 2013-11-18 11:54 pm (UTC)
[User Picture]
From:randir_spb
Date:November 19th, 2013 12:08 am (UTC)
(Link)
Надо ли оно на самом деле будет понятно, когда наши возьмут водокачку. Или не возьмут, тогда будет не надо.
И не думаю, что я за пару дней смог бы обфускаторы нормально проверить.
[User Picture]
From:myx_ostankin
Date:November 20th, 2013 07:14 am (UTC)
(Link)
Rijndael же! :)

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

Я вот только не понял, как разные ключи помогут опознать нарушителя режима? Rijndale же симметричный, да и в самой библиотеке ключа вроде нет?
[User Picture]
From:randir_spb
Date:November 20th, 2013 08:55 am (UTC)
(Link)
Поправил.
Дело даже не в том, что эта задача требует навыков, дело в том что это требует помощи от легального пользователя, знающего пароль.
Нарушителя режима можно опознать если каждый заказчик получает программу со своим собственным, уникальным паролем. В этом случае мы можем хранить базу с хэшами выпущенных версий и при необходимости - предъявить заказчику.
Конечно, злонамеренный пользователь может сделать дамп и зашифровать программу заново - тогда концов мы не найдем.
[User Picture]
From:myx_ostankin
Date:November 20th, 2013 10:24 am (UTC)
(Link)
Блин, я сам тоже хорош - во втором упоминании тоже опечатался. Вот что значит писать с телефона в метро :)

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

Я просто изначально понял задачу исключительно как "защитить код от декомпиляции".
[User Picture]
From:randir_spb
Date:November 20th, 2013 10:37 am (UTC)
(Link)
Строго говоря, легальный пользователь может зашифровать библиотеку заново, уже с новым паролем. Так что схема выявления злонамеренных пользователей не так эффективна.
Но в нашем случае все-таки ожидаются благонамеренные пользователи.
Powered by LiveJournal.com