Cracking - Jak zacząć? - Część I

Status
Zamknięty.

0wn3r

Były Moderator
Dołączył
Marzec 10, 2007
Posty
1330
----------
Pierwsze od czego zacznę ten temat, to od tego, kim jest osoba nazywająca się "cracker".
Niektórym kojarzy się to słowo z cracker-hacker, lecz tak nie jest (i dobrze)
smile.gif

Niektórzy myślą, że cracker to taki ktoś, kto tylko pisze cracki, w tym nie ma za dużo racji, lecz cracker rzeczywiście może pisać cracki do różnych aplikacji. Pisze to po to, żeby wbić ludziom czytającym ten artykuł do głowy, że cracker =! hacker.
W mojej definicji, cracker to osoba :

- inteligentna (ma pojęcie o komputerach)
- znająca chociaż podstawy assemblera
- potrafiąca programować w jakimś języku programowania
- potrafiąca zmieniać kod programu, znajdować inne potrzebne rzeczy

Czyli inaczej mówiąc i prościej, cracker to osoba, która łamie zabezpieczenia programu i go modyfikuje w jakiś sposób aby osiągnąć odpowiedni efekt.

Nie bać się, my tu nie będziemy łamać prawa, ani nic z tych rzeczy. W moich kursach, będziemy tylko modyfikować przez nas stworzone programy & crackme'sy.
----------
Druga rzecz, to pytanie, jak zacząć przygodę z crackingiem ?
Rzeczy, które będą nam potrzebne do przygody z crackingiem :

- mózg
- internet
- znać assemblera, choćby w podstawowym stopniu

Gdy się upewniliście, że te cechy posiadacie, trzeba posiąść odpowiednie narzędzia.


- Debugger np. OllyDebugger lub SoftIce
- Disassembler np. IDA, W32DASM
- RegMon, FileMon i inne monitory
- kompilator asma (MASM, TASM, itp.)
----------
Kilka pojęć :

Pierwsze od czego zacznę, to od :

Sposób zapisu (hex, dec, itp.) - może uczyłeś się o tym w szkole, ale powiem to. Istnieją takie trzy główne rodzaje zapisu cyfr :
- binarny - każdy bit może przyjmować wartość 1 lub 0
- decymendalny - po prostu system dziesiątkowy
- hexymendalny - wyrażany przez cyfry & litery

Rejestry procesora - procesor, posiada tzw. rejestry (chyba wiesz co to rejestr, nie?).
Procesor posiada 9 głównych rejestrów, a są to :
- eax, ebx, ecx, edx, edi, esi, ebp, esp & eip
Wszystkie te rejestry co wymieniłem u góry są 32 bitowe, czyli zbudowany z dwóch 16 bitowych części. Następnie te 16 bitowe rejestry dzielą się na kolejne 8 bitowe(np. AX dzieli się na AH, AL). Są również inne rejestry, np. znaczników (d o i z s a c p), które mogą mieć wartość 0 lub 1 (inaczej nazywane rejestry znaczników - flagi procesora). Przechowują one chwilowe informacje w twoim kodzie (xor, sub, itp).

Język maszynowy - jak każdy wie, kod źródłowy podczas kompilacji jest przekształcany w kod maszynowy, zrozumiały dla komputera. Będziemy takie kody źródłowe podglądać za pomocą różnych narzędzi (disassembler, debugger).
----------
Opisze wam teraz obsługę disassemblera W32DASM.
----------
W32DASM nie posiada jakiś super extra funkcji, jeśli znasz angielski, to nawet nie muszę tu nic opisywać, no ale jeśli ktoś nie zna..

Zakładka disassembler :

Open file to disassemble - otwórz plik do disassemblacji
Save disassembly - zapisywanie zdisassemblowanego pliku
Print preview - podgląd wydruku
Print - drukuj
Print setup - ustawienia drukowania
Copy selected line - kopiuje zaznaczoną linię do schowka
Font - czcionka
Clear All Trade Marks - usuń zaznaczenia (wszystkie)
Disassembler Options - ustaw tam wszystko na "enable"

Zakładka project :

Open Project File - otwiera zdisassemblowany plik (wcześniej ...)

Debug :
Load process - wczytaj proces
Attach to an active process - wczytaj aktywny proces
Breakpoint toggle - ustawienie breakpointa
Run process - debugguj
Pause process - przestań debuggować
Goto current eip - skocz do aktualnego eip
Terminate process - wyłącz proces
Debugger options - opcje debuggera (włącz wszystko na "enable")

Podałem wyżej tylko te przydatniejsze opcje..

Zakładka Search :

Find text - znajdź tekst
Find next - znajdź następny

Zakładka Goto :
Goto Code Start - idź na początek kodu źródłowego programu
Goto program entry point - idzie na początek kodu, tam gdzie program zaczyna wykonywać działanie
Goto page - idzie na zadaną stronę
Goto code location - idzie pod konkretny Virual Address

Zakładka Execute :

Execute jump - wykonuje skok
Return From Last Jump - wraca do miejsca skąd nastąpił skok
Execute call - wykonuje call'a
Return From Last Call - tak samo jak skok tylko call

Zakładka Functions :

Imports - lista importów
Exports - lista exportów

Zakładka HexData

Hex Display of Code Data - wyświetla zadany segment (hex)
Hex Display of Code - wyświetla zadany kawałek kodu (hex)

Zakładka Refs :

Menu References - odniesienia do menu zdisassemblowanego programu
Dialog References - odniesienia do okienek
String Data References - odniesienia do łańcuchów tekstowych ("stringów")

Zakładka Help :

Tego nie trzeba tłumaczyć
smile.gif

----------
No dobra, co z tego jeśli wam przetłumacze menu jak i tak nic nie będziemy robić? Disassemblujemy pierwszy przykład programu.
----------
Dobra, nabazgrajcie jakiś program w byle jakim języku programowania, np. C++, proste hello world.
Kod:
#include <iostream>

#include <conio.h>



using namespace std;



int main()

{



cout <<"Hello World!" << endl;

getch();



}

Dobra, skompilujcie to. Przykładowo, nasz program hello world, jest spakowany jakimś packerem i nie możemy go otworzyć przez W32DASM, co zrobić? Ściągamy analizator plików (może być PEID) i otwieramy nim nasz spakowany program, dowiadujemy się co to za packer/cryptor i szukamy unpackera/decryptora. Jeśli plik nie jest spakowany, śmiało możemy go otworzyć poprzez W32DASM (Disassembler > Open File to disassemble i wybieramy plik .EXE). Po załadowaniu programu, ukaże nam się piękny listing naszego programu (no mi akurat nie, bo trzeba zmienić czasami czcionkę, bo wyskoczą same kwadraty i inne badziewia). Skoro już wszystko wiemy, omówmy tabelę importów i exportów. W menu w zakładce Functions mamy coś takiego jak Import & Export. Klikamy na Import (export jest bodajże nie aktywne). Poszukajmy teraz funkcji, która wyświetla nasz tekst Hello World poprzez cout. Gdy ją już znajdziecie, kliknijcie dwa razy, a disassembler przeniesie was w odpowiednie miejsce w listingu, gdzie ta funkcja jest wywoływana przez program. Właśnie do tego służy tabela importów & exportów.
Teraz druga sprawa, podział programu na sekcje.
Jeśli przejdziecie na samą górę listingu, powinniśmy ujrzeć coś takiego :

Kod:
Numer of objects = 0005(dec), Imagebase = 00400000h

Object01: .text    RVA: 00001000 Offset: 00000400 Size: 0003DA00 Flags: 60000060

Object02: .data    RVA: 0003F000 Offset: 0003DE00 Size: 00000200 Flags: C0000040

Object03: .rdata   RVA: 00040000 Offset: 0003E000 Size: 00002800 Flags: 40000040

Object04: .bss     RVA: 00043000 Offset: 00000000 Size: 00000000 Flags: C0000080

Object05: .idata   RVA: 00048000 Offset: 00040800 Size: 00000800 Flags: C0000040

Są to sekcje. Jak widzimy, program jest podzielony na kilka sekcji w których znajdują się różne informacje.

ObjectXX - gdzie XX to numer, np. 01, jest to numer sekcji
RVA - Wirtualny adres gdzie zaczyna się sekcja
Offset - offset w pliku, gdzie rozpoczyna się sekcja
Size - rozmiar sekcji
Flags - charakterystyka sekcji
----------
Jeśli chcesz zobaczyć kilka przydatnych skoków & porównań, które musisz umieć, zobacz :
ownersite.republika.pl/Skoki_i_porównania_-_asm.rar
----------
Jak będę miał znowu czas, napiszę dalsze części artykułu.
Mam nadzieje, że to co tu napisałem się komuś przydało..
<
 
Status
Zamknięty.
Do góry Bottom