![]() |
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс |
Новичку | Ссылки | Программирование | Интервью | Архив | Связь |
АнтиКрэк или как защитить свою Дельфи программуОбсудить статью на форумеХорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь. Автор: FEUERRADER <feuerrader@nm.ru>
Я видел много статей, которые рассказывают о защите дельфи программ от таких горе-крэкеров, как, например, я, но они не были достаточно конкретны. В этой статье я попытаю дать всем желающим реальный код для защиты Ваших программных продуктов. Здесь собраны советы со всего РуНета! 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 несимвольные данные. !!!ТАК НЕ НАДО ДЕЛАТЬ!!! 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: 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 Комментарий Bad_guy'я: шифрование строк в исходниках Дельфи действительно очень полезно, именно это позволяет избавиться от большого количества начинающих крэкеров, пытающихся добраться до процедуры проверки кода путем поиска ключевых строк "Зарегистрировано" и подобных, а вот определение активности именно отладчика SoftICE здесь упомянуто не очень удачно, ведь зачастую сейчас многие крэкеры переходят на альтернативные отладчики и все коды по определению SoftICE оказываются бесполезными - решением может быть определение именно процесса отладки, а не конкретного отладчика, хотя таких алгоритомв и мало, но они будут более полезны. К тому же, на мой взгляд, не желательно выдавать окно об обнаружении отладчика - лучше запустить таймер по которому секунд через 5 произойдет выход из программы, а окно лучше не выводить вообще, когда крэкер не видит с чем ему бороться - он и не будет ничего делать. Материалы находятся на сайте https://exelab.ru ![]() |
Вы находитесь на EXELAB.rU |
![]() |