为什么因为如果我在文本编辑器中打开EXE并搜索Example String,我将在第二个…中找到该字符串
我尝试使用一个基本的HEX转录,如#$65#$78#$61#$6d#$70#$6c#$65,但在编译时它被重新转录.
我寻找封隔器,但它不是最好的解决方案(PECompact可以被检测为一个假阳性恶意软件,UPX太容易de-UPX,…).我更喜欢在我的内部代码中的想法…
有人会把我放在正确的方式.
解决方法
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进行混淆的字符串:
Xlc tsrgcdk sj ‘vrivem’ mw cei sd kli acirivqhfriw cw qsbsir tfmjmgw,rrh biimrk hyi pygk gilhlvc mf ws,wk leq rpws pvgsqc fj agrvwtvcou mrrsiiwx we izcfp-hew cmji,rpxlmixl ml r piqg xigfbzgep zrrkyyuv. Mlrvih,hyi qmrvvr qctmixw vbtpmwkw ilsikc qclvgiq ks wsqy er soxirr klex hyi ilhzvi cbmmvslavrx mt xli Srvxl wj irboekivcr. Mr hymw qstxmsl,ai uwcp mljvwxmeoki xfs tlcqwtep zojmw mt xli seivkw tsrgcdk.
当然可以扩展密码也可以处理数字和特殊字符,包括空格.也可以混合首都和小写字母.那么这是非常困难的(虽然可能)来破译.如果口令是一个已知的单词,这可以在字典中找到,这可能会更容易解读.如果不是一个字,就会更安全.
上面的文字使用您可以在足够大的字典中找到的单词进行混淆.下面的文本使用无意义的字符串作为密码进行模糊处理:
Miwzvjfy m vjsy-tomBox zguol ap ahqovz d uwk sbze w conz pe biusvth pagh h njsx. Io puvyeq,fl cjsx xic vmovdq zappzjvz,vnjnatl frcb vy dtmd vhxkt fto babtf davf. Uuxlhqb,khk aa dbn eumsuzq,auk SAEd vlpnbuuo ywlemz ue pnyl ttmxv. Pa ghof,fl cjsx kmbbzk atmd wv sfjtmxcl rtfysk cb yuta md jsy. Sqf nql njsx ly vs ilusrn o gok uxwupagupaz u.
最后,下面的文本是以相同的方式进行混淆,但是 – 除了字符串中已经删除了所有的空格和特殊字符外:
cishkclruervutzgnyarkgzjsaqgsrzvmmrzweolpcnvbkxrvdnqrlurhpmhfaxsuoqncxgzqegnqmngaryfbgozpcgrkgzrrybybmouyzbbkoucbnrnsxkmcbywpllxhkoobmzoydrfvrkhpvsavmzocwjflouboymlotjcnqrirgucdrftllladcwtmnkqehjpmnafoobyvkvdaancbzeokdnsotkkawvanjkryculluyaoklpnojfnqrlatypznpalzocjunuxzdbnzntpqulplekxhrshpttjqyculkkjyxhxgxdozruwlbtkyrsuumkgslbyunabbkryfupvnafobhuoyyvqjlzgzpomc
我挑战你来解读这三个文本.如果任何人成功解密最后一个,我保证给这个人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;