Nisy 发表于 2008-10-26 10:04:42

【SDK完全接触----之EXECryptor篇】

转自:http://www.unpack.cn/viewthread.php?tid=29551
作者:xingyuwanwan


....前言....
可能你发现,Unpack甚至网上,关于sdk的用法,是很少的,甚至没有,你可能遗憾的,这样一个壳的天下,竟然没有sdk教程可学习,缺少sdk,壳的强壮要大大降低.
我想可能有几个原因,
1,高手不屑写,或不愿写,
2.菜鸟不会.
我亦菜鸟,所以菜鸟一起飞.近期打算写个系列教程分享给大家.
--------------------------------------------------------------------
EXECryptor是一个不错的壳,我原来很喜欢使用,不过后来它的注册框出现了那个可以直接关闭的BUG,所以现在使用它的时候,我都是用SDK来实现注册框.
EXECryptor的帮助,条理还是很清晰的,比Asprtoect的要好理解,不过,不知什么原因,对于注册信息的存储和读取,帮助中竟然没有提,无耐之中,我看见了SecureRead和SecureWrite,测试N次后才发现原来是这样用法.只能说,好好另类.本以为它是读写文件来.
我将用一个完整的源码例子来教会你如何使用它的SDK:
好,马上开始.
1.工程
program Project1;

uses
Forms,EXECryptor,SysUtils, //uses相关单元.
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}
var
Name,Key:string; //用来暂存获取的用户名和KEY.
RegInfo:TSerialNumberInfo; //EXECryptor定义的一个结构,可以详细获取KEY的类型,到期日期等.
begin
Application.Initialize;

SecureRead('RegistrationName',Name);//读取当前系统中的注册信息--用户名.
SecureRead('SerialNumber',Key); //读取当前系统中的注册信息--KEY.
VerifySerialNumberEx(name,key,RegInfo,IntToStr(GetHardwareID));
//和机器码一同进行验证.结果存放于RegInfo结构中.同时该函数返回一个TVerifyResult值.
//下面的crypt_reg或crypt_unreg可以根据TVerifyResult来判断程序的运行状态.
{$I crypt_reg.inc} //crypt_reg和crypt_end之间的代码,仅仅在程序注册后才能解码并运行.
Application.CreateForm(TForm1, Form1); //如果是注册的,则创建主窗体.
{$I crypt_end.inc}

{$I crypt_unreg.inc} //这个标志内的代码仅仅在未注册状态运行,如果程序已注册,则会跳过.
Form2:=Tform2.Create(Application); //未注册时,创建注册窗体.
Form2.ShowModal; //显示注册窗体.
{$I crypt_end.inc} //标志结束.
Application.Run;
end.

2.注册窗体
unit Unit2;

inte**ce

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    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 EXECryptor; //uses
{$R *.dfm}

procedure TForm2.BitBtn2Click(Sender: TObject);
begin
close;
end;

procedure TForm2.BitBtn1Click(Sender: TObject);
var RegInfo:TSerialNumberInfo; //定义结构体.
begin
if VerifySerialNumberEx(edit2.Text,edit3.Text,RegInfo,IntToStr(GetHardwareID))=vrOK then
//用户名,KEY及硬件码三者进行验证是否合法,如果合法,返回vrok.即上面说的TVerifyResult.
   begin
   {$I crypt_reg.inc} //仅在注册状态下运行代码.如果上面返回vrOK,那么这时程序是已注册.代码运行.
   SafeMessageBox(0,'注册成功!感谢支持!','提示',0);
//SafeMessageBox用法和MessageBoxA一样用,EXECryptor说这个函数好处在于可以避免被调试器下断点.
   SecureWrite('RegistrationName',edit2.Text); //保存用户名
   SecureWrite('SerialNumber',edit3.Text); //保存KEY.
   {$I crypt_end.inc} //结束标志.
   end
else //如果注册信息不合法.
   begin
   SafeMessageBox(0,'注册码错误!!','提示',0);
   end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
edit1.Text:=IntToStr(GetHardwareID); //取机器码的函数.返回值Dword型.
end;

end.

3.主窗体
unit Unit1;

inte**ce

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
    Label1: TLabel;
    BitBtn1: TBitBtn;
    Label2: TLabel;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Form1: TForm1;

implementation
uses EXECryptor;
{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCreate(Sender: TObject); //窗体载入时.
begin
if (IsAppProtected) then //IsAppProtected壳验证,如果程序已经被加壳保护.
   begin
   label1.Caption:='程序已经注册!';
   label2.Caption:='当你看到这个界面,说明本程序已经注册!';
   end
else //否则程序未加壳.或者已经被人脱壳.此时你也可以干一些不好的事情,比如用一阵大洪水,毁灭硬碟上的所有生命.
   begin
   label1.Caption:='未加壳!';
   label2.Caption:='';
   end
end;

end.
4.另外,EXECryptor还有个代码保护标记,使用是简单的:
{$I crypt_start.inc}
if Registered then
    SaveFile(FileName);
{$I crypt_end.inc}
标记之间的代码将会被变形保护.标记之间,禁止使用try/finally/except.你也不要再丢些crypt_reg之类的在里面,我测试是不允许的.
5.加壳啦.唯一注意的选择你看下面的图.



同样如果你发现文章有什么错误,请指教,不要笑我.

astrisk 发表于 2008-10-27 13:27:35

对SDK完全不懂,不过还是要支持楼主的作品

frozenrain 发表于 2008-10-27 13:32:13

不懂DELPHI是不是应该拿VC来讲/:002 /:001

1328558 发表于 2009-2-16 09:10:16

还是要支持楼主的作品

ybx2008 发表于 2009-3-2 09:34:24

多谢了,研究研究

kkr 发表于 2009-4-23 17:38:21

多谢楼主分享
收下了
页: [1]
查看完整版本: 【SDK完全接触----之EXECryptor篇】