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

Issues related to VMProtect
Post Reply
vasliy
Posts: 3
Joined: Sat Sep 05, 2015 8:26 am

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

Post by vasliy »

Добрый день!
В своем ПО реализую слегка нестандартный алгоритм RSA.

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

Вопрос следующий:
Ошибаюсь я или нет? :) И как лучше поступать в таких случаях? Делать копии функ-и специально для защиты, например, Crpt_EncodeBase64, Crpt_DecodeBase64, Crpt_SHA1... и на них вешать защиту?
Admin
Site Admin
Posts: 2585
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

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

Post by Admin »

Если вы работаете с RSA, то в первую очередь нужно защитить ваш открытый ключ и всю работу с ним. Дальше переходите на функции, которые возвращают признак зарегистрированности и дальше на функции, использующие этот признак.
vasliy
Posts: 3
Joined: Sat Sep 05, 2015 8:26 am

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

Post 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. Ставим бряк на адрес, дампим память по указателям и собираем ключик.
Вывод: при реализации защитных механизмов не использовать библиотечные функции и классы, а писать свои и их накрывать мутацией и т.п.
Правильно?
Admin
Site Admin
Posts: 2585
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

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

Post by Admin »

До TCustomMemoryStream даже дело не дойдет. У вас пропатчат OURKEY, который будет виден в виде строки в самом ехе-нике.

P.S. Для работы с открытым ключем мы писали отдельный класс, который хранит ключ в памяти в зашированном виде и достается для RSA данные кусочками. Это все дело работает под виртуализацией.
vasliy
Posts: 3
Joined: Sat Sep 05, 2015 8:26 am

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

Post by vasliy »

Вот и я нечто подобное делаю (Реализую более длинный лицензионный ключ с длиной полей более 255). ourkey, естественно, для примера без защиты)
Спасибо за ответы.
Post Reply