| * 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
|