如果我需要用户输入密码来打开 Delphi 生成的 exe,我使用这样的代码,但不是这样的简单密码:
if password='1234' then begin
form2.show
end;
不,这几乎肯定会以明文形式存储在可执行文件中。
事实上,由于检查是在本地完成的,再多的努力也无法保证可执行文件的安全——攻击者只需编辑可执行文件以修改条件跳转,您的测试就会被绕过。通常保护这些东西的方法是将这种权力从攻击者手中移开。例如,将用户输入的密码发送到您控制的中央服务器,并在那里完成检查,只有在检查成功时才发回需要的东西(并且不能被替换服务器伪造)。
但是,这可能是很多不必要的努力。如果您想要做的只是将随意的破解者拒之门外,那么您可能只需稍加混淆即可做到这一点,例如使用关键字对密码进行异或运算,这样在可执行文件中就不会那么明显了。对用户输入的密码做同样的事情,然后比较它们,意味着明文密码将不可见。
像这样的计划不会阻止一个坚定的饼干,但它会让绝大多数人更难。安全(IT、家庭或任何其他类型)的概念并不总是让人无法被打败,只是让它变得足够难以至于不值得。
这真的取决于你想打败谁——这将决定你的计划应该有多复杂。
或者,您可能需要考虑 hvd 在评论中提出的选项。让可执行文件只是一个存根,它具有实际的可执行文件作为加密数据。这将使用用户输入的密钥解密并写入文件系统,检查有效性,然后运行。
因为密码不在存根内,所以不容易受到攻击。密码只存在于创建者(在制作存根时使用)和用户(希望只存在于他们的脑海中)。仅获得存根的人没有简单的方法来运行加密的可执行文件。
同样,有一些方法可以解决这个问题,但它们都涉及在没有可执行文件的情况下获取密码(暴力破解、社会工程等)。
只是为了演示它是多么不安全,请考虑这个小型控制台应用程序:
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,但我想任何十六进制编辑器看起来都有些相似:
毕竟不是那么超级秘密。
不,如果有人想要,他们可以对可执行文件进行逆向工程并获取密码。