Page 1 of 1

Все ли функции нужно шифровать

Posted: Sat Sep 05, 2015 9:14 am
by vasliy
Добрый день!
В своем ПО реализую слегка нестандартный алгоритм RSA.

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

Вопрос следующий:
Ошибаюсь я или нет? :) И как лучше поступать в таких случаях? Делать копии функ-и специально для защиты, например, Crpt_EncodeBase64, Crpt_DecodeBase64, Crpt_SHA1... и на них вешать защиту?

Re: Все ли функции нужно шифровать

Posted: Wed Sep 09, 2015 11:29 am
by Admin
Если вы работаете с RSA, то в первую очередь нужно защитить ваш открытый ключ и всю работу с ним. Дальше переходите на функции, которые возвращают признак зарегистрированности и дальше на функции, использующие этот признак.

Re: Все ли функции нужно шифровать

Posted: Wed Sep 09, 2015 1:09 pm
by vasliy
В общем случае понятно, но в силу моей параноидальности :) меня интересует следующее:

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;
Если мы накроем Ультра защитой функции OpenPublicKey и DecodeBase64, то защита все равно будет дырявая.
Примерный алгоритм взлома будет такой:
1. ищем по сигнатуре функцию TCustomMemoryStream.Read. Вычисляем ее адрес.
2. Ставим бряк на адрес, дампим память по указателям и собираем ключик.
Вывод: при реализации защитных механизмов не использовать библиотечные функции и классы, а писать свои и их накрывать мутацией и т.п.
Правильно?

Re: Все ли функции нужно шифровать

Posted: Wed Sep 09, 2015 1:36 pm
by Admin
До TCustomMemoryStream даже дело не дойдет. У вас пропатчат OURKEY, который будет виден в виде строки в самом ехе-нике.

P.S. Для работы с открытым ключем мы писали отдельный класс, который хранит ключ в памяти в зашированном виде и достается для RSA данные кусочками. Это все дело работает под виртуализацией.

Re: Все ли функции нужно шифровать

Posted: Wed Sep 09, 2015 3:06 pm
by vasliy
Вот и я нечто подобное делаю (Реализую более длинный лицензионный ключ с длиной полей более 255). ourkey, естественно, для примера без защиты)
Спасибо за ответы.