我正在评估试验保护系统的许多可能性,并提出了以下问题:
如果我多次使用我的“试验检查”类(在应用程序上分散了几次),它只会被编译一次到exe中吗?
我之所以要问的是,如果它只编译一次到exe中,那么修补这个单独的类将使使用它的所有地方无效。
如果它只编译一次,是否有任何可行的替代方法来阻止这种情况?
谢谢!
编辑:我实际上并没有尝试推出自己的保护系统,我正在研究一些现有的解决方案,如OnGuard,mxProtector和TRegWare。在查看各种解决方案的源代码时,我提出了这个问题。答案 0 :(得分:13)
是的,即使你在不同的地方创建了几个类的实例,也只有一个方法的副本(实现),所以如果黑客修补了这个类,那么所有实例都将被修补。
你真的想要推出自己的保护系统吗?想出好的系统是不容易的,并且有几个随时可以使用的解决方案,如果你在预算上,那么也许TurboPower OnGuard(现在是开源的)就可以了。
顺便说一下,一般的智慧是,如果他们想要破解你的应用程序,无论如何都会这样做,所以不应该在保护方案上浪费太多资源。唯一万无一失的方法是从试用版中排除一些(关键)功能,即{$IFDEF trial_version}
ShowMessage('Sorry, this function is not available in trial version');
{$ELSE}
// do the thing
{$END}
但当然,如果完整版本变得疯狂,那么它将被破解......
答案 1 :(得分:4)
如果您在可能的情况下使用inline keyword函数和方法,则可执行代码将是“多重复制的”。但是,使用内联有一些限制(参见链接文档)。
我同意Ain和Marco的观点,在保护计划上花费精力可能比利益更加麻烦,使用现有解决方案比使用自己的解决方案更有意义。
答案 2 :(得分:3)
是。标准的解决方法是将代码放在.inc中,并将其包含在多个单元中。
但是在安全设置中这没什么意义。因为如果某人学会了搜索模式,他可以简单地重复搜索以找到其他事件,最多只是一个小麻烦。
这就是为什么DIY保护往往是浪费时间的原因之一,我完全赞同艾因。 (无论是onguard还是事实,如果功能在exe中,它迟早会解锁,给予足够的动力)
答案 3 :(得分:3)
仅为原则:实际上有可能多次编译“相同”类。如果您使用泛型类型声明该类,并且稍后具有多个具有不同实例类型的实例,则会为每种类型编译类代码。泛型类甚至不必使用泛型类型。如果将通用实例分布在不同的单元上,代码也将被分开。
type
TDummy<T> = class
public
procedure Dummy1;
end;
procedure TDummy<T>.Dummy1;
begin
...
end;
var
FDummy1: TDummy<Integer>;
FDummy2: TDummy<Byte>;
FDummy3: TDummy<TButton>;
FDummy4: TDummy<TLabel>;