ALTE DOCUMENTE
|
||||||||||
Amikor gyorsabb törni mint keresni, célpontban a BrowseGate 2.46
avagy
Mi úriemberek vagyunk, és szeretjük a jogtiszta(nak látszó) progikat
Készítette: sniper [HPA]
e-mail: sniper.@iname.com
web: https://www.sniper-hu.com
Tartalomjegyzék:
1. Hozzávalók 1 személyre
2. Érdemes tudni (tutorban használtak)
3. Vágjunk a sürüjébe
4. A fáradtság jelei
5. Eredmény
6. Finál(lé:)
1. Hozzávalók 1 személyre
BrowseGate 2.46 (helyi proxy, web, ftp-szerver, stb.) Lelôhelye:
https://www.deksoftware.com Papír, toll, Softice, 2 napi hideg élelem,
1 láda sör. Olyan manuális munka, Lukundoo után szabadon :)
2. Érdemes tudni (tutorban használtak)
SoftIce (SI) címzése megegyezik a Hiew Decode módjának címzésével,
vagyis nincs szükség ofszetcímre egy kódrész megnézésére, csak annyit
kell tennünk, hogy ugrásnál (F5) írjunk a címünk elejére egy pontot
(SI-ben ?. 74 lekérdezésénél megkapjuk a 74. sor hexa címét). SI-ban
[szögletes zárójelbe] foglaltak értékeket jelentenek. Pl. MOV
ECX,[EAX] esetén ecx-be EAX értéke kerül, míg MOV ECX,AL felállásnál
ECX-be egy offset cím kerül, ahonnan elôveszi majd az értéket (AL a 32
bites EAX regiszter alsó 8 bites része). SoftIce Symbol Loader,
Initialization string-be írjuk be x;code on;WD 3;wc 12;fault off;
valamint ellenôrízzük le a dll-ek használatát (win-ice.dat fájlban a
kernel32, user32, gdi32.dll-eket tartalmazó sorok elôl töröljük a ';'
bejegyzést) és indítsuk újra. ?-jellel lekérhetünk számok, kifejezések
vagy regiszter (pl. EAX) értékének hexa, decimál, ill. ASCII
megfelelôjét. SI-ben beírt szám mindig hexadecimális, ha decimális
számot akarunk beírni, akkor írjunk elé egy + (pozitív dec. számnál)
elôjelet. Hexadecimális számokat a szám elé biggyesztett kis h-betüvel
vagy (SI-ban, C nyelvben és így a jávában is) 0x-el szokás
megkülönböztetni. A sorozatok, tömbök 0. elemmel kezdôdnek (pl. 11.
elem sorszáma 10)
3. Vágjunk a sürüjébe
Serial Number-nek (SN) írjuk be: 12345678, Avtivation Key-nek (KY)
pedig 1234567891234-et (töltsük maxra). Rögtön észrevesszük, hogy a SN
8 karakter hosszú, a key pedig 13 karakteres. Nyomjunk rá egy Okét,
hátha mázlink van :) Pech, ez nem jött össze, de kaptunk egy
messagebox-ot. Softice-ban kérjünk egy megszakítát (CTRL+D) bpx
messageboxa, F5 majd OK és a háttérbôl elôlibben SI. Rögtön üssük is
le (a sörösüveg helyett ;) F11-et majd a BrowsGate dumáját okézzuk le.
Ismét az SI-ban találjuk magunkat a hívás alatt egy sorral ( .445886
call messageboxa). Gördüljönk fel pársornyit a .445845 call-ra ér
rakjunk ide egy BPX-et (kétkatt' balgombbal vagy a soron állva F9) és
ismét futtassuk le a tesztet (F5, OK). SI-ben a call alatt találunk
3db összehasonlítást: 1* CMP DWORD PTR [BBP+FFFFF770],00
/SN-nulla, rossz Kapcsoljuk be d3-al SI ablakját (ha a tutor elejét
átugrottuk volna ;-) és nézzük meg a CMP, milyen értéket hasonlít
össze 0-val (jobb egérkatt és 'display') megcsodálhatjuk a Data
ablakban: Na..-t aminek a HEXA értéke 4E 61 BC 00 kérdezzük meg SI-t
mennyi ennek a decimális értéke: ?BC614E ami 12345678-al azaz SN-el
egyenlô. De mi van ha 0-la? akkor egy rossz címre, .445874-re ugrik,
és nem fogadja el. 2* CMP DWORD PTR [SN],E4E1C0 /SN>15000000, Ok
E41C0=15000000 ami szintén 8 karakter, vagyis ha tovább akarunk menni
akkor SN>15000000 feltételnek teljesülnie kell. Írjuk át a
termékszámunkat 15000000-ra majd ok és F10-el haladjunk tovább. 3* CMP
DWORD PTR [SN],E6685F /SN<15099999, Ok Töröljük bc 1 paranccsal (bl-el
kilistázhatjuk a BPX-eket) a call megszakítását és keressük meg a
következô hibaüzenet elôtti call-t (.4459D3) és lépjünk bele (F8).
Nyomuljunk tovább (F10).
420FC8 MOV DWORD PTR [EBP-10],00000000 /EBP-10-et nullázza
420FD1 MOV EAX, [EBP-10] /EBP-10 értékét (ciklusszám) EAX-be
teszi
420FD4 ADD EAX,01 /EAX-et növeli
420FD7 MOV [EBP-10],EAX /eltárolja EAX-et
420FDA CMP DWORD PTR [EBP-10],32
420FDE JGE 420FF9 /ha EBP-10 értéke >= h32-nél(50) ugrik
420FE0 MOVSX ECX,[EBP+8] /ECX a KY-re fog mutatni
420FE3 MOV EDX,BYTE PTR [ECX+3] /EDX-be KY4 karaktere kerül
(0-tól számolva 3.)
420FE7 MOV EAX,[EBP-10] /EAX-be ciklusszám
420FEA MOVSX ECX,BYTE PTR [EAX+4770B8] /ECX-be EAX+kódtábla kezdô címe
420FF1 CMP EDX,ECX /KY4 egyenlô-e a kódtábla aktuális betüjével
420FF3 JNZ 420FF7 /ha nem, közvetve ugrik 420FD1-re
420FF5 JMP 420FF9 /a kódtábla betüje egyezik KY 4.-al
420FF7 JMP 420FD1 /új ciklus (kódtábla következô betüje)
420FF9 CMP DWORD PTR [EBP-10],32 /ellenôrzi a ciklusok számát
120FFD JNZ 421007 /ha nem lépte túl a kódtáblát, akkor ugrik
tovább
Elôzô sorokban lecsekkelte hogy KY 4. betüje hányadik betüként
szerepel a kódtáblában EBP-10 értéke által mutatott címre. Kódtábla
(51 betübôl áll, és természetesen 0-val kezdi a számolást):
FJHInNTUdeLMabPQKcfghijkmGXRSuVvwDxyzABZoWYpqCErst
Most tudjuk milyen betük szerepelhetnek a Key-ben. Töltsük fel a
Activition Key-t 13db W-vel. Töröljük a Call-os bpx-et (bc, F9 vagy
duplakatt) és kérjünk egy megszakítást a ciklus végi CMP-re. Ez azért
jó, mert nem kell F10-el végig trészelni a betü kódtáblában való
keresését. Ez minden ciklusnál tegyük meg, és így elég egy ciklust
végignyomni F10-el, és utána F5-el a "végére" állunk. Következô
blokkban bekéri a Action Key 8. betüjét és megkeresi annak a kódtábla
szerinti értékét. Hasonlóan müködik mint az elôzô blokk, csak most nem
[EBP-10]-be, hanem [EBP-14]-be fogja eltárolni a KY 8. kódtábla
szerinti értékét.
42104C MOV EDX,[EBP-14] /KY8 értéke
42104F CMP EDX,[EBP-10] /KY4 értéke
421052 JLE 42105F /ugrik ha KY8 >= KY4 értékénél írjuk át a Key 8.
betüjét egyel nagyobbra értékü betüre(Y-ra), így nem ugrik tovább.
421054 MOV EAX,[EBP-14]
421057 SUB EAX,[EBP-10] /KY8-KY4 értéke
42105A MOV [EBP-14],EAX
42105D JMP 42106D
421070 MOV BYTE PTR [EDX],30 /nullát ír EDX által mutatott értékre
Nézzük meg EDX értékét (h70E4B8) és írjuk fel. Tovább haladva
láthatjuk hogy egymás után nullázza a bájtokat pontosan 8-at. Tehát
h70E4B8 fogja tárolni a betükbôl generált számokat.
Rakjunk a következô keresô ciklus (CMP [EBP-0C],32) végére egy BPX-et,
és nézzük meg a következô key betüt (ECX+4 azaz 5.) és üssünk F5-öt.
4210E3 MOV EAX,[EBP-0C] /KY5 értékét mozgatja EAX-be
4210E6 CMP EAX,[EBP-10]
4210E9 JLE 4210F9
Itt leellenôrizte hogy a KY5>=KY4-tôl, így a következô történik:
4210F9 MOV EDX,32
4210FE SUB EDX,[EBP-10] /EDX-bôl kivonja KY4 kódtáblában való értékét
421101 MOV EAX,[EBP-0C] /EAX-be berakja KY5 kódtáblás értékét
421104 LEA ECX,[EAX+EDX-1] /ECX-be KY5+KY4-1 érték kerül
421108 MOV [EBP-4],ECX /EBP-4 címére(#70DF48) eltárolja a
kiszámoltakat
***Nézzük meg, ha kisebb KY5(p) KY4-tôl:
4210EB MOV ECX,[EBP-0C]
4210EE SUB ECX,[EBP-10] /KY5 értékébôl kivonja KY4 értékét
4210F1 SUB ECX,1 /és még 1-et
4210F4 MOV [EBP-04],ECX /kapottat eltárolja [EBP-4]-re
42110B MOV EDX,[EBP-04]
42110B ADD EDX,30 /(KY5-K4Y-1)-hez+30
421111 MOV EAX,[EBP+0C]
421114 MOV [EAX+7],DL /EDX regiszter alsó 8 bites részét
eltárolja SN
8. számaként(1) azért 1 mert #31 vagyis 49 ASCII kódja 1
Következik a KY 6., mivel megin >= lett írjuk át E-re. Mostantól
mindig az elôzô szám táblázatbani értékébôl számítja ki a következô
key értékének megfelelô serial number-t ami most a 7. lesz(2) 3. KY
írjuk át E-re, ha megnézzük most is >= lett és a 6. szám ís a betü,
ami biztos hogy nem jó. Most számoljuk ki mikor lesz szám, .4210F9
alapján (hexában számolva): (KY3+(32-KY6)-1)+30 0+32-2E-1+30=33 ez
decimálisan 51 vagyis 3 lesz a 6. SN Következô KY a 9. ami az SN5 ért
felel majd KY12-SN4, KY10-SN3, KY13-SN2, KY1-SN1 Mivel értelmes számot
kell kapnunk, számoljunk tovább SN3-tól ami F volt melynek értéke 0 a
táblázatban, így biztos hogy a következô KY nagyobb lesz vagyis
.4210EB-tôl kell számolni: SN4=KY9-KY3-1+30 vagyis SN4 legyen 4, akkor
34=x-0-1+30 KY9=5 azaz a 6. betü a táblázatban (N) 35=KY12-5-1+30,
KY12=11 (M) SN3=0, SN2=5, SN1=1 nek kell lennie, vagyis K10 értéke K12
+1 lesz azaz 'a' betü ekkor ugyanis 0-át kapunk. Ebbôl adódik KY13
(SN2=5) sorsa is aminek +6-nak kell lennie (f) és K1(SN1=1)=h Írjuk be
eddigi munkánk gyümölcsét: SN=15054321, KY=hWFWpEWYNaWMf Gondolnánk
(rosszul :) hogy minden rendben, de akkor mire való a többi "szabadon
hagyott" kulcs. Ha minden jól ment akkor most a KY11 van soron
.4214BD-nél. Itt a szokásost müveli, csak most nem a serial
numberünket állítja elô, hanem mit? (Én már tudom, de te még nem
tudhatod ;-) fogalmam sincs. Nézzük meg a szokásos tároló részt:
4214F6 ADD EAX,32
4214F9 MOV ECX,[EBP+10]
4214FC MOV [ECX],AL /[ECX]=70E7CC, ide rakta le a generált számot
Ami most D bötü => nem szám :) tehát nem kóser. Kerüljön ide 1:
K11=h+2=j KY7 legyen 2: KY7=j+3=G KY2 legyen 3: KY2=G+4=u Vége a
kulcskészítésnek és visszatér a Call-ból .4459D8-hoz
Mostani serial számunk: 15054321, kulcsunk pedig: huFWpEGYNajMf Itt
még van egy W lógóba, amit rögvest használni is fogunk, tehát nem
dísznek van :-( Call után ezt tapasztaljuk:
4459DB CMP EAX,8
4459DE JZ /Jó megoldás
4459F2 Call messagebox /hiba
Ezek szerint pontosan 8-nak kell lenie EAX-ben
Most nézzük meg a visszatérés elôtti dolgokat:
4215EA MOV [EAX+2],DL /3. számot(3) eltárolja
4215ED MOV ECX,[EBP-0C]
4215F0 MOV [EBP-10],ECX
4215F3 MOV EAX,[EBP-14] /70DF38 értékét betölti EAX-be
Honnan kóborolt ide 1? a., Az elején volt két kulcs, amibôl nem
generált számot és használta EBP-14 értékét is. Valószínü innen jött.
b., Rögtön megtudjuk, ha megnézzük SI dataablakjába 70DF38-at(D
70DF38), miközben végigrohanunk az eddig kirakott megszakításokon.
Tehát a második megszakításnál KY8-at használja fel, és ezt tárolja
[EBP-14] által mutatott helyre. Így lett .42103E címnél (2.
megszakítás) 70DF38 értéke 2A majd kivonja EBP-10 értékét és
visszatárolja (a szövegben feljebb pontosan láthatjuk). A lényeg ez a
kivonás: KY8-KY4 értéke=W-j=2A-29=1-el. Nekünk 8-ra van szükségunk,
ezért KY8 értékét 2A-x=8 nak kell teljesülnie, ami hexa 22 vagyis 34
ami 'x'-nek felel meg.
4. A fáradtság jelei
Most már mindent megtudtunk, SN=15054321 KY=huFxpEGYNajMf és még
mindig nem megy.
445A26 CALL
445A2E TEST EAX,EAX /ff-van tele
445A30 JZ /ha nulla akkor jó
445A44 CALL messagebox /rossz
Vizsgáljuk meg mi van a call-ban. Így a vége felé legjobb volna egy
kis erjesztett lótej vagy egy hideg, dobozos sör :) A call-ban ezt
böngészhetjük:
45F5E0 MOV EAX,[EDX] /számunk
45F5E2 CMP AL,[ECX] /helyes szám
45F5E4 JNZ 45F614
Bingó! Persze az elôbb megváltozott a számunk is mivel (mindjárt kel a
nap:) KY4-et W-rôl x-re írtuk át az utolsó számunk is megváltozott, ez
már a fáradtság jele.
5. Eredmény
A jó szám: 15054328, a helyes kóddal: huFxpEGYNajMf Pötyögjük be és
ámuljunk azon, hogy milyen "értelmes" (értelmetlen) is voltam, hisz
sokkal gyorsabb lett volna feltörni ;) de mi Úriemberek vagyunk, és
szeretjük a jogtiszta(nak látszó) progokat! A prog' gratulál, jó
munkát végeztünk!
Újraindítás után -lôn világosság- a harmadik sorból kiderül mi is volt
az a fránya 3 darab szám 70E7CC-n. 123 felhasználóra van linceszünk,
úgyhogy lehet hálózatra kötni, de csak 123 felhasználóig, különben
balhé lesz ;-)
6. Finál(lé:)
Remélem sikerült a szokásostól eltérô (beírom, SI-ban kiolvasom)
kódgenerálást bemutatnom, és hasznosítható ötletekkel szolgálnom.
A'szem én meghagyom másnak a tutorial írás gyönyöreit (fôleg a
szenvedéseit;) Lukundoo edzett hadtársunknak valamint -remélem-
csapatban maradt SmArt barátunknak és a többi HPA tagnak, TI jÖTtöK!?
|