                     _______                   ______
                     |   _   |-----.--.--.-----.   _  \
                     |   1___|  -__|  |  |  -__|.  |   |
                     |____   |_____|\___/|_____|.  |   |
                     |:  1   |                 |:  |   |
                     |::.. . | POLISH CRACKERS |::.|   |
                     `---===='__             __`-==_---'
                        |       |-----.---.-.   Y   |
                        |.|   | |  -__|  _  |.      |
                        `-|.  |-'_____|___._|. \_/  |
                          |:  |             |:  |   |
                          |::.|             |::.|:. |
                          `---'             `--- ---'

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=i n f o r m a t i o n s-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

   prog name   : CrackMe v1.0 by bEANUS^CookieCrK
   Date        : 05/07/2000
   Writen by   : Mr. Ketchup
   What        : tutorial

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-t u t o r i a l-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Czesc!

W tym tutorialu opisze sposob zlamania CrackMe v1.0 by bEANUS^CookieCrK.
Programik ten powinien byc dolaczony do pliku "zip" w ktorym byl ten tekst.
Jak ktos jest jasnowidzem i chce tylko wiedziec w jakiej formie bedzie haslo to specjalnie
pisze. Bedzie cos w stylu "xxxx xx xxxxx"
I co wiecie juz?:))) 

Co bedzie nam potrzebne:

- SoftIce w wersji im nowszej tym lepiej
- Turbo Pascal (ewentualnie inny jezyk programowania);
- Hiev v 6.xx 
- duzo kartek papieru
- dlugopis
- kalkulator
- troche zdrowych komorek mozgowych nie wyzartych przez alkochol i inne urzywki.:))


Odpalamy nasze crackme i widzimy ze trzeba tylko wpisac odpowiedni password.
Czyli "male piwo przed sniadaniem". z jakiego filmu to cytat?:)))
Wklepujemy jakis numer. Ja wpisalem 123456789.
Teraz klikamy na OK i programik powiedzial nam ze to nie ten password.
Teraz wchodzimy do SI(Crtl+D) i zastawiamy pulapke:

 bpx getdlgitemtexta

Wychodzimy z SI(Ctrl+D) i naciskamy OK. Ponownie uruchomil sie SI. Teraz naciskamy 
F11 aby wyjsc z funkcji. Powinienes zobaczyc cos takiego:

.004010D6: E80D010000                   call     .0004011E8   
.004010DB: 85C0                         test      eax,eax      <--tutaj jestesmy (0)
.004010DD: 741F                         je       .0004010FE     (1)
.004010DF: BFF6204000                   mov       edi,0004020F6 (2)
.004010E4: E833000000                   call     .00040111C     (3)
.004010E9: 85C0                         test      eax,eax       (4)
.004010EB: 7407                         je       .0004010F4     (5)

W linijce (0) jest sprawdzanie czy wpisalismy jakies znaki a jezeli nie to z z nastepnej linijki
nastapi skok do "spadaj frajerze" - bez komunikatu
Nam udalo sie zpelnic ten warunek wiec czesc roboty za nami:))
Teraz w linijce (2) na stos wkladana jest wartosc z 0004020F6. 
Mam nadzieje ze kazdy wie co to jest stos (a jak nie wie to niech sobie wyobrazi ze siedzi sobie
biedny polski rolnik na polu i nie ma kasy na nawoz. Aby czyms zasilic rosliny wywala na jedna 
kupe odpadki jakie zostaly po obiedzie. Kazda wywalona czesc oddziela sobie folia. Przychodzi
lato i zaczyna zdejmowac pokolei z tej wielkiej kupy kazda warstwe.
To wlasnie jest stos. Mozna na niego wkladac cos i zdejmowac. Jest tylko jedna wazna sprawa.
To co wlorzyles jako pierwsze zdejmiesz jako ostatnie!!)

Aby rolnik wiedzial jakie odpadki siedza w kazdej wartwie robi sobie notaki. Mozna je zobaczyc
wpisujac "d"
My chcemy sie dowiedziec co jest w edi wiec wpisujemy

  d edi

A co to jest. Przecierz takie znaki wpisalismy!!!
W linijce (3) jest procedura a w kolejnych czyli w (4 i 5) jest sprawdzenie naszego passworda.
Jezeli w eax bedzie 0 to skok do go_away_bad_boy. A jezeli 1 to welcome_home_good_boy

Jezeli komus sie spieszy aby szybko zobaczyc napis "great work!" niech napisze cos takiego

 "r"
Teraz niech przejedzie na napis o D i s z a P C i kazda literke zamieni na przeciwna.
Znaczy sie z malej litery zrob durza a z durzej mala.
Robi sie to za pomoca klawisza "Insert"

To co zostalo zmienione nazywa sie fachowo flagami i jest czyms w rodzaju policjanta ktory
raz podnosi a raz opuszcza lizak.

Ale nie o to chodzi aby zpatchowac program ale znalezc wlasciwy password. 

Wiec teraz wchodzimy do cool'a z linijki (3) (nacisnij F8 jak jest podswietlona ta linijka)
Powinienes zobaczyc cos takiego  

.0040111C: BFF5204000                   mov       edi,0004020F5 
.00401121: B9FFFFFFFF                   mov       ecx,0FFFFFFFF (1)
.00401126: 33C0                         xor       eax,eax       (2)
.00401128: 41                           inc       ecx           (3)
.00401129: 47                           inc       edi           (4)
.0040112A: 0FB61F                       movzx     ebx,b,[edi]   (5) 
.0040112D: 03C3                         add       eax,ebx       (6)
.0040112F: 803F00                       cmp       b,[edi],000   (7)
.00401132: 75F4                         jne      .000401128     (8)
.00401134: 83F90D                       cmp       ecx,00D       (9) 
.00401137: 7577                         jne      .0004011B0     (10)
.00401139: 90                           nop                     (11)
.0040113A: 90                           nop
.0040113B: 90                           nop
.0040113C: 90                           nop
.0040113D: 3D50030000                   cmp       eax,000000350 (12) 
.00401142: 756C                         jne      .0004011B0     (13)
.00401144: 90                           nop                     (14)

W linijkach od (1)  do (8) sumowana jest wartosc wszystkich liter.(kodow ASCII)
Wartosc ta jest ladowana do eax. Jezeli chcesz wiedziec ile wynosi ta wartosc to napisz tak:

? eax 

Mi wyszlo cos takiego
000001DD    00000477    "<jakies znaczki>"
  Hex          Dec


W linijce (9) jest sprawdzanie czy nasz password ma 13 znakow. A jezeli nie to chyba wiesz co 
sie stanie. Nam sie nie powiodlo wiec trzeba bedzie powtorzyc wszystkie wczesniejsze czynnosci.
W linijce (12) jest sprawdzenie czy suma naszych literek ma wartosc 350h(848dec)
I znowu nam sie nie zgadza. Chyba raczej ciezko nam bedzie za kazdym razem spelnic warunek 13 
liter i sumy 848 dlatego zpatchujemy program (rozwiazanie tymczasowe).
Uruchamiamy Hiev i dekodujemy program. Teraz odnajdujemy linijke 00401137 i zamieniamy skok z 
"jne" na "je" czyli zamiana z jezeli sie nie zgadza to skacz na skacz jesli OK.
Tak samo postepujemy z linijka gdzie jest sprawdzanie czy password ma sume znakow 848.

UWAGA
Teraz nie wpisuj nigdy 13 liter bo zawsze cie wywali. 

Program zpatchowany mozna isc dalej. Teraz wpisac mozemy tylko 4 znaki i wszystko bedzie OK
W linijce (14) jest pusta petla czyli nic nie robiaca. Nacisnij teraz kilka razy F10.

00401147: 90                           nop
00401148: BFF6204000                   mov       edi,0004020F6 (1)
0040114D: 813744414544                 xor       d,[edi],44454144 (2) 
00401153: 8107FEFFFEFE                 add       d,[edi],FEFEFFFE (3)
00401159: 7555                         jne      .0004011B0         (4) 
0040115B: 83C704                       add       edi,004           (5)
0040115E: 803720                       xor       b,[edi],020       (6) 
00401161: 754D                         jne      .0004011B0         (7)

Teraz sie zaczynaja schody. W linijce (1) na stos idzie nasz password.
Dalej nasz password (4 pierwsze znaki) jest xorowany z 44 45 41 44(slowo DEAD)
W linijce (3) dodawana jest do kazdej litery wartosc FE FE FF FE
Jezeli uzyskamy wynik 0 to skok do bad_boy nie nastapi.
Ale jakie to beda znaki???
A no mozna to policzyc recznie lub urzyc naszego kompa.

Przebiega to tak :
Zakladamy ze wpisalismy taki password 1234

(4{tutaj powinien byc kod ASCII od tej litery w systemie Hex} xor 44)+FE
(3{to co u gory} xor 45)+FE
(2{to co u gory} xor 41)+FF
(1(to co u Gory} xor 44)+FE

UWAGA

My bedziemy liczyc w systemie dziesietnym dlatego trzeba wszystko pozamieniac na dziesietny:

 Hex    Dec   ASCII  
  44     68    D
  45     69    E
  41     65    A
  44     68    D
  FE    254    znak nie istnieje  
  FE    254    znak nie istnieje 
  FF    255    znak nie istnieje 
  FE    254    znak nie istnieje


Ale z tych obliczen nie wyjdzie nam 0. Dlatego tez nasz komp policzy odpowiednie znaki.

-------------------------------------Tutaj ciac------------------------------------------------
Uses Crt;
Const litera=68;
      dodawana=254;

Var xo1,xo2,i :LongInt;

Begin
For i:=1 To 250 Do
Begin
   xo1:=i xor litera;
   xo2:=xo1+dodawana;
   If xo2>250 then xo2:=xo2-250;
   If (xo2>=(dodawana-250+xo1)) and (xo2<=10) then Writeln(char(i));
End;
Readln;
End.
-----------------------------------------------------------------------------------------------  
Troche by trzeba przerabiac program aby liczyl kazda literke z osobna ale to sie nie oplaca. 
Jednym slowem ten maly programik za jednym razem znajdzie 4 literki naszego passwordu.
Program znalazl nam taie literki

 @
 A
 B
 D
 E
 F
 G
Skreslamy dwie krancowe czyli "@" i "G" poniewaz zostawilem w programie maly margines bledu. 
Tak na szelki wypadek. 
Pierwszymi literkami naszego passwordu bedzie ostatnia litera od dolu czyli "F" i pierwsza z 
gory czyli "A". Wywalamy oczywiscie litery ktore juz zostaly zurzyte.
Zostaly nam teraz takie literki
 B
 D
 E

Poniewaz nigdy nic nie wyjmowalismy ze srodka to mamy do wyboru wywalic "B" albo "E"
No i ktora chcecie wywalic??
Ja wywaliem "B" i zostalo mi "DE". Czyli mamy nasze 4 cyferki a sa nimi "FADE"
A tak mowiac szczerze to jak chcecie napisac podobne CrackMe to nie dawajcie za password
jakiegos wyrazu gdyz juz po dwoch literach mozna sie zorientowac jakie jest haslo.

Teraz modyfikujemy nasz password i wpisujemy nasze 4 literki. 
Powtarzamy wszystkie czynnosci wykonane do tej pory

.00401159: 7555                         jne      .0004011B0   <--tu skok nie nastapi
.0040115B: 83C704                       add       edi,004     (1)
.0040115E: 803720                       xor       [edi],020 (2)
.00401161: 754D                         jne      .0004011B0   (3)

W linijce (1) zwiekszane jest edi o 4 czyli przesuwany jest nasz password o cztery literki 
czyli u mnie z passwordu FADE123456 zostalo tylko 123456
Dalej jest xor'owanie wartosci kodu ASCIIz 20h(32Dec). I jezeli wyjdzie zero to skok z (3) 
nie nastapi. Pametacie co trzeba xor'owac aby wyszlo 0. Nie pamietacie?? No to wam powiem.
Trzeba xor'owac dwie te same liczby. Czyli w naszym przypadku bedzie to litera o kodzie ASCII
32. A taka litera jest spacja " ".
Teraz radze czytac uwarznie bo nie bede powtarzal:)))
Widzisz przed soba cos takiego:
.00401163: 83C701                       add       edi,001 (1)
.00401166: 0FB60F                       movzx     ecx,b,[edi]
.00401169: B84E414562                   mov       eax,06245414E (do eax idzie wyraz "bEAN")
.0040116E: C1C006                       rol       eax,006 (przesuniecie cykliczne w lewo)
.00401171: 32E0                         xor       ah,al   (xorowaie ah i al)
.00401173: 02C1                         add       al,cl (zwiekszanie al o cl)
.00401175: E2F7                         loop     .00040116E  (petla) 
.00401177: 3D435DC8BC                   cmp       eax,0BCC85D43 (porownanie)
.0040117C: 7532                         jne      .0004011B0   (spadaj lamerze)


Tutaj jest sprawa troche zagmatwana dlatego tez nie bede sie w to zaglebial. Chodzi mniej wiecej
o to ze program wykonuje cos zwanego przesunieciem cyklicznym (robi to 6 razy).
Ja aby sobie ulatwic sprawe napisalem taki maly programik co robi dokladnie to samo.
Uzyskany wynik jest ladowany do eax i porownywany z wzorcowym czyli 0BCC85D43(hex)
a w ASCII sa to takie dziwne znaczki. Wartosci ich kodow ASCII to 188,200,93,67
I znowu poslurzymy sie naszym kompem:

------------------------------------- tu ciac---------------------------------------------------
uses Crt;
label 1;
type
  Tbit = 0..1;
var
  EDI, EAX, bufor: array [1..32] of Tbit;
  bity: array [1..8] of Tbit;
  AH, AL, CL: Byte;
  pr: 1..32;
  i: byte;
  bajt, znak: byte;
  w1, w2, w3, w4: Boolean;
  litera: char;
  ile:Byte;

procedure NaBity(co: Byte); {zamienia jakis bajt na bity i wrzuca je do tablicy Bity}
  var
    ob: Byte;
  begin
    ob:=co;
    bity[1]:=ob div 128;  ob:=ob-bity[1]*128;
    bity[2]:=ob div 64;   ob:=ob-bity[2]*64;
    bity[3]:=ob div 32;   ob:=ob-bity[3]*32;
    bity[4]:=ob div 16;   ob:=ob-bity[4]*16;
    bity[5]:=ob div 8;    ob:=ob-bity[5]*8;
    bity[6]:=ob div 4;    ob:=ob-bity[6]*4;
    bity[7]:=ob div 2;    ob:=ob-bity[7]*2;
    bity[8]:=ob;
  end;

procedure SklecBajt(pozpocz: byte);
Begin
    bajt:=0;
    inc(bajt,128*eax[pozpocz]);
    inc(bajt,64*eax[pozpocz+1]);
    inc(bajt,32*eax[pozpocz+2]);
    inc(bajt,16*eax[pozpocz+3]);
    inc(bajt,8*eax[pozpocz+4]);
    inc(bajt,4*eax[pozpocz+5]);
    inc(bajt,2*eax[pozpocz+6]);
    inc(bajt,eax[pozpocz+7]);
  end;

begin
Repeat
  ClrScr;
  GoToXY(1,1);
  write('litera = ');
  Writeln(char(ile));
  litera:=char(ile);
  writeln;
  znak:=Ord(litera);
  CL:=znak;
  NaBity($62);
  for i:=1 to 8 do eax[i]:=bity[i];
  NaBity($45);
  for i:=1 to 8 do eax[i+8]:=bity[i];
  NaBity($41);
  for i:=1 to 8 do eax[i+16]:=bity[i];
  NaBity($4E);
  for i:=1 to 8 do eax[i+24]:=bity[i];

1:

  for i:=1 to 32 do begin pr:=(i+5)mod 32+1; bufor[i]:=eax[pr] end;
  for i:=1 to 32 do eax[i]:=bufor[i];

  {xor ah,al}
  SklecBajt(17);
  ah:=bajt;
  SklecBajt(25);
  al:=bajt;
  ah:=(ah xor al);
  NaBity(ah);
  for i:=17 to 24 do eax[i]:=bity[i-16];
  SklecBajt(25);
  al:=bajt;
  al:=(al+cl) mod 256;
  NaBity(al);
  for i:=25 to 32 do eax[i]:=bity[i-24];
  Dec(CL);
  if CL>0 then goto 1;
  writeln;
  writeln;
  SklecBajt(1); w1:=bajt = $BC; writeln(bajt);
  if bajt=188 then
  Begin
    Sound(500);
    Delay(1000);
    nosound;
  End;
  SklecBajt(9); w2:=bajt = $D8; writeln(bajt);
  if bajt=200 then
  Begin
    Sound(500);
    Delay(1000);
    nosound;
  End;
  SklecBajt(17); w3:=bajt = $50; writeln(bajt);
  if bajt=93 then
  Begin
    Sound(500);
    Delay(1000);
    nosound;
  End;
  SklecBajt(25); w4:=bajt = $43; writeln(bajt);
  if bajt=67 then
  Begin
    Sound(500);
    Delay(1000);
    nosound;
  End;
  writeln;
  inc(ile);
  Readln;
Until ile=250;
  repeat until KeyPressed
end.

-------------------------------------tu ciac----------------------------------------------------
Juz chyba wiesz jaki jest kolejny znak. Jest nim "T"
Kolejnego znaku wam nie podam. Sposob jego generowania jest podobny jak w przypadku "T"
z tym wyjatkiem ze zamiast ROR jest ROL i jeszcze zamisat wyrazu bEAN jest FUCK.
Najlepiej jest przerobic wczesniejszy program.
To wy sobie przerabiajcie ten program a ja sie zajme dalsza analiza problemu.
Co macie klopoty?? No dobra powiem wam jaka to litera. Jest nia "O" ale jak chcecie sie
dowiedziec jak ja wygenerowalem to musicie sie troche zastanowic:))

Teraz nasz password ma taka forme "FADE TOxxxxxx"

00401199: 83C701                       add       edi,001 (1)
0040119C: 803720                       xor       b,[edi],020 (2) 
0040119F: 750F                         jne      .0004011B0   (3)

w linijce (1) jest zwiekszanie edi.
Ja mialem wpisany taki password FADE TO12345
Po dojciu do do linijki (1) wygladalo to tak :"12345"
W kolejnej linijce jest xor'owanie edi z 20 i jezeli 0 to skok z linijki(3) nie nastapi.
A wiec kolejny znak z naszego passwordu to spacja.
Czyli password po modyfikacji jest taki "FADE TO xxxxx"


004011A1: 83C701                       add       edi,001 (1)
004011A4: C10F0D                       ror       d,[edi],00D (2) 
004011A7: 81370A1A1262                 xor       d,[edi],062121A0A (3) 
004011AD: 7501                         jne      .0004011B0 (4)
   
Standardowo w linijce (1) jest ziwkszanie edi o 1 a w kolejnej edi jest przesuwane cyklicznie
o 13 w prawo. Wynik jest xor'owany z 062121A0A i jezeli 0 to skok z (4) nie nastapi.
Czyli co by tu zrobic aby w linijce (3) nam wyszlo 0. Zapiszmy sobie male rownanie.
"x" -oznacza litere ktorej nie znamy

 xxxxx ror 0D = 062121A0A
 xxxxx = 062121A0A rol 0D

Czemu tym razem rol a nie ror? A no dlatego ze rol jest operacja odwrotna do ror. 
Jest to tak samo jak z dodawaniem:

 a + b = c
 a = c - b

No to bierzemy sie do roboty!
Napiszmy sobie taki maly programik w asmie co nam to wszystko policzy.

----------------------------------------tu ciac-------------------------------------------------
Begin

   Asm
 mov ah,2       {numer funkcji DOS}
 mov al,62h     {tutaj jest pierwsza cyfra(hex) ktora trzeba uzyskac} 
 mov cl,0dh     {wkladanie do cl wartosci o ktora trzeba zrolowac}
 rol al,cl      {rolowanie}
 mov dl,al      {przepisanie zawartosci al do dl}
 int 21h        {Wywolanie przerwania DOS}  
   End;

Readln;
End.
----------------------------------------tu ciac-------------------------------------------------
Powinniscie otrzymac takie litery "B" "L" "A" "C"
Czyli nasz password ma forme "FADE TO BLACx"
Ale ciagle brakuje nam jednej cyferki. Ale i tak jezeli mamy zpatchowany program w miejscu gdzie
jest sparwdzana suma znakow i ich ilosc to i tak zobaczymy napis "Great work!".
Ostatni znak obliczcie w nastepujacy sposob:
848(suma znakow jaka mamy osiagnac[dec])-(suma znakow uzyskanych do tej pory)=znak ostatni.
Wy sobie liczcie co to za znak a ja napisze juz caly password.
 
                       ----------------------------------------
                       |             FADE TO BLACK            |
                       ----------------------------------------

I to by bylo na tyle. Wszelie uwagi kierowac pod adres mr_ketchup@poczta.onet.pl
Jezeli jednak ktos czegos nie rozumie to niech do mnie nie pisze. Wszystko wyjasnilem tak jak 
umialem najlepiej.

Nie zapomnijcie odpatchowac program. Albo po prostu podmiencie plik oryginalny z tym 
zpatchownnym.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=members of SeveN TeaM-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  Prezident:      MaxiBogas...........................founder/coder/cracker
  VizePrezident:  Plastek.............................founder/coder/cracker
  Seniors:
                  pawlos............................................cracker
                  Mr. Ketchup.......................................cracker 
                  Rusty.............................................cracker
  Division:
                  Jube........................................cracker/coder
                  {ATOM}....................................decoder/cracker
                  jamman............................................cracker
  Trial:
                  Pokropek..........................................cracker
                  lukasw............................................cracker
                  Dumboo............................................cracker
                  zoomek.....................................writer/cracker
  WebPage:
                  LIAR..............................webmaster/graphic/coder
                  _2000_.......................................server_admin

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-o t h e r s-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  Greets to : MGKiler, MaxiBogas, My dog, 
     groups : CrackPL, AAOCG, CookieCrk

  My e-mail: mr_ketchup@poczta.onet.pl
             ~~~~~~~~~~~~~~~~~~~~~~~~~
  SeveN TeaM - Official WebPage:  http://www.7team.z.pl
                                  ~~~~~~~~~~~~~~~~~~~~~
-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-