- UID
 - 2198
 
 注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主 
    
 
 
 
该用户从未签到  
 | 
 
转自:http://www.unpack.cn/viewthread.php?tid=29538  
作者:xingyuwanwan 
 
 
....前言.... 
可能你发现,Unpack甚至网上,关于sdk的用法,是很少的,甚至没有,你可能遗憾的,这样一个壳的天下,竟然没有sdk教程可学习,缺少sdk,壳的强壮要大大降低. 
我想可能有几个原因, 
1,高手不屑写,或不愿写, 
2.菜鸟不会. 
我亦菜鸟,所以菜鸟一起飞.近期打算写个系列分享给大家. 
-------------------------------------------------------------------- 
起初,我学Asprotect,我不会SDK,我说,我要学,我就开始学习. 
我见Asprotect有带一个Asprotect.chm帮助,我就打开它,看它. 
我又见Asprotect有个Examples例程,我又打开它,照着它,做些测试. 
我发现Asprotect的SDK可以分几类,普通SDK,和注册相关SDK. 
A.先要看普通SDK(这一共有3个.) 
■1.Polymorphic Markers,变形标记,你不要把它用在循环中. 
你可以放置它在程序的任意位置,就象是这样的: 
Procedure Test;    
begin     
{$I Inc\UserPolyBuffer.inc}    
// some code  
end;  
这样,从标记开始,到过程的结束位置之间的代码,将被替换为变形的,这使得解密将变得复杂甚至是不可能的. 
自然,Polymorphic Markers并不一定要放置它在过程/函数的开头,事实上,你可以按照你的需要,被放置它在某个过程或函数的任意地方. 
注意:不要把它使用在循环中. 
■2.Envelope Checks,壳检测,使用它来检查程序的壳是否是完好的. 
它的作用是外壳完整性检查,你看下面的代码: 
program Test; 
 
uses 
  Windows; 
 
Function EnvelopeCheck: Boolean; 
{$I Inc\DelphiEnvelopeCheckFunc.inc} 
 
begin 
  {$I Inc\DelphiEnvelopeCheck.inc} 
  If EnvelopeCheck then  
     MessageBox(0,'我很好,我在壳的保护中!','',0)  
  else 
     MessageBox(0,'你已到此,不可逾越,你狂傲的浪要到此止住.','',0); 
end. 
你可以使用它在程序的任意位置来进行壳的完整性检查,一旦壳被脱掉,那么它是返回一个False值,这时你就适当干一些**的事情,给脱壳作者一些警示. 
你可以马上测试它,编译后运行它,会提示"你已到此,不可逾越...",因为它是无壳的,也相当于,它的壳是已经被脱掉,所以EnvelopeCheck是返回失败,而一旦你加壳以后再次测试它,它将返回真. 
■3.CRC Checks,CRC检查,你不要把它嵌套使用.CRC之内的代码还要保证多于5字节. 
这一功能对抗Loader内存修补是强壮的,它的作用你看名字就知,过多的介绍是无需的,它的用法是相当简单: 
{$I Inc\DelphiCrcBegin.inc}   
 
// some code   
 
{$I Inc\DelphiCrcEnd.inc}   
仅此而已. 
B.再看注册相关SDK. 
Asprotect的界面中,无法对程序加注册功能,我想让我的程序带有注册功能,所以我这样做: 
■1.在工程中,是这样: 
program Project1; 
 
uses 
  Forms,SysUtils,aspr_api, 
  Unit1 in 'Unit1.pas' {Form1}, 
  Unit2 in 'Unit2.pas' {Form2}; //PS:Form2不是自动创建的窗体,你要在工程的选项中设置. 
 
{$R *.res} 
var 
UserName: PChar; 
UserKey: PChar; 
 
begin 
  Application.Initialize; 
 
  GetRegistrationInformation(0,UserKey,UserName); //这个aspr函数是取系统中的注册信息. 
  if (UserKey<>nil) AND (StrLen(UserKey)>0) then  //如果注册信息是存在的--这将表示是已经注册的. 
      begin 
      Application.CreateForm(TForm1, Form1); //那么,创建主窗体. 
      end 
  else //如果注册信息是不存在的,这将表示程序还没有注册. 
      begin 
      Form2:=tForm2.Create(Application); //那么,创建注册窗体. 
      Form2.ShowModal; //显示注册窗体. 
      end; 
  Application.Run; 
end. 
界面是如下: 
   
 
 
 
 
■2.注册窗体的代码是这样: 
unit Unit2; 
 
inte**ce 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, Buttons; 
 
type 
  TForm2 = class(TForm) 
    Label1: TLabel; 
    Edit1: TEdit; 
    Label2: TLabel; 
    Edit2: TEdit; 
    Label3: TLabel; 
    Edit3: TEdit; 
    BitBtn1: TBitBtn; 
    BitBtn2: TBitBtn; 
    procedure BitBtn2Click(Sender: TObject); 
    procedure BitBtn1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
var 
  Form2: TForm2; 
implementation 
uses aspr_api; 
{$R *.dfm} 
procedure TForm2.BitBtn2Click(Sender: TObject); 
begin 
close; 
end; 
 
procedure TForm2.BitBtn1Click(Sender: TObject); 
begin 
If CheckKeyAndDecrypt(PChar(Edit3.Text),PChar(Edit2.Text),True) then //检查你的输入,是不是合法的,如果是合法的,将自动存储它. 
   showmessage('注册信息是合法的,程序会关闭,请你再一次运行!')         
else 
   showmessage('注册信息不是合法的,你要再一次检查!') 
end; 
 
procedure TForm2.FormCreate(Sender: TObject); 
begin 
edit1.Text:=StrPas(GetHardwareID); //这是取机器码的函数,它的使用是简单的. 
end; 
 
end. 
你可以看到一切使用都是简单的. 
 
■3.主窗体的代码,并没有特别,在这里,你可以再学习一个区段加密的标记: 
unit Unit1; 
 
inte**ce 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls; 
 
type 
  TForm1 = class(TForm) 
    Label1: TLabel; 
    Image1: TImage; 
    BitBtn1: TBitBtn; 
    Label2: TLabel; 
    Label3: TLabel; 
    Label4: TLabel; 
    Label5: TLabel; 
    Label6: TLabel; 
    procedure BitBtn1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
uses aspr_api; 
var 
UserName: PChar; 
UserKey: PChar; 
 
{$R *.dfm} 
 
procedure TForm1.BitBtn1Click(Sender: TObject); 
begin 
close; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
GetRegistrationInformation(0,UserKey,UserName); //于当前系统中取注册信息 
if (UserKey<>nil) AND (StrLen(UserKey)>0) then //如果是存在的 
    begin 
    {$I aspr_crypt_begin9.inc} //区段加密标记开始,等级9.(你可以取等级在1--15之间) 
    Label5.Caption:=StrPas(UserName); //显示一下而已. 
    Label6.Caption:=StrPas(UserKey); 
    {$I aspr_crypt_end9.inc} //区段加密标记结束. 
    end; 
end; 
 
end. 
区段加密标记中的代码仅仅解码在已注册的程序,这将表示,如果你的程序是运行在试用状态,那么位于区段加密标记中的代码将保持加密的. 
一切都已经完成了.你可以现在编译它. 
■4.现在要对生成的程序加壳,你打开Asprtoect,我只对你说模式的设置,其他设置是简单的,你自己做. 
先增加一个try模式,"Is This Mode Active?"是的,我想让我的程序不能试用,所以我设置"Expired  executions"是0,我也不想用内建的对话注册框,因为我刚才明明已经自己设计了注册框,所以我选择"Dont use built-in dialogs"是的. 
再增加一个reg模式,"Is This Mode Active?"是的,"Is This Mode in Registered state?"是的,一样的我选择"Dont use built-in dialogs"是的,"Use Activation Keys"是的,我想让注册码绑定到硬件,所以我还选择"Use Hardware Locking"是的,并设置Hardware Locking为"S.M.A.T.infomation",并选择"Support GetHardwareID API"是的,由于还在主窗体中使用的区段加密标记,所以再选择"Unlock Encrypted Sections"是的,并设置"Choose Encrypted Sections"是"Section9",因为我在主窗体中是用的等级9. 
那么一切都完成了,开始保护.保护过后,运行它,它先提示我设计的注册窗体,我在Asprtoect中为它计算了一个注册码,输入注册窗体,一切都象预期的那样很成功. 
 
 
 
 
 
 
 
 
 
 
 
我很希望这个文章没有演示错什么,如果是有,那么你不能笑,你要指正,那样这个文章将来是更完美的 |   
 
 
 
 |