📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Registry,StrUtils;
type
TKenFrm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
KenFrm: TKenFrm;
function KED(Str, Key: String): Pchar;stdcall;external 'Ken.dll'; //des加密函数
function KDD(StrHex,Key:String): Pchar;stdcall;external 'Ken.dll'; //DES解密函数
function D3DesEn(EnStr:String;Key1:String;Key2:String;Key3:String):Pchar;Stdcall;External 'Ken.dll';//3des加密函数
function D3DesDe(DeStr:String;DKey1:String;DKey2:String;DKey3:String):PChar;Stdcall;external 'Ken.dll';//3DES解密函数
function IsSoftIce95Loaded:boolean;stdcall;external 'Ken.dll';//检测WIndows98下SoftICE的函数
function IsSoftIceNTLoaded:boolean;stdcall;external 'Ken.dll';// 检测WIndowsNT下SoftICE的函数
function IsTRWLoaded:boolean;stdcall;external 'Ken.dll';//检测娃娃修改的TRW的函数
function IsTRW2000Loaded:boolean;stdcall;external 'Ken.dll';//检测TRW的函数
function IsRegMONLoaded:boolean;stdcall;external 'Ken.dll';//检测RegMon的函数
function IsFileMONLoaded:boolean;stdcall;external 'Ken.dll';//检测FILEMONE的函数
function IsBW2000Loaded:boolean;stdcall;external 'Ken.dll';//检测冲击波2000的函数
function Anti_Self(a:Integer;b:String):Boolean;Stdcall;external 'Ken.dll';//自校验函数
function GetHDID:Pchar;Stdcall;external 'Ken.dll';//系列号
function FileCRC32(FileStr:String):Pchar;stdcall;external 'Ken.dll';
//获取硬盘的出厂系列号,如果需要源码可以到我的站点上下载。
function GetHD:PChar;stdcall;external 'Ken.dll';//硬盘的出厂系列号
function KXEN(KeyCode:String):Pchar;Stdcall;External 'Ken.dll'; //得到注册码函数
//此函数未应用以下加密函数进行加密,你在使用的过程可以根据自己的需要有选择的
//选择下列函数进行加密。
//MD
function MD2En(MD2Str:string):Pchar;stdcall;external 'Ken.dll';
function MD4En(MD4Str:string):Pchar;stdcall;external 'Ken.dll';
function MD5En(MD5Str:string):Pchar;stdcall;external 'Ken.dll';
//SHA
function SHA1En(SHA1Str:string):Pchar;stdcall;external 'Ken.dll';
function SHA256En(SHA256Str:string):Pchar;stdcall;external 'Ken.dll';
function SHA384En(SHA384Str:string):Pchar;stdcall;external 'Ken.dll';
function SHA512En(SHA512Str:string):Pchar;stdcall;external 'Ken.dll';
//HAVAL
function HAVAL128En(HAVAL128Str:string):Pchar;stdcall;external 'Ken.dll';
function HAVAL160En(HAVAL160Str:string):Pchar;stdcall;external 'Ken.dll';
function HAVAL192En(HAVAL192Str:string):Pchar;stdcall;external 'Ken.dll';
function HAVAL224En(HAVAL224Str:string):Pchar;stdcall;external 'Ken.dll';
function HAVAL256En(HAVAL256Str:string):Pchar;stdcall;external 'Ken.dll';
//GOST
function GOSTEn(GOSTStr:string):Pchar;stdcall;external 'Ken.dll';
//TIGER
function TIGER128En(TIGER128Str:string):Pchar;stdcall;external 'Ken.dll';
function TIGER160En(TIGER160Str:string):Pchar;stdcall;external 'Ken.dll';
function TIGER192En(TIGER192Str:string):Pchar;stdcall;external 'Ken.dll';
//RIPEMD
function RIPEMD128En(RIPEMD128Str:string):Pchar;stdcall;external 'Ken.dll';
function RIPEMD160En(RIPEMD160Str:string):Pchar;stdcall;external 'Ken.dll';
//CRC
function CRC32En(CRC32Str:string):Pchar;stdcall;external 'Ken.dll';
function CRC32BEn(CRC32BStr:string):Pchar;stdcall;external 'Ken.dll';
function ADLER32En(ADLER32Str:string):Pchar;stdcall;external 'Ken.dll';
implementation
uses about;
{$R *.dfm}
Function ShlStr(Str1:String):String; //进行明码变换;
var
a:LongWord;
Int1,Int2:Integer;
j,j1:Integer;
sum:LongWord;
begin
Int2:=Length(Str1);
for j1:=1 to Int2 do
begin
a:=ord(Str1[j1]) shl 7;
sum:=sum+a;
end;
Result:=IntToStr(sum);
end;
//NT/2000/XP下关闭计算机函数
function WinExit(flags: integer): boolean;stdcall;//关闭计算机函数;
function SetPrivilege(privilegeName: string; enable: boolean): boolean;
var tpPrev,
tp : TTokenPrivileges;
token : THandle;
dwRetLen : DWord;
begin
result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token);
tp.PrivilegeCount := 1;
if LookupPrivilegeValue(nil, pchar(privilegeName), tp.Privileges[0].LUID) then
begin
if enable then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
end;
CloseHandle(token);
end;
begin
if SetPrivilege('SeShutdownPrivilege', true) then begin
ExitWindowsEx(flags, 0);
SetPrivilege('SeShutdownPrivilege', False)
end;
end;
{--------------------------------------------------------}
{ Anti-Debug }
{ 作者:ksaiy }
{--------------------------------------------------------}
Procedure Anti_DeDe();//检测DEDE反编译器;
var
DeDeHandle:THandle;
i:integer;
begin
DeDeHandle:=FindWindow(nil,chr($64)+chr($65)+chr($64)+chr($65));
if DeDeHandle<>0 then
begin
For i:=1 to 4500 do
SendMessage(DeDeHandle,WM_CLOSE,0,0);
end;
end;
//2004年8月12日更新算法库,增加20种算法调用方法。
//在这里作者只是给出了调用方法,具体的实现很简单。
//比如MD2En(MD2Str:String):Pchar;函数MD2Str是要加密的字符串,其它的相似。
//方法如下:ShowMessage(MD2En('abc')); 这里的意思就是要对'abc'这三字符加密。
procedure TKenFrm.FormCreate(Sender: TObject);
var
Reg:TRegistry;
RInt,SizeInt:Integer;
FileStr,UNStr,SNStr,RStr1,RStr2:String;
SumInt:Integer;
Str:String;
DllCrcStr,DllStr:String;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
DllCrCStr:='E8A316E366BC9B7C'; //这个是加过壳的dll的CRC校验值,进行了Des加密.
DllStr:=ExtractFilePath(Application.ExeName)+'\Ken.dll';
if ShlStr(FileCrc32(DllStr))<>ShlStr(KDD(DllCrCStr,'wwwksaiycom')) then//校验dll失败后关闭计算机.
// WinExit(EWX_SHUTDOWN or EWX_POWEROFF);//关机函数;调试的时候把这行注释掉,发布的时候激活此行。
ShowMessage('校验失败!');
{
在程序目录下提供了两个DLL文件,由于DLL进行了加壳那么在调试的时候就会出现问题,故提供一个加过壳的DLL和一个未
加过壳的DLL,怎么区分这两个DLL呢?文件大的那个是加过壳的,文件小的那个是未加过克的,调试的时候用文件小的那个DLL,
也就是把DLL名字改为Ken.dll,分布您的软件的时候请把大的那个DLL的名字改为Ken.dll一起随程序发布。
在上面对Ken.dll进行CRC校验,也就是说如果加壳的DLL被脱壳或替换,那么进行CRC校验不正确,这样就可以进行你要自己的
操作了,比如关闭计算机。
在这里我仅对DLL进行了校验,还没有对程序本上校验,不过方法是一样的,下面给出方法:
首先把自己的软件调试好以后,用FileCrc32取得主程序的CRC校验值,在对这个校验值进行加密,然后把密加结果存放到一个文
件里(这里我是举例说明,你也可以把它写到可执行文件里去,源码可以到我们的站点上下载),那么在文件的create事件里用
FileCrc32取得当前文件的CRC值,再把您存放在文件里的CRC值取出来解密后进行比较,如果正确那么就执行文件,如果不正确
就执行你自己的操作,比如关闭计算机。
这里我只是提供了方法,详细的模块我在我们的站点上有,但那是会员模块。您可以考虑成为我们的会员。具体可以参看我们的
网站上相关资料。
我们的网站:http://www.ksaiy.com
专业加密论坛:http://www.ksaiy.com/bbs
技术支持QQ:40188696 UC:934155
作者:ksaiy
}
Anti_DeDe();//检测DeDe;
SumInt:=0;
Edit2.Text:=GetHDID;//取得系列号,每台计算机的系列号是唯一的;
//Anti-Debug;
if IsSoftIce95Loaded or IsSoftIceNTLoaded or IsTRWLoaded or IsTRWLoaded or IsTRW2000Loaded or IsRegMONLoaded or IsFileMONLoaded or IsBW2000Loaded then
begin
PostMessage(Application.Handle,WM_CLOSE,0,0);//这里是指当发现调试工具的时候关闭程序本身,也可以设置为关闭计算机;
end;
//程序自校验;
// RInt:=160000;//加壳后的文件大小,壳在压缩包里提供了FSG壳,这个文件的大小你可以加壳后来进行修改,然后在编译的你的软件再加壳就可以发布了;
//加壳方法:先打开FSG,然后选择你要加壳的文件即可。
// FileStr:=ExpandFileName(ExtractFilePath(Application.ExeName)+'\Ken.exe');//这里写上自己的注册文件名;
// if Anti_Self(Rint,FileStr)=True then
// PostMessage(Application.Handle,WM_CLOSE,0,0);
if reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
begin
RStr1:=Reg.ReadString('UN');
RStr2:=Reg.ReadString('SN');
end;
reg.CloseKey;
if (RStr1<>'') and (RStr2<>'') then
begin
UNStr:=KDD(RStr1,'shihongchun');
SNStr:=KDD(RStr2,'shihongchun');
if ShlStr(SNStr)=ShlStr(RightStr(KXEN(Edit2.Text),20)) then //进行非明码比较;
begin
//下面是注册成功你要做的事情,但千万不要出现"注册成功字样",你可以把某些功能给出来。
Label1.Enabled:=False;
Edit1.Enabled:=False;
Button1.Enabled:=False;
end
else
begin//对软件进行次数限制;
if Reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
Str:=Reg.ReadString('KENC');
Reg.CloseKey;
if Str='' then//判断次数是否为空,如果为空那么写入1;
begin
if Reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
Reg.WriteString('KENC','1919F0CF019DBB3E'); //1919F0CF019DBB3E是经过加密后的字符串,原值为1;
Reg.CloseKey;
end
else
begin
SumInt:=StrToInt(KDD(Str,'shihongchun')); //读取次数
SumInt:=SumInt+StrToInt(KDD('1919F0CF019DBB3E','shihongchun'));//对次数进行相加;
if SumInt>StrToInt(KDD('728DA73436100E6C','shihongchun')) then //判断次数是否等于30次;
begin//下面可以设置次数到期限制一些功能;
MessageBox(KENFrm.Handle,'您好!软件的使用次数已到,请注册正式版!','注册提示',MB_OK+MB_ICONINFORMATION);
end
else
begin//如果次数不到期,那么继续对次数的植进行相加;
if Reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
Reg.WriteString('KENC',KED(IntToStr(SumInt),'shihongchun'));
Reg.CloseKey;
end;
end;
end;
end
else
begin
if Reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
Str:=Reg.ReadString('KENC');
Reg.CloseKey;
if Str='' then
begin
if Reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
Reg.WriteString('KENC','1919F0CF019DBB3E');
Reg.CloseKey;
end
else
begin
SumInt:=StrToInt(KDD(Str,'shihongchun'));
SumInt:=SumInt+StrToInt(KDD('1919F0CF019DBB3E','shihongchun'));
if SumInt>StrToInt(KDD('728DA73436100E6C','shihongchun')) then
begin
MessageBox(KENFrm.Handle,'您好!软件的使用次数已到,请注册正式版!','注册提示',MB_OK+MB_ICONINFORMATION);
end
else
begin
if Reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
Reg.WriteString('KENC',KED(IntToStr(SumInt),'shihongchun'));
Reg.CloseKey;
end;
end;
end;
end;
procedure TKenFrm.Button1Click(Sender: TObject);
var
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if Edit1.Text='' then
MessageBox(KENFrm.handle,'用户名不能为空,请填写完整!','注册提示',MB_OK+MB_ICONINFORMATION)
else
begin
if Edit3.Text<>'' then
begin
if reg.OpenKey('\SoftWare\Microsoft\KEN',True) then
begin
reg.WriteString('UN',KED(Edit1.Text,'shihongchun'));
reg.WriteString('SN',KED(Edit3.Text,'shihongchun'));
end;
reg.CloseKey;
MessageBox(KENFrm.handle,'请重新启动程序来进行注册码校验!','注册提示',MB_OK+MB_ICONINFORMATION);
end
else
MessageBox(KENFrm.handle,'注册码不能为空,请填写完整!','注册提示',MB_OK+MB_ICONINFORMATION)
end;
end;
procedure TKenFrm.Button3Click(Sender: TObject);
begin
Application.CreateForm(TAboutFrm, AboutFrm);
AboutFrm.ShowModal;
end;
procedure TKenFrm.Button2Click(Sender: TObject);
begin
Close;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -