⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 加密算法模块delphi源码
💻 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 + -