首页 > 新闻系统 > 办公软件 > 文章正文

EncryptPE 程序员的好帮手!

2004-11-30 13:46:21 来源:华军软件园 作者:killertop 点击:



一、功能介绍:

    1. 加密保护常规PE文件(EXE、DLL、OCX等),防静态分析修改,反动态跟踪调试。

    2. 将普通软件变成共享软件,增加定时注册提醒、限制试用日期、限制试用次数、限制试用天数、限制每次试用多长时间等功能。

    3. 根据最终用户的机器信息、注册用户名计算注册码,从诸多加密算法中随机选择一种用于注册码的计算。

    4. 支持多语言,除GB外的其他语言形式的界面元素由“EncryptPE.INI”文件设置,便于增删改,注册窗口界面与语言相关。

    5. 向待加密软件提供方便的编程接口,便于设计个性注册方式,同时使被加密程序与加密壳之间融为一个整体,增加破解难度。

    6. 经加密软件可以运行于多种 Windows 平台,包括 9X/ME/NT/2000/XP。


二、使用说明:

    1. 本软件正常使用需要注册,经未注册版本加密的PE会在运行中不时出现“EncryptPE 未注册”的提示。欲打开注册窗口,请点击“关于”或双击窗口背景。

    2. 本软件要对原 PE 文件进行再造,所以该文件必须可写,不能具有只读属性。

    3. 本软件及经加密的软件运行时要在系统目录下生成一个 DLL 文件,所以要有读写系统目录的权限,另外还必须有读写注册表的权限,因为软件要用注册表来保存注册信息。

    4. 本软件并不能加密处理所有 PE 文件,有的可能在加密过程中就会出现错误提示,而有的可能是在加密处理后不能正常运行,请自行测试,必要时请恢复备份文件(每次加密处理前都会生成一个备份文件,以“原文件全名.BAK”形式存在于所选文件的同一目录)。造成错误的主要原因可能有:① 原 PE 文件含与壳冲突的代码(如某些已加壳 PE);② 原 PE 文件中含额外数据(如某些伪编译或自解压类型的 PE);③ 原 PE 文件具有特殊格式(如采用 .NET 架构的 PE 文件)。

    5. 如需要运行时定时提醒注册功能,须设置“每隔多少分钟要求注册”项为大于 0 的数值;“限制试用日期”设置为“2002-12-31”以后的日期才有效;“限制试用次数”指用户运行加密 PE 的次数,设为大于 0 的数值才有效;限制“试用天数”指从用户第一次运行开始计算的天数,设为大于 0 的数值才有效;“限制每次试用多少分钟”指用户每次正常运行加密 PE 不能超过多少分钟。五种限制可以分别设置,分别起作用(都是弹出注册窗口要求用户注册,除定时弹出外,其他设置均会导致软件在发现限制条件起作用后要求注册,未即时注册则程序退出),用户只有在注册后才能解除这些限制而正常使用。也可以将以上限制均取消,进而利用编程接口实现个性的注册方式或者干脆就是免费软件。

    6. “软件名称”项设置的是注册窗口的标题。

    7. “保护密码”对各种试用限制进行保护,防止他人通过本软件计算出注册码。密码是区分大小写的,不同软件应使用不同的密码进行保护。双击“保护密码”可以改变密码框的显示方式,在明码显示和以星号显示两种方式之间切换。

    8. 注册信息是与机器系统相关的,如果用户硬盘重分区、格式化或者彻底更新系统,可能会导致原注册无效,需重新注册。根据同一机器信息可以随机计算出不同的注册信息,但都只对该机有效。

    9. 被加密的软件的注册窗口的界面语言可以选择“EncryptPE.INI”中定义的任一种,本软件能与自身的壳进行通信动态设置注册窗口的界面与当前所选语言一致(目前只定义三种语言:GB、BIG5、English,可以再扩充,译码不准确的地方也请帮忙改正),待加密软件也可以类似地实现这种多语言版本。EncryptPE.INI文件中的[OPTIONS]节可以进行一些选项设置,具体请看INI文件中的说明。


三、编程接口:

    1. 用 GetModuleFileName 获取待加密 PE 的全路径名,如“C:\TEMP\ABC.EXE”,将其中的“\”转换成“/”,即转换为“C:/TEMP/ABC.EXE”,再用GetCurrentProcessID取得当前进行ID,转换为八位十六进制串,与之前的字符串以“/”合并成类似于“C:/TEMP/ABC.EXE/03AAFCDE”形式的字符串;

    2. 用 OpenFileMapping 打开以以上字串为名称的内存映射对象,并用 MapViewOfFile 得到一指针,该指针指向一 DWORD 型数据为加密壳提供的注册窗口的句柄,将其保存在一变量中,与壳通信就必须用它,然后 UnmapViewOfFile 并且 CloseHandle;

    3. 用 SendMessage 向注册窗口发送 WM_USER 消息,附带不同的 WPARAM、LPARAM参数将实现不同的功能,具体以“功能,WPARAM,LPARAM,可能返回值”格式说明如下:

    ① 主动显示注册窗口,0,0,1 则正常,-1 则出错。

    ② 查询注册信息,0,1,-1 则出错,正常时返回值可以转换为一指针,它指向一个字串,该字串以 #0 结尾,并且中间以 #13#10 分隔成五个字串,第一个是“Y”或“N”,表示是否注册,第二个是机器信息,第三个是注册用户,第四个是注册信息,第五个是软件名称(注册窗口标题),第六个是已运行多少分钟,第七个是每隔多少分钟要求注册,第八个是每次限制运行多少分钟,第九个是第一次使用软件的日期(格式是YYYYMMDD,如20030518,下同),第十个是限制试用日期,第十一个是限制试用天数,第十二个是软件已运行次数,第十三个是限制运行次数。

    ③ 保存注册信息,100,注册信息数据结构所在起始地址,1则表示注册信息正常保存,-1则出错。注册信息数据结构(Delphi 格式):
      type
         PUserRecord = ^TUserRecord;
         TUserRecord = record
           Bz: Byte;
           ValueSize: Integer;
            ValueBuf: Pointer;
           PassSize: Integer;
           PassBuf: Pointer;
              end;
      这里,Bz 使用固定值 $FF,ValueSize 指定注册用户字串的长度,ValueBuf 指明注册用户字串的首字符地址,PassSize 指定注册信息字串的长度,PassBuf 指明注册信息字串首字符的地址,如果为空串,则 Size 应为 0,Buf 应为 nil。

    ④ 设置注册窗口的显示语言,1000,语言数据结构所在起始地址,1 则表示注册窗口界面已更新,-1 则出错。语言数据结构按以下顺序构成:一个字节的字符集(默认 134)、一个字节的字体大小(默认 9)、以 #0 结尾的字体名称(默认为宋体)、分别以 #0 结尾的字符串 4 至 17(默认值请参考 EncyptPE.INI 中的 [ENCRYPTPE_LANGUAGE_GB] 项设置),各字符串如果为空(仅为 #0),则用默认字符串代替。

         设置注册窗口的提示信息,10000,提示信息数据结构所在起始地址,1 则表示注册窗口界面已更新,-1 则出错。提示信息数据结构按以下顺序构成:以#0结尾的十进制形式或以$开头的十六进制形式的颜色值(如果软件过期,则其注册窗口中的注册用户框和注册信息框背景将可能变色)、以#0结尾的提示信息、以#0结尾的网站地址(默认以http://开头)、以#0结尾的电子邮箱地址(默认值请参考 EncyptPE.INI 中的 [OPTIONS] 项设置),各字符串如果为空(仅为 #0),则用默认字符串代替。

    ⑤ 调用加密壳的加解密算法和压缩还原算法,$7FFFFFFF(最大带符号整数),待运算数据结构(同注册信息数据结构)所在起始地址,1 则表示运算已正常进行,结构中 ValueBuf 返回运算后数据起始地址,ValueSize 返回运算后数据块大小,-1 则出错。根据结构中 Bz 值的不同,运算方式不同。

    Bz = 0,调用压缩算法,ValueBuf 指定待压缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 1,调用解压缩算法,ValueBuf 指定待解压缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 10,调用压缩算法并将结果转换成十六进制串格式(如 FF0A10……),ValueBuf 指定待压缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 11,调用十六进制格式压缩串的解压缩算法(先转换再解压),ValueBuf 指定待解压缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 20,调用压缩算法并将结果转换成十进制串格式(三位数代表一个字节,如255010016……),ValueBuf 指定待压缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 21,调用十进制格式压缩串的解压缩算法(先转换再解压),ValueBuf 指定待解压缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 100,调用加密算法,ValueBuf 指定待加密数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 101,调用解密算法,ValueBuf 指定待解密数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 110,调用加密算法并将结果转换成十六进制串格式(如 FF0A10……),ValueBuf 指定待加密数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 111,调用十六进制格式加密串的解密算法(先转换再解密),ValueBuf 指定待解密缩数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 120,调用加密算法并将结果转换成十进制串格式(三位数代表一个字节,如255010016……),ValueBuf 指定待加密数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度;

    Bz = 121,调用十进制格式加密串的解密算法(先转换再解密),ValueBuf 指定待解密数据块的起始地址,ValueSize 指定其大小,PassBuf 指定密码串首字符地址,PassSize 指定其长度。

    以上返回数据必须即时保存和使用,因为返回数据所用的内存空间不久将另作它用。复制内存可使用 CopyMemory 函数。以下ShareUnit.pas是用DELPHI写的一些对接口调用的包装函数:

unit ShareUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls,
  Forms, ExtCtrls, StdCtrls;

type
  PUserRecord = ^TUserRecord;
  TUserRecord = record
    Bz: Byte;
    ValueSize: Integer;
    ValueBuf: Pointer;
    PassSize: Integer;
    PassBuf: Pointer;
  end;

procedure GetRegisterHandle; //取得注册窗口句柄,保存在全局变量RegiserHandle,只有IsWindow(RegisterHandle)以下函数才有效
function GetRegisterInfo(Index: Integer = 0): string; //查询接口信息,13条信息按顺序保存在RegisterStrings里,根据Index(取值范围从0到12,见②)返回相应信息字串
function GetRegisterUser: string; //已注册,则返回注册用户,否则返回空
function ShowRegisterForm: Boolean; //显示注册窗口
function SetRegisterInfo(User, Info: string): Boolean; //保存注册信息
function SetLanguage(PLanguage: Pointer): Boolean; //设置注册窗口的界面语言
function SetRegisterHint(PHint: Pointer): Boolean; //设置注册窗口的提示信息
procedure Compress(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = ''); //压缩算法(对某内存段进行压缩),注意调用成功的标志是(OutBuf <> nil) and (OutBytes > 0),使用最后要释放内存
procedure Decompress(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = ''; OutEstimate: Integer = 0); //解压缩,注意调用成功的标志是(OutBuf <> nil) and (OutBytes > 0),使用最后要释放内存
function StringCompress(SourceString: string; Password: string = ''; HFlag: Boolean = True): string; //对字符串进行压缩并返回编码后的字符串
function StringDecompress(SourceString: string; Password: string = ''; HFlag: Boolean = True): string; //对经上一函数压缩编码的字符串进行解压缩
procedure Encrypt(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = ''); //随机加密算法(对某内存段进行加密),注意调用成功的标志是(OutBuf <> nil) and (OutBytes > 0),使用最后要释放内存
procedure Decrypt(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = ''; OutEstimate: Integer = 0);//随机加密算法(对某加密内存段进行解密),注意调用成功的标志是(OutBuf <> nil) and (OutBytes > 0),使用最后要释放内存
function StringEncrypt(SourceString: string; Password: string = ''; HFlag: Boolean = True): string; //对字符串进行随机加密并返回编码后的字符串
function StringDecrypt(SourceString: string; Password: string = ''; HFlag: Boolean = True): string; //对经上一函数加密编码的字符串进行解密

var
  RegisterHandle: HWND;
  RegisterStrings: TStringList;

implementation

procedure GetRegisterHandle;
var
  TempStr: string;
  i: Integer;
  hFileMap: Cardinal;
  TempP: ^Cardinal;
begin
  RegisterHandle := 0;
  TempStr := GetModuleName(HInstance);
  i := Pos('\', TempStr);
  while i > 0 do
  begin
    TempStr := Copy(TempStr, 1, i - 1) + '/' + Copy(TempStr, i + 1, Length(TempStr) - i);
    i := Pos('\', TempStr);
  end;
  TempStr := TempStr + '/' + IntToHex(GetCurrentProcessID, 8);
  hFileMap := OpenFileMapping(FILE_MAP_WRITE, False, PChar(TempStr));
  if hFileMap > 0 then
  begin
    TempP := MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
    if TempP <> nil then
    begin
      RegisterHandle := TempP^;
      UnmapViewOfFile(TempP);
    end;
    CloseHandle(hFileMap);
  end;
end;

function GetRegisterInfo(Index: Integer = 0): string;
var
  i, MessageResult: Integer;
begin
  Result := '';
  if Index = 0 then
    Result := 'N';
  if (Index = 4) and not IsLibrary then
    Result := Application.Title;
  if not IsWindow(RegisterHandle) then
    Exit;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, 0, 1);
    if MessageResult <> -1 then
      Break;
  end;
  if MessageResult <> -1 then
  begin
    SetLength(Result, Length(PChar(MessageResult)));
    CopyMemory(@Result[1], Pointer(MessageResult), Length(Result));
    if RegisterStrings = nil then
      RegisterStrings := TStringList.Create;
    RegisterStrings.Text := Result;
    if (Index >= 0) and (Index < RegisterStrings.Count) then
      Result := RegisterStrings[Index]
    else
      Result := '';
  end;
end;

function GetRegisterUser: string;
begin
  Result := '';
  if IsWindow(RegisterHandle) then
    if GetRegisterInfo = 'Y' then
      Result := RegisterStrings[2]
    else
      Result := '';
end;

function ShowRegisterForm: Boolean;
var
  i, MessageResult: Integer;
begin
  Result := False;
  if not IsWindow(RegisterHandle) then
    Exit;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, 0, 0);
    if MessageResult <> -1 then
      Break;
  end;
  if MessageResult = 1 then
    Result := True;
end;

function SetRegisterInfo(User, Info: string): Boolean;
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  Result := False;
  if not IsWindow(RegisterHandle) then
    Exit;
  P.Bz := $FF;
  P.ValueSize := Length(User);
  if P.ValueSize > 0 then
    P.ValueBuf := @User[1]
  else
    P.ValueBuf := nil;
  P.PassSize := Length(Info);
  if P.PassSize > 0 then
    P.PassBuf := @Info[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, 100, Integer(@P));
    if MessageResult <> -1 then
      Break;
  end;
  if MessageResult = 1 then
    Result := True;
end;

function SetLanguage(PLanguage: Pointer): Boolean;
var
  i, MessageResult: Integer;
begin
  //PLanguage指向内存(不含逗号和省略号):一个字节字符集,一个字节字体大小,字体名称#0,字符串4#0,字符串5#0,......,字符串17#0
  //如一个字符串:#134#9'宋体'#0'警告'#0'出现未知错误'#0......'取消(&C)'#0
  Result := False;
  if not IsWindow(RegisterHandle) or not Assigned(PLanguage) then
    Exit;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, 1000, Integer(PLanguage));
    if MessageResult <> -1 then
      Break;
  end;
  if MessageResult = 1 then
    Result := True;
end;

function SetRegisterHint(PHint: Pointer): Boolean;
var
  i, MessageResult: Integer;
begin
  //PHint指向内存(不含逗号):过期后输入框颜色转换成的字符串#0,提示信息#0,主页#0,邮箱地址#0
  //如一个字符串:'$0000FF'#0'请注册本软件'#0'http://www.server.com'#0'mailto:someone@server.com'#0
  Result := False;
  if not IsWindow(RegisterHandle) or not Assigned(PHint) then
    Exit;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, 10000, Integer(PHint));
    if MessageResult <> -1 then
      Break;
  end;
  if MessageResult = 1 then
    Result := True;
end;

procedure Compress(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = '');
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  OutBuf := nil;
  OutBytes := 0;
  if not IsWindow(RegisterHandle) or not Assigned(InBuf) or (InBytes = 0) then
    Exit;
  P.Bz := 0;
  P.ValueSize := InBytes;
  P.ValueBuf := InBuf;
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      GetMem(OutBuf, P.ValueSize);
      OutBytes := P.ValueSize;
      CopyMemory(OutBuf, P.ValueBuf, P.ValueSize);
    except
      OutBuf := nil;
      OutBytes := 0;
    end;
end;

procedure Decompress(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = ''; OutEstimate: Integer = 0);
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  OutBuf := nil;
  OutBytes := 0;
  if not IsWindow(RegisterHandle) or not Assigned(InBuf) or (InBytes = 0) then
    Exit;
  P.Bz := 1;
  P.ValueSize := InBytes;
  P.ValueBuf := InBuf;
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      GetMem(OutBuf, P.ValueSize);
      OutBytes := P.ValueSize;
      CopyMemory(OutBuf, P.ValueBuf, P.ValueSize);
    except
      OutBuf := nil;
      OutBytes := 0;
    end;
end;

function StringCompress(SourceString: string; Password: string = ''; HFlag: Boolean = True): string;
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  Result := '';
  if not IsWindow(RegisterHandle) or (SourceString = '') then
    Exit;
  if HFlag then
    P.Bz := 10
  else
    P.Bz := 20;
  P.ValueSize := Length(SourceString);
  P.ValueBuf := @SourceString[1];
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      SetLength(Result, P.ValueSize);
      CopyMemory(@Result[1], P.ValueBuf, P.ValueSize);
    except
      Result := '';
    end;
end;

function StringDecompress(SourceString: string; Password: string = ''; HFlag: Boolean = True): string;
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  Result := '';
  if not IsWindow(RegisterHandle) or (SourceString = '') then
    Exit;
  if HFlag then
    P.Bz := 11
  else
    P.Bz := 21;
  P.ValueSize := Length(SourceString);
  P.ValueBuf := @SourceString[1];
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      SetLength(Result, P.ValueSize);
      CopyMemory(@Result[1], P.ValueBuf, P.ValueSize);
    except
      Result := '';
    end;
end;

procedure Encrypt(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = '');
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  OutBuf := nil;
  OutBytes := 0;
  if not IsWindow(RegisterHandle) or not Assigned(InBuf) or (InBytes = 0) then
    Exit;
  P.Bz := 100;
  P.ValueSize := InBytes;
  P.ValueBuf := InBuf;
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      GetMem(OutBuf, P.ValueSize);
      OutBytes := P.ValueSize;
      CopyMemory(OutBuf, P.ValueBuf, P.ValueSize);
    except
      OutBuf := nil;
      OutBytes := 0;
    end;
end;

procedure Decrypt(InBuf: Pointer; InBytes: Integer; var OutBuf: Pointer; var OutBytes: Integer; Password: string = ''; OutEstimate: Integer = 0);
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  OutBuf := nil;
  OutBytes := 0;
  if not IsWindow(RegisterHandle) or not Assigned(InBuf) or (InBytes = 0) then
    Exit;
  P.Bz := 101;
  P.ValueSize := InBytes;
  P.ValueBuf := InBuf;
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      GetMem(OutBuf, P.ValueSize);
      OutBytes := P.ValueSize;
      CopyMemory(OutBuf, P.ValueBuf, P.ValueSize);
    except
      OutBuf := nil;
      OutBytes := 0;
    end;
end;

function StringEncrypt(SourceString: string; Password: string = ''; HFlag: Boolean = True): string;
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  Result := '';
  if not IsWindow(RegisterHandle) or (SourceString = '') then
    Exit;
  if HFlag then
    P.Bz := 110
  else
    P.Bz := 120;
  P.ValueSize := Length(SourceString);
  P.ValueBuf := @SourceString[1];
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      SetLength(Result, P.ValueSize);
      CopyMemory(@Result[1], P.ValueBuf, P.ValueSize);
    except
      Result := '';
    end;
end;

function StringDecrypt(SourceString: string; Password: string = ''; HFlag: Boolean = True): string;
var
  P: TUserRecord;
  i, MessageResult: Integer;
begin
  Result := '';
  if not IsWindow(RegisterHandle) or (SourceString = '') then
    Exit;
  if HFlag then
    P.Bz := 111
  else
    P.Bz := 121;
  P.ValueSize := Length(SourceString);
  P.ValueBuf := @SourceString[1];
  P.PassSize := Length(Password);
  if P.PassSize > 0 then
    P.PassBuf := @Password[1]
  else
    P.PassBuf := nil;
  for i := 1 to 100 do
  begin
    MessageResult := SendMessage(RegisterHandle, WM_USER, High(Integer), Integer(@P));
    if MessageResult = 1 then
      Break;
  end;
  if MessageResult = 1 then
    try
      SetLength(Result, P.ValueSize);
      CopyMemory(@Result[1], P.ValueBuf, P.ValueSize);
    except
      Result := '';
    end;
end;

initialization
  GetRegisterHandle;

finalization
  if Assigned(RegisterStrings) then
    RegisterStrings.Free;

end.


四、问题介绍:

    1. 因使用了 Delphi 的 Forms 单元和 Hagen Reddmann(在这里表示感谢)的 CIPHER 组件以及压缩算法单元,导致本软件生成的加密壳代码较长,可能会在一定程度上增加了目标文件的尺寸,但如果目标文件较大,则也可能有一定的压缩效果。

    2. 因须在系统目录中生成文件,还要操作注册表,正常运行需要操作系统提供权限支持。

    3. 道高一尺,魔高一丈,不敢保证本软件及经本软件加密的软件不会被破解,但可以说,在一定程度上增加了破解的难度。为了增加破解难度,应尽量使用编程接口。


五、作者寄语:

    EncryptPE目前版本为 V1.2003.5.18 ,是第一个正式注册版,欲知具体注册事宜以及其后续版本情况,请关注 EncryptPE 网站(http://www.encryptpe.com),在网站上您还能下载到 EncryptPE 以前的免费版本及其他一些有用的软件。如果您在使用本软件过程中遇到问题,或者您有什么意见和建议,或者您想注册本软件,请用Email 联系作者(wfs@encryptpe.com ),作者一定会即时回复。

相关文章:

    无相关新闻
    无相关新闻

精彩推荐
本类热门文章

论坛美图

本周软件下载排行

广告联系 | 版权说明 | 意见建议 | 加入收藏 | 军网站群 [ 军软件园 - 军软件商城 - 军软件园论坛 ]

电信与信息服务业务经营许可证:京ICP证050203