Rambler's
Top100

АнтиКрэк или как защитить свою Дельфи программу. Часть 1

Автор: FEUERRADER
Дата: 24.05.2003
Раздел: Reverse Engineering

Я видел много статей, которые рассказывают о защите дельфи программ от таких горе-крэкеров, как, например, я, но они не были достаточно конкретны. В этой статье я попытаю дать всем желающим реальный код для защиты Ваших программных продуктов. Здесь собраны советы со всего РуНета!

Защита от Restorator, ResHacker, Exescope и др.: достаточно вставить несколько раз к событиям на нажатие кнопок или на событие формы OnCreate, такой код.

var str:string;
    i:integer;

str:='эxкxщгмxфxйxт';

for i:=1 to length(str) do
str[i]:=Chr(Ord(str[i]) xor $AABDEE66);

form1.memo1.lines.text:=str;

В примере, строка str-заксоренная нормальная строка с текстом. Чтобы получать заксоренные строки из нормальных, рекомендую создать простую программу-X0RER: Бросьте на форму 2 memo, 1 edit и кнопку. Для кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
     s:string;
begin
S:=memo1.text;
for i:=1 to length(S) do
s[i]:=Chr(Ord(S[i]) xor strtoint(edit1.text));

memo2.Text:=s;
end;

Всё, пишете в memo1 нормальную строку, в Edit1 число, на которое будет производиться XOR. Нажимаем кнопку и в memo2 заксоренный текст. А в программе делаете взамообратную процедуру, указанную выше. Главное, что всякие Рестораторы не распознают в формах нечитабельные символы, не относящиеся к алфавитным и циферным знакам. Поэтому при открытии в Рестораторе формы с заКСОРенными строчками он круто обламается. Попробуйте сами! Что самое удивительное, компилятор нисколько не ругается, что мы вставляем в string несимвольные данные.

Защита от отладчиков: что же сделать, чтобы обнаружить SoftIce, TRW2000. Предлагается использовать обнаружение во внешних криптерах, типа ASProtect, TElock, SVKP, BopCrypt и др. Но если крякер снимает "навесную защиту", то Вы лишаетесь анти-отладочных приемов! Как же этого избежать? Да просто вставить эти приемы в тех местах, например, где используются функциональные ограничения. ПРИЧЕМ, ОЧЕНЬ ВАЖНО, НИКОГДА не вставляйте ССЫЛКУ на процедуру проверки отладчика, а вставляйте целый код проверки снова и снова. Например:

!!!ТАК НЕ НАДО ДЕЛАТЬ!!!
Procedure SoftICEActive:boolean;
begin
...
код проверки
...
End;

procedure TForm1.OnlyForReggedUserButtonClick(Sender: TObject);
begin
if SoftIceActive=true then begin
ShowMessage('SoftIce Active');
Halt;
end else begin
...
нормальный код
...
end;

!!!ТАК НАДО НАДО ДЕЛАТЬ!!!

procedure TForm1.OnlyForReggedUserButtonClick(Sender: TObject);
begin

//код проверки активности SoftICE


if SoftIceActive=true then begin
ShowMessage('SoftIce Active');
Halt;
end else begin
...
нормальный код
...
end;

Фишка в том, что крякер замучается патчить прогу. А вот сам код обнаружения SoftICE:

1 Способ.

function SoftIce95: boolean;
var hfile: Thandle;
begin
  result:=false;
    hFile:=CreateFileA('\\.\SICE',
    GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE,
    nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if(hfile<>INVALID_HANDLE_VALUE) then  begin
  CloseHandle(hfile);
  result:=true;
end;
end;

2 Способ (универсальный). Для этого использутся точная копия функции NmSymIsSoftICELoaded из NMTRANS.DLL, которой пользуется "родной" Symbol Loader (loader32.exe), хотя, при желании, можно пользоватся непосредственно функциями из NMTRANS.DLL (последняя входит в сам SoftICE). Думаю, сообразите, как пользоваться этим кодом, можно как отдельным юнитом.

unit Security;

interface

uses Windows;

const nmtrans = 'NMTRANS.DLL';

function IsSoftICELoaded: BOOL; stdcall;

function NmSymIsSoftICELoaded: BOOL; stdcall;
{$EXTERNALSYM NmSymIsSoftICELoaded}
function DevIO_ConnectToSoftICE: THANDLE; stdcall;
{$EXTERNALSYM DevIO_ConnectToSoftICE}

implementation

{$IFDEF _USE_NMTRANS_DLL}

function NmSymIsSoftICELoaded; external nmtrans name 'NmSymIsSoftICELoaded';
function DevIO_ConnectToSoftICE; external nmtrans name 'DevIO_ConnectToSoftICE';

{$ELSE}

function NmSymIsSoftICELoaded: BOOL;
var hf: THandle;
begin
  Result := TRUE;
  hf := DevIO_ConnectToSoftICE();
  if hf<>INVALID_HANDLE_VALUE
    then CloseHandle(hf)
    else Result := FALSE;
end;

function DevIO_ConnectToSoftICE: THANDLE;
const 
  si_9x : PChar = '\\.\SICE'#0#0;
  si_nt : PChar = '\\.\NTICE'#0#0;
begin
  Result := CreateFileA(si_9x, $80000000, $3, nil, $3, $80, $0);
  if Result<>INVALID_HANDLE_VALUE then Exit;
  Result := CreateFileA(si_nt, $80000000, $3, nil, $3, $80, $0);
  if Result<>INVALID_HANDLE_VALUE then Exit;
  SetLastError($0A6580001);
end;

{$ENDIF}

function IsSoftICELoaded: BOOL;
begin
  Result := NmSymIsSoftICELoaded;
end;

end.

3 Способ. Ассемблерный код (не советую)

   00000000 : B4 43                         MOV	AH, 43h
   00000002 : CD 68                         INT	68h
   00000004 : 66 3D 86 F3                   CMP	AX,0F386h
   00000008 : 75 06                         JNE	00000010
   0000000A :                               ; Активен
   0000000E : EB 04                         JMP 00000012
   00000010 :                               ; Не Активен

Этот способ следует использовать только в операционных системах Win9x.

В недалеком будущем наваяю еще подобную статейку, только о регистрациионной защите ваших программ, что более актульней, чем защита от отладчиков.



Все права защищены ©  2003 
...::FEUERRADER::...




Rambler's Top100