黑客能否访问编译后的Delphi VCL应用程序中变量、方法、单元等名称?

6

我正在为一个使用Delphi 7创建的软件设计保护机制,想知道我是否需要担心函数/过程、变量等中使用的名称。在没有任何第三方保护(如混淆)的情况下,黑客能否访问Delphi创建的已编译exe VCL应用程序中使用的这些名称?


1
根据您在可执行文件中包含的调试信息的数量,它们可以或者不能够被使用。您不需要混淆来隐藏这些信息,而是需要翻转正确的编译器开关以添加它。即使如此,您也不会轻易地得到原始代码。这比例如JavaScript更难。再说了,如果他们知道您的变量名称,那又有什么问题呢? - GolezTrol
1
@GolezTrol,感谢您的评论。我将研究一下应用程序中包含的这些调试信息。我不希望黑客追踪软件的保护方案...我知道没有绝对安全的保护措施,只是不想让事情变得容易... - Guybrush
1
我认为这是一种X/Y问题,因为仅仅隐藏函数名称并不能让你觉得你的应用程序有更好的保护。攻击者仍然可以使用反汇编调试器逐步执行代码。 - TLama
3
我没想到许多攻击会基于对姓名的了解。如果保护自己免受恶意行为的影响很重要,那么你真的需要寻求专家的帮助。 - David Heffernan
我有点惊讶,没有人投票关闭这个问题作为重复的 - 我以前在SO上看到许多关于这个问题的问题。我想这是一个搜索和筛选结果的问题... - Jerry Dodge
显示剩余3条评论
2个回答

6

Delphi将其源代码编译为原始二进制文件,与Java或C#/.Net不同,后者会编译为一些中间语言,这些语言很容易被反编译,通常需要混淆。对于Delphi而言,反编译工具非常粗糙而且效果不佳,即使是最复杂的工具

默认情况下,Delphi可执行文件中没有添加调试信息。Delphi 7只有一个有限的RTTI集合 - 它在Delphi 2010中得到了大量增强。人类可读的RTTI信息仅关于枚举文本,类的published属性和继承自IInvokableinterface。因此,提供的信息非常少。

因此,从典型的Delphi 7可执行文件中检索变量名和函数名几乎没有办法。除非将.map文件与可执行文件连接在一起(仅包含函数名和全局变量,不包括局部变量)。

请注意,这是关于源代码的 - 正如您所要求的那样。对于GUI/VCL应用程序,.dfm内容(即TForm布局)被序列化到可执行文件中,并且可以被恢复。

@Guybrush 长话短说,想出聪明的方法。删除调试信息是第一步。然后还有其他概念,比如将加密密钥分成多个片段,定义在不同的位置,并进行多层加密(如果需要)。还有可变加密密钥。也就是依赖于唯一和永久数据的密钥。这背后有整个科学。你最好学习多种加密方式,并强制执行至少3种不同的机制。 - Jerry Dodge
@Guybrush 我甚至使用了专有的字节移位作为保护层级 - 但是仅有一层不足以防止逆向工程。将你的机制分解成完全独立的部分。看似无关联的部分。绑定一些用户无法简单修改的唯一标识符。将其作为你机制的一部分。 - Jerry Dodge
或者从更战略的角度考虑你的应用程序...黑客是否会对破解你的软件感兴趣?也许你不需要过多担心,特别是如果你为注册用户提供了其他好处。但是,再次强调,一切都取决于应用程序和用户群。 - John Kouraklis
@JerryDodge 谢谢您的评论!价格低(~$30),所以我不认为黑客会浪费很多时间来破解保护...无论如何,我已经加密了所有字符串,使用了商业软件来保护exe免受反汇编器、调试器、内存补丁等的攻击,还会定期在在线数据库中验证安装该软件的硬件。这是一个非常复杂的方案(对我来说是这样),如果我需要更改变量名、函数名等,管理代码就会变得更加困难... - Guybrush

0

几乎每个EXE都可以看到导入的函数(例如CreateWindowA()SendMessageA()等)以及它们来自哪些库(例如SHELL32.DLL等)。只需将您的EXE拖到文本编辑器中并搜索.dll - 您就可以看到可读的文本。

通过函数名称链接可以通过链接函数索引来避免;恶意软件采用的一种方法(不让扫描器识别“坏”函数名称)是枚举库的所有导出函数名称,对每个名称进行哈希处理,然后将该哈希与先前哈希的文本进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接