Техническая поддержка :

Современные решения

для защиты Windows программ

и восстановления исходного кода
Автор: FEUERRADER. Дата публикации: 05.08.2004

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

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

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

CODE NOW!
var str:string;
i:integer;

str:=’њњ|xњxxxaњфxэxкxщгмxфxйxт’;

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

form1.memo1.lines.text:=str;



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

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

memo2.Text:=s;
end;



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

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

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

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



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

CODE NOW!
procedure TForm1.OnlyForReggedUserButtonClick(Sender: TObject);
begin

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


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



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

1 Способ.

CODE NOW!
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). Думаю, сообразите, как пользоваться этим кодом, можно как отдельным юнитом.

CODE NOW!
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 Способ. Ассемблерный код (не советую)

CODE NOW!
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.

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

Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий:





Главная     Программы     Статьи     Разное     Форум     Контакты