************************************************************************* ************************************************************************* ****************Witaj w tutorze #5 by TepeX !!!************************** ************************************************************************* ************************************************************************* Bytom woj.Slaskie 1.03.2000 Witaj!!! Huh, jak ten czas leci. To juz #5 numer (mam nadzieje ze nie ostatni). Dzisiej bede chcial wam pokazac, jak lepiej zabezpieczyc swoj program, oraz jak go nie zabezpieczac! Jak widac ten numer jest dedykowany dla programistow, ale mam nadzieje, ze kazdy znajdzie tu cos dla siebie. UWAGA!!!!!!! Materialy tutaj wykorzystywane pochodza z roznych zrodel w sieci! Jesli ktos uwaza, ze znalzly sie tutaj jego dziala - to sorry! Staralem sie podpisywac co i jak, oraz nie kasowac notek (ale czasami musialem). A zrodla te to: - strona crackpl - materialy Stona - materialy RAD'a - i jeszcze cos! UWAGA!!!! (znowu) Mama plytke crackersk'a. 650 mb cracerskich stron, programow itp. Jesli chcesz mail'me. Cena 20zl + wysylka. Lub przyjazd do Bytomia bez wysylki! -------------------------Kontakt ze mna:-------------------------------- zhrbytom@friko.internet.pl krata1@kki.net.pl Ewentualnie od czasu do czasu siedze na IRC'u (kanal #crackpl). ----------------------------------------------------------------------- Zaczynamy!!! Jak zabezpieczyc swojego programu! 1. Pamietaj!!! Najlepszym zabezpieczeniem jest wiele zabezpieczen!!! 2. Zadnych messagebox'ow o zlym hasle!!! To naprawde ulatwia sprawe! 3. Wiele zabezpieczen anty, szukaj ich na poczatku pracy programu, pomiedzy jakimis kluczowymi funkcjami (np. register) 4. Zawsze! pakuj plik *.exe - mimo iz to nie chroni programu przed crackerami, to zmiejsza znacznie plik i przeszkadza w robieniach crack'ow. 5. Jedyna informacja o niezarejstrowaniu - okienku about, ewentualnie glowne menu 6. Najbarziej zlosliwe??? Po zlym wpisaniu kodu wylaczaj program! 7. Gdy wykryjesz debuger/pulapke/cokolwiek wylaczaj program bez zadnej przyczyny (najlepiej rob to z opoznieniem) 8. Zapisuj haslo w pliku zakodowane (najlepiej w jakims nie rzucajacym sie w oczy - widzialem program zapisujacy haslo w fake pliku exe!) 9. Kolejna zlosliwa rzecz - gdy uzytkownik/cracker kliknie na OK w celu weryfikacji hasla poszukaj debuger'a i jak go znajdziesz OFF bez komunikatu A. Korzystaj z najnowszych osiaganiec cracker'ow - czest to wlasnie oni znajduja sposoby na swoje programy (lepsza zabawa :)))))) ) B. Koduj dane w pliku!!! C. Moj patent (uniemozliwia znalezienie hasla metoda analizy kody) - ustal sobie jakies haslo, takie aby wykonanie kilku niezaleznych operacji na nich dawalo taki sam wynik!!! W celu zapoznania sie dokladniej popatrz na artykul pod koniec tekstu! D. Gdy juz naprawde nie wiesz co zrobic - popros o pomoc cracker'ow E. Zawsze korzystaj w pelni z mozliwosci tanego sposobu - roznica pomiedzy wykorzstaniem klucza HASP'a w pelni i minimalnie liczy sie w godzinach spedzonych przed monitorem!!! F. Zaufany cracker moze sluzyc za beta-testera zabezpieczen - wylapie on wiekszosc bledow w zabezpieczeniu. 10. Popros znanych cracker'ow o zrodla ich crackme - sa to jedne z NAJLPEIEJ zabezpieczonych programow! 11. Zawsze sprawdzaj poprawnosc kodu w kilku miejscach - co z tego ze masz genialne kodowanie serial'a kiedy zpatch'owanie jej zajmuje 2 minuty (przy czasie rozkodowywania XX godzin) 12. Zawsze przy uruchomieniu programu sprawdzaj AUTENTYCZNOSC wpisanego seriala! 13. Sprawdzaj check-sum pliku *.exe,*.dll 14. POMYSL i wymysl nowe skuteczniejsze zabezpieczenie - idealne, oklepane stanowia latwy kasek 15. NIW WIERZ firma twierdzacym ze ich produkty sa NIE DO ZLAMANIA - cos takiego nie istnieje (przekonasz sie o tym kiedys...) 16. Od czasu, do czasu w przypadku wykrycia zabezpieczenia posc jakis zabawny komunikat (np. Witaj mily cracke'rze. Jak widac zabrales sie sie za moj program.Cieszy mnie to, ale... zostaw go w spokoju. Albo jeszcze lepiej - zlam i powiedz mi co jest nie tak z zabezpieczenie. W zadnym wpypadku nie puszczaj crack'a/serial'a w obieg!!!). Czasami taki maly komunikat sprawi, ze cracker polubi cie/twoj program i zostawi wyniku swojej pracy sobie, no chyba ze trafis na zwyklego pirata... 17. NAJWREDNIEJSZY sposob - kiedy wykryjesz niepozadane dzialania skasuj program z dysku/usun wazny klucz/wpis (i otworz nowy - robiacy to samo po reinstalacji...). Przecietny crack'er zostawi twoj program w spokoju. 18. Stosuj liczniki prob, to naprawde denerwuje! 19. NIGDY NIE ZDRADZAJ SWOICH NAJLEPSZYCH ZABEZPIECZEN!!! Huh, to by bylo na tyle wymadrzen. Pokaze ci teraz jak zamienic to w czyn. Na poczatej jak wykryc debuger'a. Potem bedzie o tym czym pakowac plik, ciekawe schematy zabezpieczen, oraz jak oglupic pare innych programow. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!UWAGA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Programy w asm'ie pisane pod TASM'a. Komipilacja: TASM32 /ml /m3 nazwa_pliku.asm,,; TLINK32 /Tpe /aa /c nazwa,nazwa,, import32.lib 1. Melt-Ice - wymyslona przez Davida Erikssona. Polega na utworzeniu pliku o nazwach driverow SoftIce (//./STICE, //./NTICE itp.). Oto przyklad programu .386p locals jumps .model flat,STDCALL ;---------------------- API calls ------------------------------------ extrn MessageBoxA :Proc extrn ExitProcess :Proc extrn CloseHandle :Proc extrn CreateFileA :Proc ;------------------------- DATA --------------------------------------- .data VXDHandle dd 0 FileHandle dd 0 TitleMsg db 'Sice VxD''s detector',0 SICE db '\\.\SICE',0 SIWVID db '\\.\SIWVID',0 SiceDetected db 'SICE detected!',0 SiwvidDetected db 'SIWVID detected!',0 CantFindMsg db 'Can''t find SoftICE VxD''s :-(',0 Count db 0 ;------------------------ CODE ------------------------------------- .code Start: push 0 push 4000000h push 3 push 0 push 3 push 0C0000000h cmp Count, 0 jnz Next push offset SICE jmp LoadIt Next: cmp Count, 1 ja Exit push offset SIWVID LoadIt: call CreateFileA cmp eax, 0ffffffffh jz CantFindThem push eax call CloseHandle push 0 push offset TitleMsg cmp Count, 0 jnz Next_ push offset SiceDetected jmp DispatchIt Next_: cmp Count, 1 ja Exit push offset SiwvidDetected DispatchIt: push 0 call MessageBoxA push [VXDHandle] call CloseHandle cmp Count, 1 jz Exit inc Count jmp Start CantFindThem: push 0 push offset TitleMsg push offset CantFindMsg push 0 call MessageBoxA Exit: push 0h call ExitProcess End Start Jak sie przed nia uchronic??? Wystarczy wlaczyc FrogSice, zlapac funkcje createfilea, zapatchowac plik winice.exe (wszystkie stringi SICE,NTICE zamienic na inne badziewie - po tym zaebiegu nie dziala loader!!!). Kolejna metoda jest patentem Stona. I tu tez nie potrzeba wiele, aby ja zastoswoac w praktyce. Aby ja uzyc musimy na poczatku przypisac ExceptionFilter do punktu 4. Nastepnie z EBP='BCHK' u EAX='4' wywolujemy int 3. Jesli SoftIce jest obecny to bedzie koniec, a jesli go nie ma to dzialamy dalej. Oto przyklad - tym razem w Delphi i Asmie (przyklady ze strony CrackPL). Glowna : mov [ZachowajESP],esp push offset filter call SetUnhandledExceptionFilter mov ebp,'BCHK' mov eax, 4 int 3 call MessageBoxA - SI obecny jmp wyjscie dalej : ...program glowny.... wyjscie : Call ExitProcess filter : mov esp, [ZachowajESP] push offset dalej ret program JakasAplikacja; uses Forms, SysUtils, Windows, var Zachowaj :pointer; info1,info2 :string; begin {** Program g³ówny} info1:='Detekcja SoftIce'; info2:='Ups ! SoftIce zaladowany'; try asm {** instrukcje asm **} mov Zachowaj,esp push offset @prcexce call SetUnhandledExceptionFilter mov ebp,'BCHK' mov eax, 4 int 3 push 0 push info1 push info2 push 0 call MessageBoxA Call ExitProcess @prcexce: mov esp, Zachowaj push offset @koniec ret @koniec: ret end; except end; Application.CreateForm(Tu juz reszta :-)); Application.Run; end. Mozemy takze przeszukac w pamieci ciagu znakow winice.brk (przyklad z materialow Stona). .386P Locals jumps .Model Flat ,StdCall ;Define the needed external functions and constants here. Extrn ExitProcess : PROC Extrn MessageBeep : PROC CR_LF EQU 0dh,0ah .Data ; the data area Logo db "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ",CR_LF db "þ Win95 WinIce Detector ú/ú v1.0, Copyright (c) 1997, Stone of [UCF]",CR_LF db "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ",CR_LF,CR_LF,0 LogoLength EQU $ - Logo Found db "Woooop.. Winice Detected!",10,13 LenFound EQU $-Found NotFound db "Nopes - no Winice",10,13 LenNotFound EQU $-NotFound winice2 db "WINICE.BRK" ; WINICE.BRK can be found.. len EQU 10 tag db "2nd&mi" Include Console.inc .Code ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Main: Call Init_Console Write_Console LEA ESI, winice2 ; Search for this string call search jnc m8success jmp Terminator m8success: Write_Console JMP EXIT Terminator: Write_Console EXIT: Push LARGE-1 Call ExitProcess ; this simply terminates the program. search PROC mov al, byte ptr [esi] mov ecx, 100000h ; Experiment with this.. should be as long as possible mov edx, esi mov edi, 10000h again: cld repnz scasb jnz notfound dec edi push ecx mov ecx, len repz cmpsb jcxz found mov esi, edx pop ecx jmp again found: pop ecx clc ret notfound: stc ret search ENDP End Main Na koniec dzialu o SoftIce proponuje wam cos ekstra. 8 metod wykrycia SoftIce!!! by Stone. Kompilacja przebiega w trzech plikach: -----------------------------------glowny------------------------------------- .386P LOCALS JUMPS .MODEL FLAT, STDCALL ; with STDCALL we must reverse the sequence of pushes ; before a APIn call. UNICODE = 0 ; Needed for w32.inc INCLUDE W32.inc ; Windows definitions include excep.inc extrn LoadLibraryA : PROC extrn GetProcAddress : PROC .DATA pIDT db 6 dup (?) ; data used by method 5 lpSICE9x db "\\.\SICE",0 ; data used by method 4 lpSICENT db "\\.\NTICE",0 ; data used by method 4 lpSIWVID db "\\.\SIWVID",0 ; data used by method 6 lpszNmsym db "C:\siw95\nmtrans.dll",0 ; data used by method 7 - 95 lpszNmSymNT db "C:\ntice\nmtrans.dll",0 ; data used by method 7 - NT lpszNmIsSoftIceLoaded db "NmSymIsSoftICELoaded",0 ; data used by method 7 lpszCaption db "Stone's Win32 Winice detector",0 ; caption lpszMethod1 db "Method 1: Int 68h",0 lpszMethod2 db "Method 2: Int 3 - The BCHK interface",0 lpszMethod3 db "Method 3: 'WINICE.BR' string found in V86 MEMORY",0 lpszMethod4 db "Method 4: SoftIce Device Driver",0 lpszMethod5 db "Method 5: IDT",0 lpszMethod6 db "Method 6: SoftIce Video Driver",0 lpszMethod7 db "Method 7: NmTrans.dll told me",0 .CODE start: NotIceTF: call IsIceInt68 test eax,eax jz NotInt68 call MessageBoxA, 0, offset lpszMethod1, offset lpszCaption, 0 NotInt68: call IsIceInt3 test eax,eax jz NotInt3 call MessageBoxA, 0, offset lpszMethod2, offset lpszCaption, 0 NotInt3: ; call IsIceLowMem ; This method is unstabile when SI 3.23 test eax,eax ; is loaded. It's efficient against jz NotLowMem ; 3.0 and works when no ice is loaded! call MessageBoxA, 0, offset lpszMethod3, offset lpszCaption, 0 NotLowMem: call IsIceDrv test eax,eax jz NotDrv call MessageBoxA, 0, offset lpszMethod4, offset lpszCaption, 0 NotDrv: call IsIceSIDT test eax,eax jz NotIDT call MessageBoxA, 0, offset lpszMethod5, offset lpszCaption, 0 NotIDT: call IsIceSiwVid test eax,eax jz NotSiwVid call MessageBoxA, 0, offset lpszMethod6, offset lpszCaption, 0 NotSiwVid: call IsIceNmTrans test eax,eax jz NotIceNmTrans call MessageBoxA, 0, offset lpszMethod7, offset lpszCaption, 0 NotIceNmTrans: call ExitProcess, -1 IsIceDrv PROC CALL CreateFileA, OFFSET lpSICE9x, FALSE, FALSE, NULL, FALSE,\ OPEN_EXISTING, NULL CMP EAX, -1 JZ @@NoSICE9x mov eax, TRUE RET @@NoSICE9x: CALL CreateFileA, OFFSET lpSICENT, FALSE, FALSE, NULL, FALSE,\ OPEN_EXISTING, NULL CMP EAX, -1 JZ @@NoSICENT mov eax, TRUE RET @@NoSICENT: xor eax,eax ret IsIceDrv ENDP IsIceLowMem PROC ; Searches for the string "WINICE.BR" in V86 MEMORY. mov al, "W" mov edi, 10000h mov ecx, 400000h-10000h SetExceptionFrame @@More: repnz SCASB ; "W" jecxz @@NotFound cmp dword ptr [edi], "CINI" ; INIC jz @@Ok1 jmp @@More @@Ok1: add edi, 4 cmp dword ptr [edi], "RB.E" ; jnz @@More mov eax,1 @@NotFound: RestoreExceptionFrame ret IsIceLowMem ENDP IsIceInt3 PROC SetExceptionFrame mov eax, 4 mov ebp, "BCHK" int 3 RestoreExceptionFrame mov eax, TRUE ret IsIceInt3 ENDP IsIceInt68 PROC SetExceptionFrame mov ah, 43h int 68h RestoreExceptionFrame cmp ax, 0f386h jz @@Exit xor eax,eax ret @@Exit: mov eax, TRUE ret IsIceInt68 ENDP IsIceSIDT PROC SetExceptionFrame ; Exit with "FALSE" if exception ; remember to restore exeption filter ; with the appropriate macro ; this isn't strictly needed. ;----- Here starts the actual detection routine sidt fword ptr pIDT ; Get IDT mov eax, dword ptr [pIDT+2] ; eax -> IDT add eax,8 ; eax -> int 1 "vector" mov ebx, [eax] ; ebx == int 1 "vector" add eax, 16 ; eax -> int 3 "vector" mov eax, [eax] ; eax == int 3 "vector" and eax, 0ffffh ; don't use the selector and ebx, 0ffffh ; ditto sub eax, ebx ; find displacement cmp eax, 01eh ; if it's 1eh then it's Siw95 3.0 jz @@end xor eax,eax @@end: RestoreExceptionFrame ; Macro that restores the UnhandledExceptionFilter ret IsIceSIDT ENDP IsIceSiwVid PROC CALL CreateFileA, OFFSET lpSIWVID, FALSE, FALSE, NULL, FALSE,\ OPEN_EXISTING, NULL CMP EAX, -1 JZ @@NoSIWVID mov eax, TRUE @@NoSIWVID: RET IsIceSiwVid ENDP IsIceNmTrans PROC call LoadLibraryA, offset lpszNmsym test eax, eax jz @@Not95 call GetProcAddress, eax, offset lpszNmIsSoftIceLoaded test eax, eax jz @@Not95 call eax test eax,eax jnz @@Exit @@Not95: call LoadLibraryA, offset lpszNmSymNT test eax,eax jz @@Exit call GetProcAddress, eax, offset lpszNmIsSoftIceLoaded test eax,eax jz @@Exit call eax @@Exit: ret IsIceNmTrans ENDP ends end start SetExceptionFrame Macro @@Continiue: EndM RestoreExceptionFrame Macro pop edx mov fs:[0],edx pop edx ; adjust stack EndM .data OldStack dd 0 ; static data OldEbp dd 0 -----------------------------------plik *.def----------------------------------------- NAME stnobsf DESCRIPTION 'Get Obsfucator example' CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE MULTIPLE EXETYPE WINDOWS HEAPSIZE 65536 STACKSIZE 65536 -----------------------------------plik *.rc------------------------------------------ #define IDI_ICON1 200 IDI_ICON1 ICON DISCARDABLE "icon1.ico" ------------------------------------------------------------------------------------- Prawda, ze ciekawe. W celu zapoznania sie z dalszymi sztuczkami proponuje poszukac w sieci pakietu Stona, Rada (lub @-mail do mnie...). Teraz plik *.log z obrony SoftIce ( za pomoca FrogSice ) przed wykryciem go za pomoca metod opisanych w ostatnim pliku: => Stnsid ** SoftICE detection ** code 07, at FCE8:0040FCE8 Interrupt:68h >eax=00404300h ebx=00530000h ecx=8159ACF4h edx=00000000h esi=8159ACD4h edi=8159B08Ch ebp=0054FF78h => Stnsid ** SOFTICE DETECTION ** code 0B, at cs:00402012 Attempting to load: SICE => Stnsid ** SOFTICE DETECTION ** code 0B, at cs:0040201B Attempting to load: NTICE => Stnsid ** SOFTICE DETECTION ** code 0B, at cs:00402025 Attempting to load: SIWVID Popatrzymy, wylryl 4!!! z 7!!!! metod... O czym to swiadczy??? Nie ufajcie w IDEALNYCH obroncow. W celu zacisniecia jeszcze obrony SoftIce proponuje potraktowac go narzedziem SiceTols. Wspolczynnik znacznie wtedy wzrosnie... -----------------------------metoda by TepeX--------------------------------- Podczas ktoregos wieczoru wpadlem na taki pomysl. Gdy program bierze haslo w celu weryfikacji, program przeprowadza na nim jakies tam operacje. Nastepnie powtornie tym samym hasle przeprowadza inne operacje, i tak kilka razy. Nastepnie wszystkie wyniku porownuje ze soba!!! Gdy sa rowne - dobrze, gdy nie - zle haslo. W/g moich obliczen metoda ta uniemozliwia wygenerowanie haslo metoda reverse enginering. Oto przyklad: Mamy haslo TepeX. I ciag operacje np. xor, or, and, sub i w wyniku wpisania dobrego hasla powinnismy otrzymac 100. II ciag operacji np. shl,ror,rol,shr i w wyniku operacji (na dobrym hasle) otrzymujemy np. 2000 no to jeszcze odejmujemy 1900. III ciag operacji podobny jak poprzednie W kulminacyjnym punkcie programu porowunje wyniki operacji. Gdy sa takie same dobre haslo, gdy nie zle. Latwe??? Sprobuj to odwrocic! UWAGA!!! Za kazdym razem ciag operacji wykonuje sie na glownym hasle!!! Nie porownuj wynikow z zadnymi liczbami bo wtedy cracker ma wielki punkt zaczepienia!!! Ciekawe adresy: www.crackpl.site.pl - polska kultowa juz strona, poprostu THE BEST www.cookiecrk.z.pl - strona grupy CookieCrk. Duzo toolsow, crackme www.ptasiek.x.pl - newsy ze sceny crack www.provider.com.pl/~beanus/ - mirror fravii i Crackstore www.corleone.net/a_s_s_e_m_b_l_y.htm - Art Of Asmebly Language - genialna ksiazka o Asmeblerze (moze kiedys ja przetlumacze) GREATS: mNICH - nauczyl mnie wiele (i na pewno nie tylko mnie ), gbyby nie on dalej bylbym "zwyczajny" +HCU - za to co robia i jak robia CrackPl - za postawe ( fundament ) polskiej sceny crack GustawKit - za to, ze trzyma caly ten burdel ( bez urazy, chodzi o balagan :PPPP ) BART - dzieki niemu wiem ze nie jestem JEDYNY w swoim miesice (Bytom) A takze dla wszystkich cracker'ow na swiecie ( + Rafal Platek ) !!!!!!! zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl*** zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl***