The Millenium Group trail keygenme1
23 stycznia 2oo2 @ 17:18

oke, oke, dzis bedzie o ... chyba widac w tytule ;). keygenme1 w porownaniu z #3, czy najnowsza #4 jest dziadowskie niczym moje tutoriale :). Widac jak zainteresowania tE! stopniowo ewoluuje w kierunku zaawansowanej matematyki/kryptografii - o ile z trojka mozna cos jeszcze wykombinowac, to w #4 koles nie zartuje :). Zaiste bogaty napisalem wstep.. mam nadzieje ze txt Wam sie spodoba.. ;)

W serialu, skaladajacym sie z cyfr i liter [a..z,A..Z] nie moze wystepowac dwa razy ten sam znak. No moze nie zupelnie, zdublowany znak zostaje wyzerowany tzn. na jego miejsce w buforze zostaje wpisane 0. 
Z name i grupy liczony jest domowym sposobem, 'hash' [2xDWORD], ktory nastepnie przechodzi przez procke 'rozszerzajaca'. Na podst. podanych argumentow, wypelnia ona 16-bajtowy bufor jakimis tam bajtami ;). Kazdy dword tegoz bufora jest zamieniany na wartosc z zakresu 0-3F. Dlaczego? Look et diz:                            

:004013E8      MOV       EBX,EAX
:004013EA      SHR       EBX,1         ;jakies
:004013EC      AND       EBX,55555555  ;cuda
:004013F2      SUB       EAX,EBX       ;dzikie weze :)
:004013F4      MOV       EBX,EAX       ;procka ma
:004013F6      SHR       EBX,02        ;na celu
:004013F9      AND       EAX,33333333  ;zmylenie przeciwnika
[....]
:00401421      AND       EBX,3F      ;tu !!!
:00401424      XOR       EAX,EBX     ;x=x^y
:00401426      XOR       EBX,EAX     ;y=y^(x^y)
:00401428      XOR       EAX,EBX     ;(x^y)^(y^(x^y) = y !

Ale zmyla :). Wszystkie w ten sposob otrzymane wartosci sa sklejane do kupy, np.: jesli wyszlo 00000001, 0000000F, 00000005 i 00000007, to nasza kupa bedzie sie rownac 010F0507 :). Nastepnie inicjowany jest koprocesor (yeah! ;) i dwordzik zostaje podniesiony do kwadratu. Z serialem dzieje sie dokladnie to samo z ta mala roznica ze przed sklejaniem do kupy, zostaje on zaszyfrowany w bardzo ciekawy sposob:

:004013D5      PUSH      ECX                               
:004013D6      PUSH      20       ;32 bity                          
:004013D8      XOR       EBX,EBX                            
:004013DA      POP       ECX                                
:004013DB      ROR       EAX,1    ;obroc w prawo o jeden bit                          
:004013DD      RCL       EBX,1    ;jesli cf=0, nic nie robi                          
:004013DF      DEC       ECX                                
:004013E0      JG        004013DB                           
:004013E2      MOV       EAX,EBX                            
:004013E4      POP       ECX                                
:004013E5      SHR       EAX,1    ;i jeszcze cos na koniec                          
:004013E7      RET              

Jakie wartosci przyjmuje carry flag po instrukcji ROR?
"Znacznik przeniesienia przyjmuje wartosc jaka mial najstarszy bit danej przed wykonaniem operacji rotacji." 
A jak dziala RCL?
"Instrukcja RCL powoduje przesuniecie w lewo wszystkich bitow argumentu. Najstarszy bit wpisywany jest do znacznika przeniesienia , a poprzednia wartoscia tego znacznika uzupelniany jest bit najmlodszy." - Turbo asembler, biblia uzytkownika, Gary Syck
Czyli bez problemu mozna odszyfrowac wynik! Ta procka tworzy 'mape' zapalonych bitow w innym rejestrze, np.
EAX=00010010001101000101011001111000
       |  |
       `------------------------,
          `------------------,  |
EBX=00011110011010100010110001001000
Nie mape tylko dokladna kopie, tyle ze od konca :). Wiec z tym nie ma problemu. Kiedy juz szyfrowanie sie dopelni, liczona jest kupa :). No a potem... 
F1 - funkcja liczaca zwykla kupe
F2 - funkcja liczaca niezwykla kupe ;)

F1(name+grupa)<<3^2 / F2(serial)>>1D = F2(serial)>>1D |*F2(serial)>>1D
F1(name+grupa)<<3^2 = F2(serial)>>1D^2                | pierwiastek
F1(name+grupa)<<3 = F2(serial)>>1D (1d+3=32)
F1(name+grupa) = F2(serial)

Czyli liczymy F1(name+grupa), wynik deszyfrujemy i mamy serial :). Problem moze byc tylko z procka generujaca wartosci 0-3F. btw., kiedys ubzduralem sobie ze kazda ilosc informacji mozna spakowac do jednego bajtu :). Oczywiscie jest to nieprawda. To tak jakby podporzadkowac kazdemu elementowi z nieskonczonego zbioru, element ze zbioru 256 elementowego.. ale niewazne. Wartosci zwracanej przez w/w procke nie da sie odszyfrowac, ale bez problemu mozna stablicowac dwordy ktore daja okreslony wynik! Tylko 40h dwordow moze dac *unikatowe* wyniki, reszta bedzie sie powtarzac.

ps
wlasnie ze nie :)
zeby tak zrobic, trzeba wybrac dwordy, w ktorych zaden znak sie nie powtarza! moje nieudolne proby mozna zobaczyc
w 'sitko.asm' :). wystarczy wylosowac sobie serial, sprawdzic pod katem znakow zdublowanych znakow, przepuscic przez
procke z crackme i wynik porownac z F2(name+grupa), jesli sie zgadzaja to mamy serial.

Ged_/CrackPL
ged@terrorysci.org