首页
社区
课程
招聘
[旧帖] [求助]问一个关于软件保护的问题!高手帮看看! 0.00雪花
发表于: 2008-4-8 13:09 4203

[旧帖] [求助]问一个关于软件保护的问题!高手帮看看! 0.00雪花

2008-4-8 13:09
4203
我的软件是一个dll,我想进行保护,就是说这个dll是收费的。
我想防用户破解以及分发。按照一般软件即exe,采取保护措施相对好些,网上有好多。
但是dll我不知道怎么办。如果一个用户注册了我的软件,我给他一个许可,他用了我的dl,那他的产品分发势必要带着我的dll,这时如何保证分发后的dll都能进行注册验证呢?

还望大虾们指点指点!先谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
try WinLicense/Armadillo
2008-4-8 13:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
WinLicense安全吗?目前有破解程序吗?
2008-4-8 14:42
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
加密exe的大多也可以加密dll
2008-4-8 15:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
themida winlicense好像网上脱壳的教程很多哦。
2008-4-8 15:07
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
自己在dll里面写注册机制,用VM保护关键地方.

一下摘自VM的说明文档:
调用注册流程
如果您要部署注册方案,永远不要将验证算法放到一个独立的函数中,并且只检查注册码的有效性,返回一个标记作为结果(输入的注册码是否正确)。我们推荐您将注册码验证整合到程序逻辑中,这样注册码验证算法就无法从调用这个验证的流程中分离出来。

大多数软件开发人员采取的方式:

function CheckRegistration(const RegNumber: String): Boolean;
begin
  if RegNumber='123' then
   Result:=True
  else
   Result:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ...
  if not CheckRegistration(RegNumber) then
   exit;
  Application.CreateForm(TForm2, Form2);
  Form2.ShowModal;
  ...
end;
如果用这种方式,破解者根本不需要理解您的注册算法(无论它多么复杂),只需要修改 CheckRegistration 函数,让它永远返回 True 即可。

function CheckRegistration(const RegNumber: String): Boolean;
begin
  Result:=True;
  exit;
  ...
end;
我们推荐您将注册码验证算法混合到您的程序逻辑中(您可以看下面的例子,最终的实施完全依赖于开发人员的想象力):

function CheckRegistration(const RegNumber: String): Boolean;
begin
  if RegNumber='123' then
   begin
    Application.CreateForm(TForm2, Form2);
    Result:=True
   end
  else
    Result:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ...
  Form2:=nil;
  if not CheckRegistration(RegNumber) then
   exit;
  Form2.ShowModal;
  ...
end;
如果您使用这种类似的方案,破解者就必须弄清楚 CheckRegistration 函数是如何工作的,只有这样才能完全理解注册码验证算法。我们推荐您虚拟化这两个流程(使用 VMProtect 的“虚拟”或“超级”模式) - CheckRegistration 和 TForm1.Button1Click.

验证注册密钥
软件开发人员通常会在验证注册密钥犯下错误:

var ValidRegNumber: String;
...
function CheckRegistration(const RegNumber: String): Boolean;
begin
  if RegNumber=ValidRegNumber then
   Result:=True
  else
   Result:=False;
end;
破解者可以通过跟踪这段代码(通过查看字符串比较函数的参数值)很容易就获取正确的密钥值,因此我们推荐您使用密钥 Hash 值来比较:

var
  HashOfValidRegNumber: Longint;
...
// An example of using Peter Weinberger's (PJW) generic hashing algorithm
function HashPJW(const Value: String): Longint;
var I:Integer;
    G:Longint;
begin
  Result:=0;
  for I:=1 to Length(Value) do
   begin
    Result:=(Result shl 4)+Ord(Value[I]);
    G:=Result and $F0000000;
    if G<>0 then
     Result:=(Result xor (G shr 24)) xor G;
   end;
end;

function CheckRegistration(const RegNumber: String): Boolean;
begin
  if HashPJW(RegNumber)=HashOfValidRegNumber then
   Result:=True
  else
   Result:=False;
end;
...
initialization
  HashOfValidRegNumber:=HashPJW(ValidRegNumber);

end.
这种方法的本质是因为 Hash 函数是不可逆的,破解者无法通过 Hash 的校验结果找出正确的密钥。这时破解者将需要花费更多的时间理解您软件的工作流程,而不是仅仅爆破密钥验证。

存储注册验证结果
通常情况下,软件开发人员花费大量的时间在注册流程上,但是却忘记保护注册结果:

var IsRegistered: Boolean;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  ...
  if not IsRegistered then
   IsRegistered:=CheckRegistration(RegNumber);
  if  not IsRegistered then
   exit;
  ...
end;
这样,存储验证结果的全局变量就可以被检查,这个变量可以在软件的其它部分使用。要找到这个全局变量并不困难(只需在注册前和注册后检查两个数据片段是否改变就可以了),例如,著名的 ArtMoney 软件就是这样编写的。我们推荐您在内存中动态存储注册验证结果,而不是静态存储在硬盘里。如果全局变量在动态内存中存储,破解者就没有机会扫描注册前和注册后的数据片段了。使用动态内存存储验证结果的例子如下:

type PBoolean = ^Boolean;

var IsRegistered: PBoolean;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  ...
  if not IsRegistered^ then
   IsRegistered^:=CheckRegistration(RegNumber);
  if  not IsRegistered^ then
   exit;
  ...
end;
...
initialization
  New(IsRegistered);
2008-4-8 15:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多谢!!!!
2008-4-8 16:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
主要的问题是,我把dll发给注册的用户,注册的用户在他的软件里会调用我的dll,并且我的dll还得随他的软件的发布一起发布,我怎么在他发布的软件中验证注册信息呢?
这样别人从他的软件中提取我的dll,因为有他的验证信息,所以就可以用了。如果不采用硬件信息做为验证依据,那他完全可以发布他的注册码给别人用,如果采用硬件信息,如何保证分发的dll验证。
2008-4-8 16:30
0
游客
登录 | 注册 方可回帖
返回
//