HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Простая антиотладка на Delphi
  #1  
Старый 15.10.2006, 13:19
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
Познавший АНТИЧАТ
Регистрация: 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
Познавший АНТИЧАТ
Регистрация: 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
Познавший АНТИЧАТ
Регистрация: 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
Участник форума
Регистрация: 30.09.2006
Сообщений: 134
Провел на форуме:
352963

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

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

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

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

Да уж, боянчег...
 

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

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

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

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

Репутация: 2175


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

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

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

  #9  
Старый 22.10.2006, 00:46
ProTeuS
Познавший АНТИЧАТ
Регистрация: 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
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме:
2472378

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

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi tcp/ip - и мой пк! LeonW С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 10 14.10.2005 06:07



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


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




ANTICHAT.XYZ