Добрый день!
В своем ПО реализую слегка нестандартный алгоритм RSA.
Полученный ключ кодируется в base64 функцией из стандартной библиотеки (при проверке, соответственно, декодируется).
Если я не ошибаюсь, это потенциальная дыра, т.к. можно навесить бряк, и прочитать память.
Вопрос следующий:
Ошибаюсь я или нет? И как лучше поступать в таких случаях? Делать копии функ-и специально для защиты, например, Crpt_EncodeBase64, Crpt_DecodeBase64, Crpt_SHA1... и на них вешать защиту?
Все ли функции нужно шифровать
Re: Все ли функции нужно шифровать
Если вы работаете с RSA, то в первую очередь нужно защитить ваш открытый ключ и всю работу с ним. Дальше переходите на функции, которые возвращают признак зарегистрированности и дальше на функции, использующие этот признак.
Re: Все ли функции нужно шифровать
В общем случае понятно, но в силу моей параноидальности меня интересует следующее:
Если мы накроем Ультра защитой функции OpenPublicKey и DecodeBase64, то защита все равно будет дырявая.
Примерный алгоритм взлома будет такой:
1. ищем по сигнатуре функцию TCustomMemoryStream.Read. Вычисляем ее адрес.
2. Ставим бряк на адрес, дампим память по указателям и собираем ключик.
Вывод: при реализации защитных механизмов не использовать библиотечные функции и классы, а писать свои и их накрывать мутацией и т.п.
Правильно?
Code: Select all
const
OURKEY = "AAE70sUQID3ZS7UcBmr9MDdWs0Ej4RNZaJZHOJoERscAb1ldXodaeUa....";
procedure TMyKey.LoadFromStream(AStream: TmemoryStream);
begin
...
AStream.Read(self.fmodulus.memory^,modlen);
AStream.Read(self.fexp.memory^,explen);
...
end;
procedure OpenPublicKey;
var
MyPublicKey:TMyKey;
begin
...
KeyStrStream:=TStringStream.Create(OURKEY );
DecodeBase64(KeyStrStream,RawStream);
MyPublicKey.LoadFromStream(RawStream);
...
end;
Примерный алгоритм взлома будет такой:
1. ищем по сигнатуре функцию TCustomMemoryStream.Read. Вычисляем ее адрес.
2. Ставим бряк на адрес, дампим память по указателям и собираем ключик.
Вывод: при реализации защитных механизмов не использовать библиотечные функции и классы, а писать свои и их накрывать мутацией и т.п.
Правильно?
Re: Все ли функции нужно шифровать
До TCustomMemoryStream даже дело не дойдет. У вас пропатчат OURKEY, который будет виден в виде строки в самом ехе-нике.
P.S. Для работы с открытым ключем мы писали отдельный класс, который хранит ключ в памяти в зашированном виде и достается для RSA данные кусочками. Это все дело работает под виртуализацией.
P.S. Для работы с открытым ключем мы писали отдельный класс, который хранит ключ в памяти в зашированном виде и достается для RSA данные кусочками. Это все дело работает под виртуализацией.
Re: Все ли функции нужно шифровать
Вот и я нечто подобное делаю (Реализую более длинный лицензионный ключ с длиной полей более 255). ourkey, естественно, для примера без защиты)
Спасибо за ответы.
Спасибо за ответы.