|
Mass Downloader v2.3.265 |
|
amois |
|
Program Tipi: Internet Utility |
|
Araçlar:
SoftICE |
|
|
|
|
Downloader
|
Yazı |
Aspack v1.08.04 ile korunmus. Unpack bolumunu pass gececegim. Bu firmanin
urunlerine ait gecerli serial numaralarini bulmak zor. Net’te genelde hep patch
dosyalari var. Benim ilgimi bu nedenle cekti aslinda. Register bolumune “amois_fb”
ve “1907” sallama degerleri girelim. OK demeden
once [bpx hmemcpy] -> [F5]
0167:0042F909 CALL
0043C560
0167:0042F90E POP ESI
<- Buradayiz
Birkac [F12] ile geriye dogru donecegiz.
0167:004FBBB3 CALL
00438908
0167:004FBBB8 LEA EDX,[EBP-08]
0167:004FBBBB MOV EAX,[EBX+000002F4]
...
0167:004FBBE8 CALL 0050C890
0167:004FBBED LEA EDX,[EBP-04]
0167:004FBBF0 MOV EAX,[EDI]
0167:004FBBF2 MOV ECX,[EBP-08]
<- [d ecx] -> “1907”
0167:004FBBF5 CALL 0051CFB4
<- kontrol
0167:004FBBFA TEST AL,AL
0167:004FBBFC JZ 004FBC8E
<- kotu cocuk
Ise yarar birseyler bulmak icin -> [bpx 4FBBF5] ->
[F8]
...
0167:0051D004 MOV EAX,[EBX]
<- [d eax] -> “amois_fb”
0167:0051D006 MOV EDX,0051D4E0
<- [d edx] -> “angus rod”
0167:0051D00B CALL 0040417C
0167:0051D010 JZ 0051D494
<- kotu cocuk
...
Bu bolumde girdigimiz UserName, sabit isimlerle karsilastiriliyor. Ayni iseler,
gecersiz UserName oluyor. [F10] ile devam edelim.
...
0167:0051D3EA MOV
EDX,0871DA7F
0167:0051D3EF MOV EAX,[EBP-0C]
<- [d eax] -> “Mass Downloader 1amois_fbSingle”
0167:0051D3F2 CALL 0051C194
...
Girdigimiz UserName, sabit bir string ile birlestirildi. [F10]
ile devam edelim.
...
0167:0051D431 MOV EAX,[EBP-10]
<- [d eax] -> “63477-547238881-RS”
0167:0051D434 CALL 0040406C
0167:0051D439 CMP EBX,EAX
0167:0051D43B JLE 0051D406
0167:0051D43D MOV EAX,[EBP-04]
<- [d eax] -> “1907”
0167:0051D440 MOV EDX,[EBP-10]
<- [d edx] -> “63477547238881RS“
0167:0051D443 CALL 0040417C
<- Esitler mi ?
0167:0051D448 SETZ BYTE PTR [EBP-05]
0167:0051D44C CMP BYTE PTR [EBP-05],00
0167:0051D450 JZ 0051D494
<- Kotu cocuk
0167:0051D452 MOV BYTE PTR [EBP-05],00
0167:0051D456 MOV EDX,0871DA7F
0167:0051D45B MOV EAX,[EBP-0C]
0167:0051D45E CALL 0051C194
0167:0051D463 LEA EDX,[EBP-14]
0167:0051D466 CALL 0051C218
0167:0051D46B MOV EAX,[EBP-14]
0167:0051D46E CALL 0051CEE4
0167:0051D473 MOV EDX,EAX
0167:0051D475 CMP EDX,-01
0167:0051D478 JZ 0051D494
0167:0051D47A MOV EBX,0000012A
<- tablodaki eleman sayisi = 298
0167:0051D47F MOV EAX,00557518
0167:0051D484 CMP
EDX,[EAX]
<- edx = 547238881
0167:0051D486 JNZ 0051D48E
0167:0051D488 MOV BYTE PTR [EBP-05],01
0167:0051D48C JMP 0051D494
0167:0051D48E ADD EAX,04
0167:0051D491 DEC EBX
0167:0051D492 JNZ 0051D484
Ilk basta, 51D431 de gecerli seriali buldugumuzu dusunuyoruz. Bu seriali girince
51D450 de JUMP yapmiyoruz. Fakat, biraz asagida, 51D486 da bir karsilastirma
daha var. Girilen serialin orta bolumu “547238881“,
298 kez [EAX] deki degerlerle karsilastiriliyor. Girdigimiz serialin gecerli
olabilmesi icin 51D450 ve 51D486 da JUMP yapmamamiz gerekiyor. Peki bu nasil
olabilir? Serialin orta bolumunu [EAX] e gore girersek 51D450 den yakalaniyoruz.
51D431 e gore girersek de 51D486 da yakalaniyoruz. Bunun anlami su, oyle bir
UserName varki, buna gore olusan serialin orta bolumu, sabit olan tabloda var.
Bunu saglayan UserName bulunursa hersey yolunda gidecek.
UserName’in sonuna birseyler ekleyerek sansimizi deneyebiliriz. Eklenecek
karakterlerin harf olma olasiligi dusuk. Cunku, ortaya garip UserName ler
cikabilir. Eklenecek karakterlerin rakam olma olasiliklari daha yuksek. Ayrica,
hem rakam hem de harf kombinasyonlari da olabilir. Secimimizi rakamlardan yana
kullanacagiz. Aslinda baska birsey de elimizden gelmez. Harfler de isin icine
girerse, gecerli UserName bulma olasiligimiz dusuk olacaktir. Peki kac tane
rakam ekleyecegiz ? Baslangic olarak Max. 5 secelim. Yapmamiz gerekenler ;
1- “547238881“ in nasil hesaplandigini bulmak.
2- “Mass Downloader 1“ ve “Single“
kelimelerinin arasina girecek olan UserName’in sonuna 0 dan baslayip 99999 a
kadar olan rakamlari eklemek.
3- Olusan yeni UserName’e gore, serialin orta bolumunu hesaplamak.
4- Cikan degeri tablodakilerle karsilastirmak.
Oncelikle 4AC uzunlugundaki sabit tabloyu 51D484 de iken IceDump yardimiyla bir
dosyaya Dump edelim. [bpx 51D3F2] -> [F8]
...
0167:0051C1C3 MOV ECX,00000001
<- ecx = 1, ebx = 871DA7F durumunda
0167:0051C1C8 MOV EAX,[EBP-04]
<- [d eax] -> “Mass Downloader 1amois_fbSingle”
0167:0051C1CB MOVZX EAX,BYTE PTR [ECX+EAX-01] <- eax = M a s s
D o w n ...
0167:0051C1D0 SHL EBX,04
0167:0051C1D3 ADD EAX,EBX
0167:0051C1D5 MOV EBX,EAX
0167:0051C1D7 MOV EAX,EBX
0167:0051C1D9 AND EAX,F0000000
0167:0051C1DE TEST EAX,EAX
0167:0051C1E0 JZ 0051C1E9
0167:0051C1E2 MOV ESI,EAX
0167:0051C1E4 SHR ESI,18
0167:0051C1E7 XOR EBX,ESI
0167:0051C1E9 NOT EAX
0167:0051C1EB AND EBX,EAX
0167:0051C1ED INC ECX
0167:0051C1EE DEC EDX
0167:0051C1EF JNZ 0051C1C8
0167:0051C1F1 XOR EAX,EAX
<- ebx = B502765
51C1C8 ile 51C1EF arasindaki dongu sonucunda ebx = B502765
olarak hesaplandi. Aradigimiz bu degil. Ama, buyuk ihtimalle bu sayi birtakim
islemlerden gecip “547238881“ haline gelecek. [F10]
ile devam edelim.
...
0167:0051D3F7 LEA EDX,[EBP-10]
0167:0051D3FA CALL 0051C218
<- Hesaplamalar oluyor
[bpx 51D3FA] -> [F8]
-> Niye buraya giriyoruz ? Cunku cagri oncesinde eax =
B502765.
...
0167:0051C282 MOV EAX,EBX
0167:0051C284 MOV ECX,00000007
0167:0051C289 XOR EDX,EDX
0167:0051C28B DIV ECX
0167:0051C28D ADD EDX,32
<- edx = 7 7 4 3 6
0167:0051C290 LEA EAX,[EBP-10]
0167:0051C293 CALL 00403F94
0167:0051C298 MOV EDX,[EBP-10]
0167:0051C29B LEA EAX,[EBP-08]
0167:0051C29E MOV ECX,[EBP-08]
0167:0051C2A1 CALL 004040B8
0167:0051C2A6 MOV EAX,EBX
0167:0051C2A8 MOV ECX,00000007
0167:0051C2AD XOR EDX,EDX
0167:0051C2AF DIV ECX
0167:0051C2B1 MOV EBX,EAX
0167:0051C2B3 TEST EBX,EBX
0167:0051C2B5 JNZ 0051C282
Bu dongude serialin ilk bolumu olan “63477“
hesaplaniyor. [F10] ile devam edelim.
...
0167:0051C2D5 MOV EAX,EBX
0167:0051C2D7 MOV ECX,00000009
0167:0051C2DC XOR EDX,EDX
0167:0051C2DE DIV ECX
0167:0051C2E0 ADD EDX,31
<- edx = 1 8 8 8 3 2 7 4 5
0167:0051C2E3 LEA EAX,[EBP-14]
0167:0051C2E6 CALL 00403F94
0167:0051C2EB MOV EDX,[EBP-14]
0167:0051C2EE LEA EAX,[EBP-08]
0167:0051C2F1 MOV ECX,[EBP-08]
0167:0051C2F4 CALL 004040B8
0167:0051C2F9 MOV EAX,EBX
0167:0051C2FB MOV ECX,00000009
0167:0051C300 XOR EDX,EDX
0167:0051C302 DIV ECX
0167:0051C304 MOV EBX,EAX
0167:0051C306 TEST EBX,EBX
0167:0051C308 JNZ 0051C2D5
Bu dongude de aradigimiz deger hesaplaniyor. Dongu baslangicinda
ebx = B502765.
Artik, serialin orta bolumunun nasil hesaplandigini biliyoruz. Ufak ufak
Brute-Force calismalarimizi baslatalim. Asagida
MASM32 de yazdigim Code’u aciklamaya calistim. Kesinlikle daha guzel ve kisa
olarak yazilabilir. ASM de deneyimli degilim. Brute-Force’u hazirlarken bircok
MASM32 fonksiyonunu da ogrendim. Eger, gercekten birseyler ogrenmek
istiyorsaniz, asagidaki Code’u kendinize gore uyarlamaya calisin.
.data
isim1 db "Mass Downloader 1amois_fb",0
; User Name’in ilk bolumu
isim3 db "Single",0
; User Name’in ucuncu bolumu
isim2 db 32h dup(?)
; User Name’in ikinci bolumu, henuz bos
cop db 32h dup(?)
; bunlar deger transferlerinde
cop2 db 32h dup(?)
; kullanilmak uzere ayrilmis alanlar
cop3 dd 0h
sonuc db 32h dup(?)
gecici db 32h dup(?)
isim db 32h dup(?)
sayac dd 0h
tablo db "29930900C24B0D00F2732300A7FC2B00A03B3A00092A4B00"
; Dump ettigimiz tablo
db
"06D95F0000647700FA969700C64648018F7A4801E6CE6801"
...
db
"E4478E2AAB97C92A3BECD32A883A0B2BA2C3132BD1E1482B"
db
"4C3B682BE7506C2B0B706F2B67DF722B0E04810300000000",0
.code
start:
@basla:
invoke szCatStr, offset isim, offset isim1
; isim = isim + isim1
invoke szCatStr, offset isim, offset isim2
; isim = isim + isim2
invoke szCatStr, offset isim, offset isim3
; isim = isim + isim3
invoke lnstr, offset isim
; isim uzunlugu eax'de
mov edx, eax
mov ecx, 01
mov ebx, 0871DA7Fh
; yukarida gordugumuz sabit bir sayi
@dongu:
mov eax, offset isim
; bu bolum orjinal programdan alinma
movzx eax, byte ptr [ecx+eax-01]
shl ebx, 04
add eax, ebx
mov ebx, eax
mov eax, ebx
and eax, 0F0000000h
test eax, eax
jz @git
mov esi, eax
shr esi, 18h
xor ebx, esi
@git:
not eax
and ebx, eax
inc ecx
dec edx
jnz @dongu
; dongu sonunda ebx = B502765
@bolum2:
mov eax, ebx
; orjinal programdan alinma
mov ecx, 09h
xor edx, edx
div ecx
add edx, 31h
; 1 8 8 8 3 2 7 4 5
mov ebx, eax
mov ecx, offset gecici
mov [ecx], edx
; olusan rakamlar gecici olarak saklandi
invoke szCatStr, offset sonuc, offset gecici
; karakterler birbirine ekleniyor
test ebx, ebx
; 1 18 188 1888 18883 188832 1888327 ...
jnz @bolum2
invoke revstr, offset sonuc, offset gecici
; sonuc’daki karakterler ters cevriliyor
invoke atodw, offset gecici
; 547238881 double word’e cevriliyor.
jmp @kontrol
; sonuc tablo da mevcut mu ?
@yaz:
mov edx, offset isim2
; UserName’in sonuna eklenecek deger
invoke MessageBoxA, 0, edx, edx, 0
invoke ExitProcess,0
@sayacart:
invoke MemCopy, offset cop, offset isim, 32
; gecici bolgeleri zero byte ile doldur
invoke MemCopy, offset cop, offset sonuc, 32
; szCatStr, revstr, lnstr fonksiyonlari
invoke MemCopy, offset cop, offset gecici, 32
; zero terminated string ile calisiyor
inc sayac
; sayac artiyor
mov eax, dword ptr sayac
cmp eax, 01869Fh
; sayac 99999 oldu mu ?
jz @yaz
; :( gecerli UserName bulamadik, cikis
invoke dwtoa, eax, offset isim2
; sayac’in degerini ASCII ye cevirip
jmp @basla
; isim2 bolgesine koy
@kontrol:
mov ebx, offset tablo
mov cop3, eax ; sonuc cop3 de
@kdongu:
invoke MemCopy, ebx, offset cop, 8
; tablonun ilk sayisini cop’e koy
invoke htodw, offset cop
; bu HEX sayiyi double word’e cevir
mov edx, offset cop
; ornek, tablodaki ilk sayi 29930900
mov dword ptr [edx], eax
; ama bu 00099329 seklinde olmali
mov al, byte ptr [edx+3]
; bu bolum ters cevirme islemi icin
mov ah, byte ptr [edx+2]
; MASM32 Library ile bunu direkt yapamadim
mov cl, byte ptr [edx+1]
; Manual yapmak durumunda kaldim
mov ch, byte ptr [edx]
mov byte ptr [edx], al
mov byte ptr [edx+1], ah
mov byte ptr [edx+2], cl
mov byte ptr [edx+3], ch
mov eax, dword ptr [edx]
; eax = 00099329 oldu
cmp eax, 0h
; tablo’nun sonu geldi mi ?
jz @sayacart
; bulamadik, sayaci artir
cmp cop3, eax
; sonuc’la karsilastir
jz @yaz
; :) UserName’e eklenecek sayiyi yaz
add ebx, 08
; tablodaki bir sonraki sayiya gec
jmp @kdongu
; tablo’da ilerlemeye devam et
end start
Kisa bir sure sonra sonuc -> 1346? -> UserName ->
amois_fb1346?
SONUC :
Bu yazida neler ogrendik? Kabaca Brute-Force’un nasil yazildigini, MASM32
Library’e ait bazi onemli fonksiyonlari vb.. Brute-Force teknigi gelistirilerek
Generic bir hale getirilebilir. Ornegin, harf ve rakamdan olusan karakter
dizisini sirali ureten bir rutin yazilirsa, her program icin kullanilabilir.
Basamak sayisini artirdigimizda gecen zaman katlanarak artacaktir. Bu nedenle,
fazla abartmadan kullanmak gerekir.
Firmanin diger programlari icin de ayni yontem gecerlidir. Sadece, Dump etmeniz
gereken tablo ve 0871DA7F sabit sayisi degismektedir. Firmanin diger bir urunu
AutoDialogs 1.3 Service Pack 2 icin, Brute-Force sinirini 6 basamak icin 999999
olarak belirlememiz gerekiyor.
|
|
Bir programı kullanarak para kazanıyorsanız, programı satın alın.