delphi exe的内部密码是否安全?

时间:2012-12-27 22:14:57

标签: security delphi

如果我需要用户输入密码来打开Delphi生成的exe,我使用这样的代码而不是简单的密码:

if password='1234' then begin
   form2.show
end;

3 个答案:

答案 0 :(得分:10)

不,这几乎肯定会在可执行文件中以明文形式存储。

事实上,由于检查是在本地完成的,因此无需任何努力就可以确保可执行文件安全 - 攻击者需要做的就是编辑可执行文件以修改条件跳转,并绕过您的测试。这些东西通常被保护的方式是从攻击者身上移走远离。例如,将用户输入的密码发送到您控制的中央服务器,并在那里进行检查,只有在检查成功时才发回所需的内容(并且不能由替换服务器伪造)

然而,这可能是不必要的努力。如果您要做的就是避开随意的破解程序,您可以通过一些混淆来做到这一点,例如使用密钥短语对密码进行异或,以便在密码短语中没有这么明显。可执行文件。使用用户输入的密码执行相同操作,然后比较这些密码,意味着明文密码将不可见。

这样的计划不会阻止一个坚定的破解者,但它会让绝大多数人更难。安全性(IT,家庭或任何其他类型)的想法并不总是让它失败,只是为了让它变得不那么值得。

这实际上取决于你试图打败 - 这将决定你的计划应该是多么复杂。

或者,您可能需要考虑hvd在评论中提出的选项。让可执行文件只是一个存根,它将实际可执行文件作为加密数据。这将使用用户输入的密钥解密并写入文件系统,检查其有效性,然后运行。

由于密码不在存根本身内,因此不容易受到攻击。密码仅存在于创建者(在制作存根时使用)和用户(希望仅在他们的头脑中)。只获得存根的人没有简单的方法来运行加密的可执行文件。

同样,有办法解决这个问题,但它们都涉及获取密码而不用可执行文件(暴力,社会工程等)。

答案 1 :(得分:10)

只是为了证明它是如何不安全的,考虑一下这个小型控制台应用程序:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

procedure StartProgram;
begin
  writeln('You entered the correct password. Welcome to this awesome program!');
end;

procedure EndProgram;
begin
  writeln('That is not the correct password. Goodbye.');
end;

var
  PW : string;

begin
  write('Enter password: ');
  readln(PW);

  if PW = 'SuperSecretPassword' //See if you can spot this in the image
    then StartProgram
    else EndProgram;

  readln;
end.

编译它,并在十六进制编辑器中打开exe文件。截图来自XVI32,但我想任何十六进制编辑器看起来都有点相似:

enter image description here

毕竟不是那么超级秘密。

答案 2 :(得分:3)

没有。如果有人想要,他们可以对可执行文件进行反向工程并获取密码。