В общем случае понятно, но в силу моей параноидальности

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