5

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

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

3 回答 3

10

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

事实上,由于检查是在本地完成的,再多的努力也无法保证可执行文件的安全——攻击者只需编辑可执行文件以修改条件跳转,您的测试就会被绕过。通常保护这些东西的方法是将这种权力从攻击者手中移开。例如,将用户输入的密码发送到您控制的中央服务器,并在那里完成检查,只有在检查成功时才发回需要的东西(并且不能被替换服务器伪造)。

但是,这可能是很多不必要的努力。如果您想要做的只是将随意的破解者拒之门外,那么您可能只需稍加混淆即可做到这一点,例如使用关键字对密码进行异或运算,这样在可执行文件中就不会那么明显了。对用户输入的密码做同样的事情,然后比较它们,意味着明文密码将不可见。

像这样的计划不会阻止一个坚定的饼干,但它会让绝大多数人更难。安全(IT、家庭或任何其他类型)的概念并不总是让人无法被打败,只是让它变得足够难以至于不值得。

这真的取决于你想打败谁——这将决定你的计划应该有多复杂。

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

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

同样,有一些方法可以解决这个问题,但它们都涉及在没有可执行文件的情况下获取密码(暴力破解、社会工程等)。

于 2012-12-27T22:17:34.613 回答
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,但我想任何十六进制编辑器看起来都有些相似:

在此处输入图像描述

毕竟不是那么超级秘密。

于 2012-12-27T22:55:39.190 回答
3

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

于 2012-12-27T22:17:00.837 回答