ЖУРНАЛ "Территория Delphi". Выпуск №2, 2008 г.
О журнале
•  Главная
•  Авторы
•  Полезные ссылки
Delphi
•  Шифр простой подстановки
•  Прозрачная форма и не прозрачные компоненты
•  Поиск e-mail адресов
•  Защита исходного кода программы
•  Текст под углом
Устройства (hardware)
•  iRiver S10. Меняем оформление
Софт

•  Настройка jabber в Миранде IM

Администрирование. Linux
•  GPRS соединение в Linux via bluetooth
Администрирование. Windows
•  Установка jabber-сервера OpenFire на Windows

 

Копирование материалов журнала без размещения ссылки-источника запрещено!

Защита исходного кода программы

 

Как известно, разработчики программного обеспечения, то бишь программисты, используют для защиты от взлома собственной программы, особенно это актуально для платных программ (shareware), массу всевозможных средств. Некоторые пользуются (дабы не изобретать велосипед) уже готовыми решениями, например, я как-то пользовался Delphi String Protect. Но это уже выбор каждого. Я могу предложить готовый модуль для встраивания его к вашему коду. С его помощью человеку, собравшемуся ее "сломать" придется поработать, т.к. без софтайса строку в программе уже не исправить. И конечно же еще от вирусов защита... :)

 

unit UExeProtect;
 
interface
 
uses
  IniFiles, Windows, StrLib, Classes, dialogs, messages;
 
function GetComputerName:String;
function GetCRCOfFile(FileName:String):String;
procedure ProgramProtect(FileName:String);
function CopyFileToFile(File1,File2:String):boolean;
function SignFile(FileName:String):boolean;
function UnSign(FileName:String):boolean;
 
implementation
 
uses SysUtils, DateUtils;
 
var
  StartTime:TDateTime;
 
function TrivialLicensePeriodProtection:boolean;
begin
end;
 
function GetComputerName;
var Ch :PChar;
{$IFDEF VER100} { Borland Delphi 3.0 }
    Size :Integer;
{$ELSE}
    Size :Cardinal;
{$ENDIF}
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  Ch := StrAlloc(Size);
  Windows.GetComputerName (Ch, Size);
  Result := StrPas (Ch);
  StrDispose (Ch)
end;
 
function GetStrCRC(Str:WideString):Cardinal;
var
  I:Cardinal;
  StrCRC:Cardinal;
begin
  StrCRC:=2;
  for I:=1 to Length(Str) do
  begin
    StrCRC:=StrCRC+ord(Str[I])*I;
  end;
  Result:=StrCRC;
end;
 
function ICheckFileIsProtected(LInFileName:String):Boolean;
var
  IniFile: TIniFile;
begin
  //    Memory := TMemoryStream.Create;
  //    Memory.LoadFromFile(FileName);
  Result:=False;
  IniFile := TIniFile.Create(ParamStr(0) + '.crc');
  if (IniFile.ReadString('CRCProtection', LInFileName, 'not exist')
    <> 'not exist') then
  Result:=True;
  IniFile.Free;
end;
 
procedure IGetNumberOfProtectedFiles(var NumOfProtectedFiles: Integer);
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create(ParamStr(0) + '.crc');
  NumOfProtectedFiles := IniFile.ReadInteger('CRCParams', 'CountOfFiles', 0);
  IniFile.Free;
end;
 
function SignFile;
var
  IniFile:TIniFile;
  IniCRC:Cardinal;
  NumOfProtectedFiles: Integer;
//  Memory: TMemoryStream;
begin
  try
    if ICheckFileIsProtected(FileName) then
    begin
      IniFile:=TIniFile.Create(ParamStr(0)+'.crc');
      IniFile.WriteString('CRCProtection',FileName,GetCRCOfFile((FileName)));
      IniFile.Free;
    end
    else
    begin
      IGetNumberOfProtectedFiles(NumOfProtectedFiles);
      IniFile:=TIniFile.Create(ParamStr(0)+'.crc');
      IniFile.WriteString('CRCParams','File'+IntToStr(NumOfProtectedFiles+1),FileName);
      IniFile.WriteString('CRCProtection',FileName,GetCRCOfFile((FileName)));
      IniFile.Free;
    end;
//    Memory.Free;
    Result:=True;
  except
    Result:=False;
  end;
end;
 
function UnSign;
var
  IniFile:TIniFile;
begin
  IniFile:=TIniFile.Create(ParamStr(0)+'.crc');
  IniFile.WriteString('CRCProtection',FileName,'');
  IniFile.Free;
 
end;
 
function CopyFileToFile(File1,File2:String):boolean;
var
  Memory: TMemoryStream;
begin
  if FileExists(File2+'.old') then    DeleteFile(File2+'.old');
  if FileExists(File2+'.ren') then    DeleteFile(File2+'.ren');
  Memory := TMemoryStream.Create;
  Memory.LoadFromFile(File1);
  Memory.SaveToFile(File2+'.ren');
 
  Result:=RenameFile(File2,File2+'.Old');
  Result:=RenameFile(File2+'.ren',File2);
  Memory.Free;
  if FileExists(File2+'.old') then    DeleteFile(File2+'.old');
  if FileExists(File2+'.ren') then    DeleteFile(File2+'.ren');
end;
 
function GetCRCOfFile;
var
  I:Cardinal;
  Str:WideString;
  FCrc:Cardinal;
  Memory: TMemoryStream;
  OneByte:Byte;
begin
  if FileExists(FileName+'.old') then    DeleteFile(FileName+'.old');
  Memory := TMemoryStream.Create;
  Memory.LoadFromFile(FileName);
  FCrc:=2;
  For I:=0 to Memory.Size do
  begin
    Memory.Seek(I,0);
    Memory.Read(OneByte,1);
 
    FCrc:=FCrc+OneByte*I;
  end;
  Result:=FormatFloat('000 000 000 000',FCrc)+
   '; Size:'+FormatFloat('000 000 000 000',Memory.Size);
  Memory.Free;
end;
 
function CheckFileCRC(FileName:String):boolean;
var
  FCrc:String;
  IniCRC:String;
  IniFile:TIniFile;
begin
  IniFile:=TIniFile.Create(ParamStr(0)+'.crc');
  IniCRC:=IniFile.ReadString('CRCProtection',FileName,'0');
  IniFile.Free;
  if FileExists(FileName) then
  begin
    FCrc:=GetCRCOfFile(FileName);
    Result:=FCrc=IniCRC;
  end
  else
    Result:=False;
end;
 
function SupportCRCOfFile(FileName:String):boolean;
var
  FOk,Bk1OK:Boolean;
  Bk1Name:String;
//  Bk2Name:String;
begin
  if FileExists(FileName+'.old') then
    DeleteFile(FileName+'.old');
  FOk:=CheckFileCRC(FileName);
  Bk1Name:=FileName+'.bk1';
  Bk1Ok:=CheckFileCRC(Bk1Name);
  if FOk then begin
    //restore BK by
    if FileExists(Bk1Name) then
    if GetCRCOfFile(FileName)<>GetCRCOfFile(Bk1Name) then
    begin
      CopyFileToFile(FileName,Bk1Name);
      SignFile(Bk1Name);
    end;
  end;
 
  if FOk or Bk1OK then
  begin
    Result:=True;
    if not FOk then
    begin
      if Bk1OK then
      begin
        Result:=CopyFileToFile(Bk1Name,FileName);
        SignFile(FileName);
        WinExec(PChar(ExtractFileName(ParamStr(0))), CmdShow);
        ExitThread(0);
      end
      else
        Result:=False;
    end;
 
    if not Bk1OK then
    begin
      if FOk then Result:=CopyFileToFile(FileName,Bk1Name);
      SignFile(Bk1Name);
    end;
  end
  else
    Result:=False;
end;
 
function ProgramJustCompiled:boolean;
var
  FileDate:TDateTime;
  SecondBetw:integer;
begin
  Result:=False;
  if (GetComputerName='SHRAMOV') then
  if (FindWindow('TAppBuilder',nil) >= 0) then
  begin
    FileDate:=FileDateToDateTime(FileAge(ParamStr(0)));
    SecondBetw:=SecondsBetween(Now,FileDate);
    if  SecondBetw<20 then
      Result:=True;
    Result:=Result and Result;
  end;
end;
 
procedure ProgramProtect;
begin
  if ProgramJustCompiled then
    SignFile(ExtractFileName(ParamStr(0)));
//  else
  if not SupportCRCOfFile(FileName) then
  begin
    ShowMessage('тЮИК '+FileName+' ОНБПЕФДЕМ. бНЯЯРЮМНБХРЕ ХГ ЮПУХБЮ.');
    RunError;
  end;
 
end;
 
initialization
begin
  StartTime:=Now;
  if pos('UPDATE.',UpperCase(ExtractFileName(ParamStr(0))))>0 then
  begin
    repeat until MilliSecondsBetween(StartTime,now)>10000;
    DeleteFile(copy(ExtractFileName(ParamStr(0)),8,length(ExtractFileName(ParamStr(0)))-7));
    CopyFileToFile(ExtractFileName(ParamStr(0)),
    copy(ExtractFileName(ParamStr(0)),8,
    length(ExtractFileName(ParamStr(0)))-7));
    WinExec(PChar(copy(ExtractFileName(ParamStr(0)),8,
    length(ExtractFileName(ParamStr(0)))-7)), CmdShow);
    ExitThread(0);
  end
  else
  begin
    if FileExists('Update.'+ExtractFileName(ParamStr(0))) then
    begin
      DeleteFile('Update.'+ExtractFileName(ParamStr(0)));
      SignFile(ParamStr(0));
    end;
    if (ParamCount=1) and (ParamStr(0)<>ParamStr(1)) then
      SignFile(ParamStr(1));
    ProgramProtect(ExtractFileName(ParamStr(0)));
  end;
end;
 
end.
 



                        

Скачать модуль можно здесь.

C уважением, onyx

Бесплатный хостинг от EOMY.NET