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

для защиты Windows приложений

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

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


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

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

var str:string; i:integer; str:=’њњ|xњxxxaњфxэ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.

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

Комментарии

отсутствуют

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


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

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

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

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