- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
转自: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.加壳啦.唯一注意的选择你看下面的图.
同样如果你发现文章有什么错误,请指教,不要笑我. |
|