|
Adres Bank v4.02 |
|
amois |
|
Program Tipi: Utility |
|
Araçlar:
SoftICE |
|
|
|
|
"Yenilsen de yensen de, taraftarin seninle. Iyi gunde, kotu gunde, seninle birlikte."
|
Yazı |
Acilistaki nag screende, bir urun numarasi cikiyor. Programin icinden
Registration bolumu yok. Key File veya Registry korumasi var. RegMon ile takip
ettigimizde,
HKLM\SOFTWARE\Siberya\AdresBank\ClassID SUCCESS "36B2760B1340079B"
<- Urun No
HKLM\SOFTWARE\Siberya\AdresBank\ClassNo NOTFOUND
<- ??
Bu bolume sallama serial olarak “1907” giriyoruz.
Artik programin bu bolumden data aldigi yeri bulmak gerekiyor. Cesitli yontemler
mevcut. Registry icin mevcut breakpointler kullanilabilir. Veya, trace sirasinda
memory'de urun no search ettirilebilir. Yani, search sonuccuz kaliyorsa, henuz
program bu datayi okumamis demektir. Hangi CALL dan sonra oldugunu sirasiyla
bulmak gerekir. Daha sonra, yukaridan asagiya inerek gercek dongu bulunabilir.
Veya, nag screen ipucu olarak kullanilabilir. Nag’in ciktigi cagridan geriye
donuk bir inceleme yapilabilir.
QueryValueEx
HKLM\SOFTWARE\Siberya\AdresBank\ClassID
<- API
Breakpoint olarak RegQueryValueExA kullanacagiz.
[bpx
RegQueryValueExA IF *(esp->4)==’Clas’
DO “D esp->14;”
Registry'de “Clas” ile baslayan bir adresten data
okundugu sirada breakpoint calisacak. Bizde ise, ClassID
ve ClassNo olmak uzere iki bolum var. RegMon’a gore
“1907” nin okundugu bolum 6.inci QueryValueEx
API’si. Bu nedenle 6.inci breakpointten sonra [F12]
0167:006CEA63
CALL ADVAPI32!RegQueryValueExA
0167:006CEA68 TEST EAX,EAX
<- Buradayiz
Su anda siberya.dll dosyasindayiz. Data window’da
016F:01851858
31 39 30 37 00 00 00 00-00 00 00 00 00 00 00 00 1907............
sallama seriali gorebiliyoruz. Artik bu noktadan itibaren kodu trace edecegiz.
Memory kontrolune dikkat etmeyi unutmuyoruz. Birazcik [F10]
takibi ve,
...
0167:006D0115 MOV EAX,[EBP-18] <- 36B2760B1340079B
0167:006D0118 MOV EDX,[EBP-20] <- 1907
0167:006D011B CALL 00693D88
Bu iki deger bazi dongulere giriyor. Buyuk ihtimal
Memory’de baska bolumlere kopyalaniyorlar veya benzeri islemler. [F10]
ile devam,
...
0167:006D022A MOV EDX,[EBP-50]
<- Bu da ne ?
0167:006D022D LEA EAX,[EBP-28]
0167:006D0230 CALL 00693A90
6D022A’da iken [d edx] ->
016F:018519DC
36 44 58 30 48 52 56 39-00 00 00 00 00 00 00 00 6DX0HRV9........
Sazan gibi atlayip, “1907” degerini “6DX0HRV9”
veya "3644583048525639" ile degistirmemiz sonucsuz
kalacak :(. [F10] ile devam edelim bakalim.
0167:006D021F
LEA EDX,[EBP-50]
0167:006D0222 MOV EAX,[EBP-28]
<- 36 B2 76 0B 13 40 07 9B
0167:006D0225 CALL 006CF7A8
0167:006D022A MOV EDX,[EBP-50]
0167:006D022D LEA EAX,[EBP-28]
0167:006D0230 CALL 00693A90
0167:006D0235 LEA EDX,[EBP-54]
0167:006D0238 MOV EAX,[EBP-1C]
<- 36 B2 76 0B 13 40 07 9B
0167:006D023B CALL 006CF7A8
0167:006D0240 MOV EDX,[EBP-54]
<- 6DX0HRV9
0167:006D0243 LEA EAX,[EBP-1C]
0167:006D0246 CALL 00693A90
0167:006D024B SHR DWORD PTR [006D2820],02
0167:006D0252 LEA EDX,[EBP-58]
0167:006D0255 MOV EAX,[EBP-24]
<- 19 07
0167:006D0258 CALL 006CF7A8
0167:006D025D MOV EDX,[EBP-58]
<- 19 47
0167:006D0260 LEA EAX,[EBP-24]
0167:006D0263 CALL 00693A90
0167:006D0268 MOV EAX,[EBP-1C]
<- 6DX0HRV9
0167:006D026B MOV EDX,[EBP-24]
<- 19 47
0167:006D026E CALL 00693D88
<- ?
0167:006D0273 JNZ 006D0296
Artik algoritmanin merkezindeyiz. Oncelikle 6D026E’deki cagri ilgimizi cekiyor.
2 deger push edilip 6D0273 de kontrol ediliyor. Manual olarak 6D026B’de iken
[ebp-24] bolgesini [ebp-1c] ye esitlememiz sonucsuz kaliyor. Peki, 6D0258’deki
cagri “1907” olan sallama seriali alip “19 47” sonucunu nasil veriyor ? Ayrica,
6D023B’deki cagri urun no’yu alip nasil 6DX0HRV9 degerini veriyor ? Veya bu
deger nedir, ne ise yarar ? Goruldugu gibi su an cevapsiz bircok soru var. Ilk
olarak gecerli serial bulmaya calismamiz en dogrusu. CALL 6CF7A8 cagrisi, bu
bolumde 3 kez cagrildigi icin kritik bir noktada duruyor. Oncelikle “1907” nin
nasil degistigini bulmaya calisalim. [bpx 6D0258]
-> [F8]
...
0167:006CF4CE MOV BYTE PTR [EBP-0D],01
0167:006CF4D2 LEA EAX,[EBP-14]
0167:006CF4D5 XOR EDX,EDX
0167:006CF4D7 MOV DL,[EBP-0D]
0167:006CF4DA MOV ECX,[EBP-04]
0167:006CF4DD MOV DL,[EDX+ECX-01]
<- 19, 07
0167:006CF4E1 MOV ECX,[EBP-08]
<- FC, 40734D
0167:006CF4E4 SHR ECX,10
<- 00, 40
0167:006CF4E7 XOR DL,CL
<- 19, 47
0167:006CF4E9 CALL 00693BA0
0167:006CF4EE MOV EDX,[EBP-14]
0167:006CF4F1 MOV EAX,[EBP+08]
0167:006CF4F4 CALL 00693C80
0167:006CF4F9 MOV EAX,[EBP+08]
0167:006CF4FC XOR EAX,EAX
0167:006CF4FE MOV AL,[EBP-0D]
0167:006CF501 MOV EDX,[EBP-04]
0167:006CF504 MOVZX EAX,BYTE PTR [EAX+EDX-01]
<- 19, 07
0167:006CF509 ADD EAX,[EBP-08]
<- [ebp-08]= FC, 40734D
0167:006CF50C IMUL DWORD PTR [EBP-0C]
<- [ebp-0c]= 3B1B
0167:006CF50F ADD EAX,[EBP+0C]
<- [ebp+0c]= 7F16
0167:006CF512 MOV [EBP-08],EAX
<- 40734D
0167:006CF515 INC BYTE PTR [EBP-0D]
0167:006CF518 DEC BYTE PTR [EBP-0E]
0167:006CF51B JNZ 006CF4D2
Burada bir dongu var. 6CF4E7 de DL degeri, 1.turda 19, 2.turda 47 degerini aldi.
Benim gorusum su sekilde oldu; 6D026E deki cagriya dayanarak, girmemiz gereken
serial yukaridaki dongu sonucu “6DX0HRV9”, yani 36 44 58 30 48 52 56 39 degerini
almali. O zaman buyurun Brute-Force’a ->
.data
hedef db 036h,044h,058h,030h,048h,052h,056h,039h,0
; bulmamiz gereken
sonuc db 32h dup(?)
; serial buraya
sabit_1 dd 03b1bh
; orjinal programdan
sabit_2 dd 07f16h
; orjinal programdan
degis_1 dd 0fch
; orjinal programdan
sayac_2 dd 0h
sayac_3 dd 0h
.code
start:
@dongu:
mov edx, sayac_3
; Brute-Force icin 00’dan basliyoruz
mov ecx, degis_1
; ilk basta FCh degeri olmali
shr ecx, 10h
; orjinal programdan
xor dl, cl
; orjinal programdan
lea eax, hedef
; hedef’in offset degeri
add eax, sayac_2
; 1 byte al, 36 44 58 30 48 52 56 39
cmp dl, byte ptr [eax]
; esitler mi
je @ayar
; o zaman sonuc’a yaz
inc sayac_3
; sayac_3 1 artir
jmp @dongu
; yeniden dene
@ayar:
mov eax, sayac_3
; gecerli serial sayac_3’da
lea esi, sonuc
; sonucu yazacagimiz bolumun offset degeri
add esi, sayac_2
; her dongude 1 ileri git
mov byte ptr [esi], al
; serilali byte olarak koy
mov eax, sayac_3
; gecerli serial byte olarak eax’de
add eax, degis_1
; orjinal programdan
imul sabit_1
; orjinal programdan
add eax, sabit_2
; orjinal programdan
mov degis_1, eax
; orjinal programdan
inc sayac_2
;
cmp sayac_2, 08h
; hedef uzunlugunu gectik mi ?
mov sayac_3, 0
; sayac_3 u sifirla
jne @dongu
; kalan byte lari bulmaya devam et
Brute-Force sonucu, “36 03 46 D0 3B 56 EE 33” degerini bulduk. Registry’den
ClassNo bolumunu degistirince “Kayitli kullanici” oluverdik. Boylece, KeyGen
algoritmasinin 1.bolumu tamamlanmis oldu.
Peki, urun numarasi “36 B2 76 0B 13 40 07 9B” ile, hedef degerimiz “36 44 58 30
48 52 56 39” arasindaki iliski nasil?
[bpx 6D023B] -> [F8]
Birazcik [F10] takibi sonucu, yine Brute-Force’da
kullandigimiz donguye geldik. Sadece, baslangic degerimiz olan
FCh degiserek
3F2h olmus. Kalan sabit degerler degismemis.
.data
kaynak db 036h,0b2h,076h,0bh,013h,040h,07h,09bh,0
sonuc db 32h dup(?)
tur db "%X",0
sabit_1 dd 03b1bh
sabit_2 dd 07f16h
degis_1 dd 03f2h
sayac dd 0h
.code
start:
@dongu:
lea esi, kaynak
; 36 B2 76 0B 13 40 07 9B <- urun no
add esi, sayac
movzx edx, byte ptr [esi]
mov ecx, degis_1
; baslarken 3F2h
shr ecx, 10h
xor dl, cl
; 36 44 58 30 48 52 56 39
lea edi, sonuc
; sonucu buraya yazacagiz
add edi, sayac
mov byte ptr [edi], dl
movzx eax, byte ptr [esi]
; 36 B2 76 0B 13 40 07 9B
add eax, degis_1
imul sabit_1
add eax, sabit_2
mov degis_1, eax
inc sayac
cmp sayac, 08h
; kaynak uzunlugunu gectik mi ?
jne @dongu
; devam et
Dongu sonucunda “6DX0HRV9” yani “36 44 58 30 48 52 56 39” degerleri olustu.
Bu iki bolumun birlestirilmesi isini size birakiyorum. Full olarak KeyGen source
vermek dogru olmaz.
Program sahibi icin de bir cift lafim olacak. "Makinemde SoftIce yuklu
olmasi, size sorgusuz sualsiz makineyi OFF durumuna getirme hakkini vermez. Siz
kim oluyorsunuz da bu hakki kendinizde goruyorsunuz ? Arka planda calisan
uygulamalarim ne olacak? Makineyi direkt olarak OFF yapmak yerine, bir
uyari mesaji verebilirdiniz. Kaldi ki bu da dogru bir davranis olmaz. Makinemde
istedigim programi calistirma hakkima karisamazsiniz. Karistiniz da ne oldu
sanki ? Buyrun, KeyGen algoritmasi yukarida.
Hicbir zaman direkt olarak kullanilabilecek dosya / serial vermedim /
vermeyecegim. Yukaridaki KeyGen source’unu cok daha kullanisli ve genel bir
halde de verebilirdim. Fakat, amacim bu degil. Ben, kullandiginiz algoritmayi
cozerken zevk aldim dogrusu. Butun olarak bakildiginda, fena bir algoritma degil.
Yeni versiyonda, AntiSoftIce bolumlerini kaldirmaniz veya Computer OFF yapmak
yerine uyari mesaji verdirmeniz daha “fair” bir davranis olacaktir."
|
|
Bir programı kullanarak para kazanıyorsanız, programı satın alın.