Delphi   发布时间:2022-04-10  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Delphi EXE中隐藏或隐藏字符串?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在Delphi开发一个应用程序,其中我必须隐藏(模糊)一个字符串的源代码,如str:=’Example String’.
为什么因为如果我在文本编辑器中打开EXE并搜索Example String,我将在第二个…中找到该字符串

我尝试使用一个基本的HEX转录,如#$65#$78#$61#$6d#$70#$6c#$65,但在编译时它被重新转录.
我寻找封隔器,但它不是最好的解决方案(PECompact可以被检测为一个假阳性恶意软件,UPX太容易de-UPX,…).我更喜欢在我的内部代码中的想法…

有人会把我放在正确的方式.

解决方法

一个非常简单的方法是存储由 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 EditorWolfram|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;

大佬总结

以上是大佬教程为你收集整理的如何在Delphi EXE中隐藏或隐藏字符串?全部内容,希望文章能够帮你解决如何在Delphi EXE中隐藏或隐藏字符串?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。