如何在Delphi EXE中隐藏或隐藏字符串?
我正在Delphi开发一个应用程序,其中我必须隐藏(模糊)一个字符串的源代码,如str:=’Example String’.
为什么因为如果我在文本编辑器中打开EXE并搜索Example String,我将在第二个…中找到该字符串 我尝试使用一个基本的HEX转录,如#$65#$78#$61#$6d#$70#$6c#$65,但在编译时它被重新转录. 有人会把我放在正确的方式. 解决方法
一个非常简单的方法是存储由
ROT13方法混淆的字符串.
procedure ROT13(var Str: string); const OrdBigA = Ord('A'); OrdBigZ = Ord('Z'); OrdSmlA = Ord('a'); OrdSmlZ = Ord('z'); var i,o: integer; begin for i := 1 to length(Str) do begin o := Ord(Str[i]); if InRange(o,OrdBigA,OrdBigZ) then Str[i] := Chr(OrdBigA + (o - OrdBigA + 13) mod 26) else if InRange(o,OrdSmlA,OrdSmlZ) then Str[i] := Chr(OrdSmlA + (o - OrdSmlA + 13) mod 26); end; end; function ROT13fun(const Str: string): string; begin result := Str; ROT13(result); end; const ObfuscatedString = 'Guvf vf n frperg zrffntr.'; procedure TForm4.FormCreate(Sender: TObject); begin ShowMessage(ROT13fun(ObfuscatedString)); end; 稍微更复杂的是使用凯撒密码或维根埃尔密码. 要获得在源代码中使用的混淆字符串,您可以使用像我自己的Rejbrand Text Editor或Wolfram|Alpha一样的体面的文本编辑器. 更新 ROT13是非常容易破译,但它可能是足够你的情况,取决于它的外观!至少在二进制文件中识别字符串将变得非常困难.获取字符串将需要一些真正的努力. (毕竟,日常用户甚至没有看到十六进制编辑器/文本编辑器中的二进制文件!)凯撒密码是ROT13密码的非常简单的泛化,也很容易解密.的确,只有25个不同的“密码”. Vigenère密码是非常棘手的,并且需要一些非常严肃的努力来破解(特别是因为你不知道字符串中的二进制的精确位置). 例如,下面我给出一个使用Vigenèrecihper进行混淆的字符串:
当然可以扩展密码也可以处理数字和特殊字符,包括空格.也可以混合首都和小写字母.那么这是非常困难的(虽然可能)来破译.如果口令是一个已知的单词,这可以在字典中找到,这可能会更容易解读.如果不是一个字,就会更安全. 上面的文字使用您可以在足够大的字典中找到的单词进行混淆.下面的文本使用无意义的字符串作为密码进行模糊处理:
最后,下面的文本是以相同的方式进行混淆,但是 – 除了字符串中已经删除了所有的空格和特殊字符外:
我挑战你来解读这三个文本.如果任何人成功解密最后一个,我保证给这个人100瑞典克朗(100瑞典克朗)! 但是,还有,Warren P是对的:如果你真的需要高安全性,即使是专家也不能破译,那么你应该去进行一些真正的加密. 更新 根据Warren P的要求,我使用以下代码来加密/解密Vigenère: const OrdBigA = Ord('A'); OrdBigZ = Ord('Z'); OrdSmlA = Ord('a'); OrdSmlZ = Ord('z'); function imod(const x: integer; const y: integer): integer; begin if x >= 0 then imod := x - floor(x/y) * y else imod := x + ceil(-x/y) * y; end; procedure Vigenère(var Str: string; const Key: string); var n,i,o: integer; KeyChrs: TBytes; begin n := length(Key); SetLength(KeyChrs,n); for i := 1 to n do if InRange(ord(Key[i]),OrdBigZ) then KeyChrs[i - 1] := Ord(Key[i]) - OrdBigA else raise Exception.Create('Invalid character in Vigenère key.'); for i := 1 to length(Str) do begin o := Ord(Str[i]); if InRange(o,OrdBigZ) then Str[i] := Chr(OrdBigA + imod((o - OrdBigA + KeyChrs[(i-1) mod n]),26)) else if InRange(o,OrdSmlZ) then Str[i] := Chr(OrdSmlA + imod((o - OrdSmlA + KeyChrs[(i-1) mod n]),26)); end; end; function Vigenèref(const Str: string; const Key: string): string; begin result := Str; Vigenère(result,Key); end; procedure VigenèreD(var Str: string; const Key: string); var n,OrdBigZ) then Str[i] := Chr(OrdBigA + imod((o - OrdBigA - KeyChrs[(i-1) mod n]),OrdSmlZ) then Str[i] := Chr(OrdSmlA + imod((o - OrdSmlA - KeyChrs[(i-1) mod n]),26)); end; end; function VigenèreDf(const Str: string; const Key: string): string; begin result := Str; VigenèreD(result,Key); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |