|Wykrywanie pulapek debuggera| - zip file GET
* post ten zostal prawie zywcem zajechany z listy crackpl

Witajcie

Ostatnio wciagniety zostalem przez kilka osob niezaleznie w dyskusje na priva o mozliwosciach wykrywania debuggera, konkretnie SoftIca. W zasadzie wszystkie uniwersalne sztuczki sa juz znane i rozpracowane, ale nieoznacza to, ze wykrycie dzialalnosci debuggera, a w szczegolnosci breakpointow debuggera jest jush niemozliwoscia. Znany jest sposob na wykrywanie pulapek w kodzie poprzez przeszukiwanie najlepiej w oddzielnym watku danego odcinka kodu pod katem wystapienia opkodu CC badz tez liczenie jego sumy kontrolnej. Niestety jest to sposob zawodny, jednak sposob na wykluczenie slabych punktow tej metody wiaze sie z ponizszymi wywodami: Jak dotad jednak nikt nie probowal wykrycia pulapek zastawionych na dane. Idea breakpointu jest w tym przypadku zupelnie inna a mianowicie opiera sie na odpowiednim ustawieniu przez debugger atrybutow dostepu do danego regionu pamieci. I tak ustawienie pulapki na odczyt i zapis powoduje odebranie adresowi atrybutu PAGE_NOACCESS, nawet pulapki czesciowe powoduja takie same ograniczenia. Ponizej zrodlo programu w TASMie, ktory wykrywa pulapke zastawiona na serial pobrany funkcja GetDlgItemTextA. Oczywiscie najlepszym rozwiazaniem byloby kasowanie breakpointa za pomoca VirtualProtect ale jak ktos chce to sobie sam zaimplementuje. W koncu ta lista jest dla newbies, nie??:)) Jesli ktos wypomni mi, ze mozna zastawic polapke na VirtualQuery, hm wowczas albo uzywamy uslug Vxd (odsylam do xiazki M Pietrka "Windows programming secrets" i do debugowania funkcji), albo ustawiamy sprawdzanie na adres funkcji VirtualQuery zarowno na jego zawartosc (czyli czy jest CC), jak i na atrybuty(czyli VirtualQuery na sama siebie). Uniemozliwi to wykrycie sprawdzania CC za pomoca bpm VirtualQuery RW. Mozna rowniez odwolywac sie do trzeciego bajtu funkcji xorujac uprzednio EDX, ale
nie polecalbym stosowania tej metody przed sprawdzeniem listingu VirtualQuery z kilku roznychwersji Windows. Jak wiec widac kombinacji jest wiele.

---cut here------ bpr.asm

.386
locals
jumps
.model flat,STDCALL
include include\win32.inc
extrn VirtualQuery:Proc
extrn DialogBoxParamA:Proc
extrn EndDialog:Proc
extrn GetModuleHandleA:Proc
extrn GetDlgItemTextA:Proc
extrn ExitProcess:Proc
extrn MessageBoxA:Proc
extrn CreateThread:Proc
.data?
thWatek dd ?
uchwyt dd ?
serial db 32 dup (?)
membs MEMORY_BASIC_INFORMATION <?>

.data
jestobaprot db 'Pu³apka na odczyt/zapis', 0
tytul db 'Wykryto breakpoint na serial', 0

.code
start:
call GetModuleHandleA, 0
mov uchwyt, eax
call DialogBoxParamA, eax, 1, 0, offset ProceduraGlowna, 0
call ExitProcess, 0
ProceduraGlowna PROC uses esi edi ebx, hwnd:DWORD, wmsg:DWORD,
wparam:DWORD, lparam:DWORD
mov edx, wparam
.IF wmsg==WM_CLOSE
call EndDialog, hwnd, 0
.ELSEIF wmsg==WM_COMMAND
.IF DX==105
call GetDlgItemTextA, hwnd, 101, offset serial, 32
nop
nop
nop
.ENDIF
.ELSEIF wmsg==WM_INITDIALOG
call CreateThread, 0, 0, offset BreakCheck, hwnd, 0, offset thWatek
.ENDIF
ret
ProceduraGlowna ENDP

BreakCheck Proc, hwnd:DWORD
petla:

call VirtualQuery, offset serial, offset membs, SIZE
MEMORY_BASIC_INFORMATION
mov ebx, membs.Protect
.IF ebx == PAGE_NOACCESS
call MessageBoxA, hwnd, offset jestobaprot, offset tytul, MB_OK
.ENDIF
jmp petla
ret
BreakCheck ENDP
end start

-----cut here------bpr.rc

#define DIALOG_1 1
#define IDC_EDIT1 101
#define IDC_PUSHBUTTON1 105




DIALOG_1 DIALOG 6, 15, 161, 146
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME |
WS_MINIMIZEBOX | WS_MAXIMIZEBOX
CAPTION "BPR tester by Ptasiek/CrackPL"
FONT 8, "MS Sans Serif"
{
EDITTEXT IDC_EDIT1, 33, 14, 102, 12, ES_UPPERCASE | WS_BORDER | WS_TABSTOP
DEFPUSHBUTTON "OK", IDC_PUSHBUTTON1, 55, 109, 50, 14
}

-------cut here--------------

Pozdr
Ptasiek

 


All rights reserved for CRACKPL 1998 - 2oo2 . Designed by hauer