ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Простая антиотладка на Delphi
  #1  
Старый 15.10.2006, 13:19
Аватар для TaNkist
TaNkist
Участник форума
Регистрация: 06.04.2006
Сообщений: 257
Провел на форуме:
367179

Репутация: 76
По умолчанию Простая антиотладка на Delphi

Простая Антиотладка на Delphi.
Надеюсь, ты человек грамотный и знаешь, что такое отладчик (debugger). Если нет, то знай, что отладчик – программа, позволяющая следить за выполнением другой проги, отлавливать вызовы определенных функций. Дебаггер позволяет отловить ошибки или разобраться в работе какого-нибудь софта. Примерами являются OllyDebugger, SoftICE, gdb и десятки других мене известных и популярных.
Как ты понимаешь мало-какому програмеру понравиться, когда его прогу отлаживают. Особенно это не нравится шароварщикам и вирусописателям. Ведь если первые могут лишиться денег. То вторые рискуют поплатиться свободой и провести ближайшие пару лет в тюрьме. Поэтому хакеры учатся противодействовать отладчикам. В Интернете большинство материалов, посвященных антиотладке, рассчитаны на профессионалов, я же постараюсь объяснить все просто даже для новичков, а в качестве языка программирования у нас будет выступать Delphi.
Использование специальной api-функций.
В Windows есть специальная api-функция, позволяющая определить находимся ли мы под отладкой. Имя ей IsDebuggerPresent. Она не принимает параметров и возвращает true, если отладчик присутствует. Кстати, в заголовочном файле Windows.pas этой функции нет, поэтому объявить ее нужно самому.
PHP код:
function IsDebuggerPresent():booleanstdcallexternal 'kernel32.dll';
begin
 
if IsDebuggerPresent()=true then MessageBox(0,'debugger present','DebuggerChecker',0)
 else 
MessageBox(0,'No debugger','DebuggerChecker',0);
end
Поиск отладчика
Как и любая программа, отладчик имеет свой процесс, а значит может быть обнаружен через список процессов. Получить этот список можно разными способами. Мы будем работать с ToolHelp Api.
PHP код:
var
 
Snapdword;
 
ProcessTPROCESSENTRY32;
begin
  Snap 
:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS0);
  if 
snap<>INVALID_HANDLE_VALUE then
    begin
    Process
.dwSize:=SizeOf(TPROCESSENTRY32);
    
repeat
          
if lstrcmp(Process.szExeFile,'OLLYDBG.EXE')=0 then
              begin
              MessageBox
(0,'OllyDBG work!','DebuggerChecker',0);
              
halt;
              
end;
    
until not Process32Next(SnapProcess);
    
end;
  
MessageBox(0,'OllyDBG not work!','DebuggerChecker',0);
end
Большинство отладчиков общаются с пользователями через графический интерфейс. Т.е. мы можем вычислить дебаггер, найдя его окно. Поиск окон осуществляется функцией FindWindow.
PHP код:
var h:HWND;
begin
 h 
:= findwindow(nil,'OllyDbg');
 If 
h<>0 then MessageBoxA(0,'OllyDbg work!','DebuggerChecker',0)
 else  
MessageBoxA(0,'OllyDbg not work!','DebuggerChecker',0);
end
Борьба с брейкпоинтами
Брейкпоинт (бряк) – точка останова, подходя к этой точке, работа программы приостанавливается, и управление передается отладчику. Рассмотрим стандартный взлом: на функцию вывода сообщения (MessageBox) о неправильной регистрации ставится бряк, дальше анализируется близлежащий код и пишет кейген или кряк. Теперь ты понимаешь, почему важно бороться с бряками. Программный брейкпоинт представляет собой байт CCh (опкод команды int3). Нам нужно прочитать первые байты api-функции, перед ее вызовом, и если они равны CC, то нужно воздержаться от вызова( либо восстановить эти байты, прочитав оригинальный файл на диске). Прочитать можно функцией ReadProcessmemory.
PHP код:
function breakpoint(dll:Thandle;addr:pointer):boolean;
var 
buffer:byte;
icardinal;
begin
result
:=false;
ReadProcessMemory(dll,addr,@buffer,1,i);
if 
buffer=$CC then result:=true;
end;

var 
usr32:thandle;
begin

usr32
:=GetModuleHandle('user32.dll');
if 
breakPoint(usr32,GetProcAddress(usr32,'MessageBoxA'))
   
then MessageBoxA(0,'Breakpoint on MessageBoxA','DebuggerChecker',0)
   else 
MessageBoxA(0,'MessageBoxA is clear','DebuggerChecker',0)
end
Вот мы и познакомились с простенькой антиотладкой на Delphi. Теперь ты в состоянии защитить свою программу от начинающего крякера или написать учебный протектор.
© TanKisT email:tank1st@bk.ru
http://hackedpro.org
 
Ответить с цитированием

  #2  
Старый 15.10.2006, 14:30
Аватар для ProTeuS
ProTeuS
HARDstasy
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

улЫбнул этот кусок кода

if breakPoint(usr32,GetProcAddress(usr32,'MessageBoxA '))
then MessageBoxA(0,'Breakpoint on MessageBoxA','DebuggerChecker',0)

MessageBoxA в этом слу4ае никогда не сработает, т.к. на нем будет сработан останов

хотя как "у4ебный" показательный пример - ни4его, держи +
 
Ответить с цитированием

  #3  
Старый 15.10.2006, 14:37
Аватар для ProTeuS
ProTeuS
HARDstasy
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

вотn еще может кому пригодится:
PHP код:
procedure ListProcesses;
var 
c1:Cardinal;
pe:TProcessEntry32;
s1,s2:string;
x:integer;
 
begin
 form1
.listbox1.Clear;
 
form1.listbox2.Clear;
 
X:=0;
 
c1:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0);
 if 
c1=INVALID_HANDLE_VALUE then
 begin
 
exit;
 
end;
try
pe.dwSize:=sizeof(pe);
if 
Process32First(c1,pethen
repeat
inc
(x);
s1:=ExtractFileName(pe.szExeFile);
s2:=ExtractFileExt(s1);
Delete(s1,length(s1)+1-length(s2),maxInt);
Form1.Listbox1.Items.Add(s1);
Form1.Listbox2.Items.Add(pe.szExeFile);
ProcessId[x]:=pe.th32ProcessID;
//ListBox1.Items.Add(inttostr(pe.th32ProcessID));
until not Process32Next(c1,pe);
finally 
CloseHandle(c1);
end;
end
PHP код:
procedure delproc(numb:string);
var
c1:Cardinal;
pe:TProcessEntry32;
s1,s2:string;
x:integer;
 
begin
 x
:=0;
  try
 
Strtoint(numb);
 
except
 MessageDlg
('Error!!!',mtError,[mbOK],0);
 exit;
 
end;
 
c1:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0);
 if 
c1=INVALID_HANDLE_VALUE then
 begin
 MessageDlg
('Error reading',mtError,[mbOK],0);
 exit;
 
end;
try
pe.dwSize:=sizeof(pe);
if 
Process32First(c1,pethen
repeat
inc
(x);
s1:=ExtractFileName(pe.szExeFile);
s2:=ExtractFileExt(s1);
Delete(s1,length(s1)+1-length(s2),maxInt);
if 
x=strtoint(numbthen
if terminateprocess(OpenProcess(PROCESS_ALL_ACCESS,false,pe.th32ProcessID),1)
then sleep(100)
else 
MessageDlg('Error deleting'+pe.szExeFile,mtError,[mbOK],0);
until not Process32Next(c1,pe);
finally 
CloseHandle(c1);
end;
end
PHP код:
procedure TForm1.FormCreate(SenderTObject);
var 
i:integer;
begin
//находим и убиваем "ненужный" процесс
ListProcesses;
i:=0;
while 
i<=ListBox1.items.Count-do
begin
if LowerCase(ListBox1.Items[i])='ollydbg'then
        begin
         delproc
(inttostr(i+1));
         
ListProcesses;
         
i:=0;
        
end;
Inc(i);
end;
i:=0;
while 
i<=ListBox1.items.Count-do
begin
if LowerCase(ListBox1.Items[i])='w32dasm'then
        begin
         delproc
(inttostr(i+1));
         
ListProcesses;
         
i:=0;
        
end;
Inc(i);
end;
end;
...... 
 
Ответить с цитированием

  #4  
Старый 15.10.2006, 14:42
Аватар для ProTeuS
ProTeuS
HARDstasy
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

и еще, функция для обнаружения активного SoftIce:

PHP код:
function IsSoftIce95Loadedboolean;
Var 
hFileThandle;
Begin
result 
:= false;
hFile := CreateFileA('\\.\SICE'GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITEnilOPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL0);
if( 
hFile <> INVALID_HANDLE_VALUE then begin
CloseHandle
(hFile);
result := TRUE;
end;
End
PHP код:
function IsSoftIceNTLoadedboolean;
Var 
hFileThandle;
Begin
result 
:= false;
hFile := CreateFileA('\\.\NTICE'GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITEnilOPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL0);
if( 
hFile <> INVALID_HANDLE_VALUE then begin
CloseHandle
(hFile);
result := TRUE;
end;
End
 
Ответить с цитированием

  #5  
Старый 16.10.2006, 10:46
Аватар для KindEcstasy
KindEcstasy
Участник форума
Регистрация: 30.09.2006
Сообщений: 134
Провел на форуме:
352963

Репутация: 197
Отправить сообщение для KindEcstasy с помощью ICQ
По умолчанию

Позновательно, но имхо с "бородой". Но всё равно лови +!
 
Ответить с цитированием

  #6  
Старый 20.10.2006, 13:57
Аватар для BUG(O)R
BUG(O)R
Познающий
Регистрация: 15.08.2006
Сообщений: 74
Провел на форуме:
53311

Репутация: 77
По умолчанию

Да уж, боянчег...
 
Ответить с цитированием

  #7  
Старый 20.10.2006, 14:14
Аватар для taha
taha
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме:
2472378

Репутация: 1077
По умолчанию

Цитата:
Да уж, боянчег...
Это можно на чём угодно написать. Юзается так давно.
Но в принципе для тех кто не знает должно быть позновательно.
 
Ответить с цитированием

  #8  
Старый 20.10.2006, 18:49
Аватар для ProTeuS
ProTeuS
HARDstasy
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

Цитата:
Сообщение от taha  
Это можно на чём угодно написать. Юзается так давно.
Но в принципе для тех кто не знает должно быть позновательно.
на то и тема "простая антиотладка.."

а для тех, кто "знает" - лезем к китай4егам и выискуем архивы с сорцами сплойпов для ольки, иды и других "полезных" фи4
 
Ответить с цитированием

  #9  
Старый 22.10.2006, 00:46
Аватар для ProTeuS
ProTeuS
HARDstasy
Регистрация: 26.11.2004
Сообщений: 1,367
Провел на форуме:
4226592

Репутация: 2175


Отправить сообщение для ProTeuS с помощью ICQ
По умолчанию

небезизвестный сплойт для ольки

PHP код:
start:
PUSH 512
PUSH offset filename 
;%s%s.exe
PUSH 0
CALL GetModuleFileName

MOV ECX
,offset filename
ADD ECX
,EAX

@SeekFileName:
DEC ECX
CMP BYTE PTR
[ECX],'\'
JNE @SeekFileName

MOV BYTE PTR[ECX],0
INC ECX

PUSH ECX
PUSH offset OriginalFileName ;%s%s.exe
CALL lstrcmp

TEST EAX,EAX
JNE @DebuggerDetected

PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox

JMP @exit
@DebuggerDetected:

PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox

@exit:

PUSH 0
CALL ExitProcess

end start 
 
Ответить с цитированием

  #10  
Старый 25.10.2006, 13:40
Аватар для taha
taha
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме:
2472378

Репутация: 1077
По умолчанию

Цитата:
а для тех, кто "знает" - лезем к китай4егам и выискуем архивы с сорцами сплойпов для ольки, иды и других "полезных" фи4
Тока это не ко мне, тыж знаешь пока (надеюсь не на долго) я не полноценный пользователь.
Кстати хотел спросить(в моих ебуках этого нет).
Dec выстовляет флаг равенства, когда значение регистра становится равно нулю (ни как не могу вспомнить)?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 2006 SNK Soft - Windows 5 15.09.2006 22:53
.:Join-им 2 exe-шника ручками (using Delphi):. xShreKx Авторские статьи 6 12.06.2006 16:22
Delphi tcp/ip - и мой пк! LeonW С/С++, C#, Delphi, .NET, Asm 10 14.10.2005 06:07
Азы Delphi Morph Авторские статьи 1 13.03.2005 01:22



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ