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

Вниз

Зашитые в код строковые константы- как защитить их от просмотра?   Найти похожие ветки 

 
roadster ©   (2009-05-20 10:47) [0]

Всем привет!
Имеется программа, которая, грубо говоря, читает из инишника зашифрованную с ключом строку, расшифровывает ее, использует, при необходимости делает обратную операцию.
С зашифровкой/расшифровкой все понятно.
Дело в том, что ключ шифрования не будет вводиться вручную пользователем (это служба архивации, вертится на сервере). Хранить ключ во внешнем файле- все равно что не шифровать вовсе.
Интересует вариант объявления этого ключа в коде программы.
Если объявить константой- этот ключ видно даже в ФАРе :).
Если объявить ресурсстрингом- вроде не видно.
То есть задача: каким-то образом объявить строку, но чтобы декомпилятором/дизассемблером и ничем иным ее в файле ехе-шника нельзя было посмотреть.


 
brother ©   (2009-05-20 10:51) [1]

использовать шифрование и записывать в string уже шифрованную строку...


 
roadster ©   (2009-05-20 10:53) [2]

Ага, а ключ для расшифровки зашифрованной в стринг строки где хранить?
:)


 
brother ©   (2009-05-20 10:54) [3]

> Ага, а ключ для расшифровки зашифрованной в стринг строки
> где хранить?

ключ не нужен, храни алгоритм расшифровки...


 
Плохиш ©   (2009-05-20 10:55) [4]


> Интересует вариант объявления этого ключа в коде программы.

Ключ должен состоять из нечитаемого набора символов. А ещё можно и чередовать объявления константных символов.

> Если объявить ресурсстрингом- вроде не видно.

Рыдал, зачем тратить время на "защиту" от полных идиотов?


 
brother ©   (2009-05-20 10:57) [5]

> Рыдал, зачем тратить время на "защиту" от полных идиотов?

ну очередной велосипед для молодых.


 
brother ©   (2009-05-20 10:58) [6]

res:="Всем привет";
res2:="";

for i:= 1 to length(res) do
 res2:=res2 + chr(ord(res[i])+i);
showmessage(res2);

типа так ;)


 
roadster ©   (2009-05-20 11:22) [7]


> ну очередной велосипед для молодых.

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


 
brother ©   (2009-05-20 11:26) [8]

> но чтобы декомпилятором/дизассемблером и ничем иным ее в
> файле ехе-шника нельзя было посмотреть

только железный ключ тогда...


 
roadster ©   (2009-05-20 11:27) [9]


> только железный ключ тогда...

Не...
А ежли екзеху упаковщиком каким сжать?


 
brother ©   (2009-05-20 11:46) [10]

> А ежли екзеху упаковщиком каким сжать?

ну если уж будут смотреть:

> декомпилятором/дизассемблером и ничем иным ее в файле ехе-
> шника нельзя было посмотреть

то тут уже ничего не спасет)


 
brother ©   (2009-05-20 11:47) [11]

зы зачем такие сложности? от кого защищаем в итоге? мой пример не катит?


 
roadster ©   (2009-05-20 11:57) [12]


> зы зачем такие сложности? от кого защищаем в итоге? мой
> пример не катит?

Система резервного копирования.
Зипуху надо запаролить.
Пароль в инишнике в открытом виде держать не стоит.
Хочу ентот пароль зашифровать с ключом.

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

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


 
brother ©   (2009-05-20 11:59) [13]

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

так это же не

> декомпилятором/дизассемблером и ничем иным

;) Просто оч. строгие рамки ты поставил, тебе подойдет мой вариант


 
roadster ©   (2009-05-20 12:01) [14]

Не, эт я немного недописал...
Я хотел сказать, чтобы прошитый ключ НИЧЕМ нельзя было достать...


 
brother ©   (2009-05-20 12:02) [15]

> Я хотел сказать, чтобы прошитый ключ НИЧЕМ нельзя было достать...

это не реально!
Вы даете не реальные планы, это как его - валюнтаризм (с) Приключения Шурика


 
Юрий Зотов ©   (2009-05-20 12:05) [16]

> roadster ©   (20.05.09 10:53) [2]

1. На каждый паковщик есть свой распаковщик.

2. Защиты от серьезного хакера не существует.

3. Непросто написать программу, взлом которой заинтересовал бы  серьезного хакера. Поэтому стоит подумать - а станет ли серьезный хакер вообще Вашей программой заниматься? Она представляет для него хоть какой-нибудь интерес?
 
4. А для защиты от юных пионеров с гордо загнутыми пальцами вполне можно хранить зашифрованную строку, а код ее расшифровки вшить прямо в тело программы.

5. Если существует некий проверочный оператор
if <условие> then <работаем> else <не _работаем>
то это самое уязвимое место и о нем стоит подумать в первую очередь.


 
brother ©   (2009-05-20 12:06) [17]

> 4. А для защиты от юных пионеров с гордо загнутыми пальцами
> вполне можно хранить зашифрованную строку, а код ее расшифровки
> вшить прямо в тело программы.

я про [6] автору уже сколько говорю ;)


 
Юрий Зотов ©   (2009-05-20 12:12) [18]

Кстати, если речь идет о хранении ключа, то быть осмысленной строкой он вовсе не обязан. Никто не мешает сделать его бессмысленным набором байт, включая и непечатные коды.


 
roadster ©   (2009-05-20 12:12) [19]


> 4. А для защиты от юных пионеров с гордо загнутыми пальцами
> вполне можно хранить зашифрованную строку, а код ее расшифровки
> вшить прямо в тело программы.

А зашитый код расшифровки- насколько проблематичнее получить из екзехи? Ибо не против пионеров задумывается. Тривиальное перестановочное шифрование не подойдет...


 
Юрий Зотов ©   (2009-05-20 12:13) [20]

Еще кстати - а зачем вообще тут нужен ключ? Можно и без него.


 
roadster ©   (2009-05-20 12:14) [21]


> Кстати, если речь идет о хранении ключа, то быть осмысленной
> строкой он вовсе не обязан. Никто не мешает сделать его
> бессмысленным набором байт, включая и непечатные коды.

Эт понятно. Но ках лучше описать? переменной, константой, ресурсстрингом?
Пусть даже если и код расшифровки зашить?


 
roadster ©   (2009-05-20 12:15) [22]


> Еще кстати - а зачем вообще тут нужен ключ? Можно и без
> него.

Простые перестановочные алгоритмы?


 
roadster ©   (2009-05-20 12:20) [23]

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


 
Юрий Зотов ©   (2009-05-20 12:21) [24]

> roadster ©   (20.05.09 12:12) [19]

> А зашитый код расшифровки- насколько проблематичнее получить из
> екзехи?

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

Можно использовать полиморфный код. Можно еще кучу всего напридумывать (кстати, статей в Сети полно) - но защиты от серьезного хакера все равно нет. Весь вопрос лишь в рентабельности взлома - стоит ли его результат затраченных на него ресурсов?


 
brother ©   (2009-05-20 12:22) [25]

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

разошелся ;)
как вариант: читай разные байты СВОЕЙ программы по нужному алгритму)


 
Юрий Зотов ©   (2009-05-20 12:24) [26]

> roadster ©   (20.05.09 12:20) [23]

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


 
Плохиш ©   (2009-05-20 12:26) [27]


> roadster ©   (20.05.09 12:14) [21]
>
>
> > Кстати, если речь идет о хранении ключа, то быть осмысленной
> > строкой он вовсе не обязан. Никто не мешает сделать его
> > бессмысленным набором байт, включая и непечатные коды.
>
>
> Эт понятно. Но ках лучше описать?

Логику включить не пробовал, как ты собираешься узнавать какой из "бессмысленным набором байт" в exe является необходимым ключём.

> переменной, константой, ресурсстрингом?

Хотя, что это я про логику, тут со знаниями проблема.


 
roadster ©   (2009-05-20 12:32) [28]


> Логику включить не пробовал, как ты собираешься узнавать
> какой из "бессмысленным набором байт" в exe является необходимым
> ключём.

А бессмысленный набор символов в строковой константе не является бессмысленным набором байт? :) Ты ж не конкретизировал в посте, что за набор...


 
roadster ©   (2009-05-20 12:34) [29]


> как вариант: читай разные байты СВОЕЙ программы по нужному
> алгритму)

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


 
roadster ©   (2009-05-20 12:38) [30]


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

С ключом понадежнее будет. А сдвиг/перестановка/замена проще ломается...


 
Anatoly Podgoretsky ©   (2009-05-20 12:57) [31]


> Ибо не против пионеров задумывается.

Зато пионером.


 
Rouse_ ©   (2009-05-20 13:06) [32]

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


 
roadster ©   (2009-05-20 13:08) [33]


> Зато пионером.

Может тогда член партии с 18ХХ года подскажет что-нибудь?


 
roadster ©   (2009-05-20 13:12) [34]


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

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


 
Rouse_ ©   (2009-05-20 13:14) [35]


> Куда ж тады ключ запрятать?

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


 
Ega23 ©   (2009-05-20 13:17) [36]


> даю подсказку, асинхронные алгоритмы шифрования


Не поможет, у него как декодирование, так и декодирование используется (по крайней мере в [0] так написано, что обратные действия тоже нужны)


 
Rouse_ ©   (2009-05-20 13:19) [37]


> Не поможет, у него как декодирование, так и декодирование
> используется

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


 
Dennis I. Komarov ©   (2009-05-20 15:34) [38]


> Ega23 ©   (20.05.09 13:17) [36]
> Rouse_ ©   (20.05.09 13:19) [37]

О чем вы??? Тут мы "Капшен окна" читаем пока...



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

Текущий архив: 2009.07.12;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.01 c
2-1242895540
kyn66
2009-05-21 12:45
2009.07.12
Ошибка в SQL-запросе


15-1241778394
PROgrammist
2009-05-08 14:26
2009.07.12
Ошибка при запуске Delphi.


15-1242244143
T&amp;F
2009-05-13 23:49
2009.07.12
Intel оштрафовали на миллиард евро o_O


15-1242038575
Синий
2009-05-11 14:42
2009.07.12
Игра Быки и Коровы на С++


15-1242145925
voldemar
2009-05-12 20:32
2009.07.12
Компиляция программы из Delphi 2009 под win98