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

0wn3r25

Pierwsze od czego zacznę ten artykuł, 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) :)
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ć :)

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.

#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 :

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
// Jeśli będę miał znów działający serwer FTP, wrzucę to tam

Jak będę miał znowu czas, napiszę dalsze części artykułu.
Mam nadzieje, że to co tu napisałem się komuś przydało :)

13 komentarzy

nawet ciekawy tekst,
a czy cracing jest zły? zaleczy od cracera

Ehh... nie wiedziałem jak to się dokładnie pisze, to napisałem tak jak jest :P

  • binarny - każdy bit może przyjmować wartość 1 lub 0
  • decymendalny - po prostu system dziesiątkowy
  • hexymendalny - wyrażany przez cyfry & litery

Chyba raczej decymalny i heksadecymalny. Poza tym wypadaloby wyjasnic, ze to sa po prostu systemy liczbowe o podstawie 2, 10 i 16. ;)

Nie wiem czemu.

Hmm.. wyświetla mi się taki tekst w komentarzu:

Przecież to jest to samo, tylko, że łamiemy <font class="adtext" onmouseover="fo_emituj_reklame(4)" onmouseout="fo_ukryj_reklame()">program "hello world" i tłumaczymy sobie co w nim jest.

Dobra, zmodyfikuje to.

Nie postowałem, ale gdybym wiedział, że taki jest - zrobiłbym to. Nie czepiam się opisu budowy czy modyfikowania programów - są przecież programy, które tego nie zabraniają przecież. Jest to też dobry sposób nauki.

Czepiam się tego, że sam zdajesz sobie sprawę, iż pewne aspekt legalności są kontrowersyjne:

A jeśli chodzi o legalność, to cracking nie jest legalny, można trafić do więzienia, ale ja się jeszcze nie spotkałem z takim przypadkiem (poczytaj sobie o tym, jeśli chcesz się postraszyć i zniechęcić do crackowania :)).

a zamiast wprost, rzetelnie ostrzec użytkownika, w jakich sytuacjach jest to nielegalnie, dajesz do zrozumienia: no jest nielegalne, ale co z tego; i tak nie znam nikogo kogo skazali. Paranoja! Zastanów się do kogo kierujesz swój tekst i na ile poważnie chcesz zostać potraktowany.

W obecnej formie artykułu, mój wniosek o usunięcie pozostaje jak najbardziej aktualny.

Heheh... a też postowałeś o usunięcie artykułu Cracking - Zasada działania? Przecież to jest to samo, tylko, że łamiemy <font class="adtext" onmouseover="fo_emituj_reklame(4)" onmouseout="fo_ukryj_reklame()">program</span> "hello world" i tłumaczymy sobie co w nim jest. Ucząc się C/C++ i podglądając kod dissassemblerem można się i asma nauczyć.

Chcesz, to postuj sobie o usunięcie, mi to nie przeszkadza :)

// Jeśli będę miał znów działający serwer FTP, wrzucę to tam - a nie lepiej tutaj?

Rozumiem, domyślałem się - ale to były wskazówki, a nie jakieś wyrzuty; zawsze fajnie, jak się coś nowego pojawia.

Boże, pisałem ten artykuł na innym forum i teraz to tu skopiowałem -,-

Jak sam zaznaczyłeś cracking jest nielegalny (w rozumieniu kodeksu karnego nielegalne jest nawet samo omijanie zabezpieczeń), tak samo jak jego propagowanie i nakłanianie do niego.

Zatem niniejszy tekst też jest na bakier z prawem i albo zmienisz jego wymowę, albo będę postował o jego usunięcie.