手动混淆所需的想法
本文关键字: | 更新日期: 2023-09-27 18:31:36
我想避免我的程序简单地删除许可证验证器部分。
我不想使用商业混淆器,因为:
- 的成本。虽然他们可以比我做得更好 - 他们也不要让它无法破解,只是更难。
- 似乎有时混淆器会导致生成的错误法典。
显然,我将保留一个未混淆的副本以进行维护。
我曾经不得不在客户可以修改的代码中隐藏许可证验证程序。可以想象,如果他们知道在哪里看,他们本可以删除它。以下是我当时使用的一些技巧。
- 提供验证程序类、程序集名称和变量名称,这些名称看起来像它们实际上执行其他操作。
- 从代码的多个部分调用验证程序。
- 将随机发生器添加到验证调用中,以便有时它运行,有时不运行。这将使知道验证码实际来自何处变得更加困难。
我应该补充一点,所有这些都是可以击败的,可能会导致严重的维护头痛,但在我的特定情况下它奏效了。
如果你的意图是让它更难,但并非不可能,一种方法是有多个代码点来检查你的许可证文件是否有效。
假设您有一个带有类似密钥的许可证文件
abc-def-fhi-asdf
所以,四个部分的关键。然后,我们将创建四种不同的方法来检查密钥的各个部分。
通过执行此操作并改变通过代码使用的方法(理想情况下,在运行时随机选择验证方法),可以使删除验证变得更加困难。
最重要的是,一种方法是有一个发布过程来内联您的验证方法,每次调用它时都会巧妙地更改它。
例如像这样:
*user clicks a common function
// [VALIDATION STUB]
*perform user action
新的发布过程贯穿代码,拉出//[验证存根] 并将其替换为您的验证代码(在代码编译之前),正如我所说,每次都应该尽可能多地变化。
从我的回答中得出的主要内容是混淆很难,但并非不可能。 特别是如果你屈服于恶意用户最终总是会打破它的现实
我有一些建议,你可能会觉得有用。
首先,当然,您可以使用免费的混淆器,例如VisualStudio附带的混淆器。总比没有好。
其次,您可以编写许可证验证码,一旦它工作正常,请尽可能多地重构它,将类名、成员变量、局部变量和方法更改为 c1、v1、l1、m1 等。这基本上就是混淆者所做的。
第三,做到以上所有。
第四,用非托管代码(C++、Delphi)编写许可证验证,并将其设置为名为核心.dll、网络等重要内容的 DLL.dll。你也可以把一些诱饵方法放进去,这些方法不会做任何重要的事情。从代码的多个位置对该 DLL 进行多次调用,并假装对这些调用的结果执行了某些操作。