|
Защита исходного кода программы
Как известно, разработчики программного обеспечения, то бишь программисты, используют для защиты от взлома собственной программы, особенно это актуально для платных программ (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
|
|