|
Caller ID Monitor v1.5 |
|
amois |
|
Program Tipi: Modem Utility |
|
Araçlar:
SoftICE |
|
|
|
|
"Yenilsen de yensen de, taraftarin seninle. Iyi gunde, kotu gunde, seninle birlikte."
|
Yazı |
Verilen bir serial number icin User name ve Key istiyor. Bende cikan numara “41DDB813”.
Sallama degerler olarak, “amois” ve “19071907”
degerlerini girelim. [bpx hmemcpy] -> birkac [F12]
den sonra;
0167:0047854A
CALL 0042E4E4
0167:0047854F PUSH DWORD PTR [EBP-10]
<- buradayiz
0167:00478552 LEA EDX,[EBP-14]
...
[F10]
ile memory kontrol esliginde ilerleyelim.
...
0167:0047861A MOV EAX,[EBP-38]
<- amois
0167:0047861D MOV ECX,00478908
<- Caller ID...
0167:00478622 POP EDX <- 41DDB813
0167:00478623 CALL 004755D0
<- Bu da ne ?
0167:00478628 MOV EDX,[EBP-30]
<- ?
0167:0047862B MOV EAX,[EBP-08]
<- 19071907
0167:0047862E CALL 00477B74
<- esitler mi ?
0167:00478633 TEST AL,AL
0167:00478635 JZ 00478808
<- iyi cocuk
Gordugunuz gibi gecerli seriali bulmak cok kolay. Ama, KeyGen algoritmasi o
kadar da kolay degil. [bpx 478623] -> [F8]
...
0167:00475648 MOV EDX,[EBP+08]
0167:0047564B MOV EAX,[EBP-10]
<- ?
0167:0047564E CALL 00475684
[F10] ile memory kontrolu yaparak ilerleyip
47564B’ye gelince, [d eax] ile ->
016F:017096F8
61 6D 6F 69 73 34 31 44-44 42 38 31 33 43 61 6C
amois41DDB813Cal
016F:01709708 6C 65 72 49 44 20 4D 6F-6E 69 74 6F 72 20 31 2E
lerID Monitor 1.
016F:01709718 35 20 28 45 6E 67 6C 69-73 68 29 31 2E 35 74 22
5 (English)1.5t"
016F:01709728 24 4D 42 32 65 53 00 00-78 74 4B 00 78 74 4B 00 $MB2eS..xtK.xtK.
User name, serial number ve program adi birlesmis durumdalar. Normal sartlarda,
bu bolumden data okuyan bir donguye girmemiz gerekir. [F10]
ile devam.
...
0167:004756BB MOV ESI,00000001
0167:004756C0 MOV EDX,[EBP-04]
<- birlesmis data
0167:004756C3 MOV DL,[ESI+EDX-01]
<- 61 6D 6F 69 73 35 34 ...
0167:004756C7 XOR DL,BL
0167:004756C9 AND EDX,000000FF
0167:004756CF MOV EDX,[EDX*4+004B4F0C]
<- tablo
0167:004756D6 SHR EBX,08
0167:004756D9 AND EBX,00FFFFFF
0167:004756DF XOR EDX,EBX
0167:004756E1 MOV EBX,EDX
0167:004756E3 INC ESI
0167:004756E4 DEC EAX
0167:004756E5 JNZ 004756C0
Buradaki dongu sonucunda ebx gecerli serial degerini aldi. 4756CF’den
goreceginiz uzere, dump etmemiz gereken bir tablo var. 4756C9’a gore edx max. FF
degerini alabileceginden, tablo buyuklugu = edx*4 = FF*4 =
3FC olacak.
Su ana kadar hersey siradan bir algoritma gibi gorunuyor. Fakat, donguyu takip
ederseniz, isleme giren bolum biraz ilginc.
016F:017096F8
61 6D 6F 69 73 34 31 44-44 42
38 31 33 43 61 6C
amois41DDB813Cal
016F:01709708 6C 65 72 49 44 20 4D 6F-6E 69 74 6F 72 20 31
2E lerID Monitor 1.
016F:01709718 35 20 28 45 6E 67 6C 69-73 68 29 31 2E 35
74 22 5 (English)1.5t"
016F:01709728 24 4D 42 32 65 53 00 00-78 74
4B 00 78 74 4B 00 $MB2eS..xtK.xtK.
Parametrelerin birlesmis hallerinin sonuna gelen bir bolum var. Ilk basta, bu
bolumu sabit diye dusunuyoruz. Fakat, User name degisince, bu eklenen 8 byte’lik
bolum de degisiyor. Ayrica, hafizadaki serial number’i manual degistirirsek de
degisiyor. Demek ki, hem User name’e hem de serial number’a bagli olan bir
deger. Zaten, KeyGen’in kazik olmasina da bu sebep oluyor.
Peki, bu 8 byte’lik degeri ureten bolumu nasil bulacagiz ? Ipucu olarak, “amois”
ve “41DDB813” degerlerimiz var ve bunlarin bir
cagri oncesinde PUSH edilmelerini kontrol edecegiz. Bu degerlerin memory’deki
yerlerine breakpoint koyarak da sonuca gidilebilir.
0167:004754AF
XOR ESI,ESI
0167:004754B1 MOV EAX,[EBP-04]
<- 3 kez ugruyor
0167:004754B4 MOV AL,[ESI+EAX]
<- karakterler aliniyor
0167:004754B7 CMP AL,20
0167:004754B9 JB 0047555F
0167:004754BF CMP AL,7E
0167:004754C1 JA 0047555F
0167:004754C7 MOV EDX,[004B7920]
<- bu bolum ilk basta bos
0167:004754CD AND EDX,1FFFFFFF
<- cesitli islemler
0167:004754D3 MOV ECX,[004B7920]
0167:004754D9 SHR ECX,1D
0167:004754DC AND ECX,31
0167:004754DF XOR EDX,ECX
0167:004754E1 MOV [004B7920],EDX
0167:004754E7 MOV [EBP-09],AL
0167:004754EA MOV EAX,[004B7920]
0167:004754EF MOV ECX,0000005F
0167:004754F4 CDQ
0167:004754F5 IDIV ECX
0167:004754F7 XOR EDX,EDX
0167:004754F9 MOV DL,[EBP-09]
0167:004754FC SUB EDX,20
0167:004754FF SUB EAX,EDX
0167:00475501 CALL 00475590
<- matematiksel birkac islem
0167:00475506 MOV EBX,EAX
0167:00475508 ADD BL,20
<- BL’deki degerler onemli
0167:0047550B INC DWORD PTR [004B7924]
0167:00475511 CMP DWORD PTR [004B7924],00005179
0167:0047551B JL 00475524
0167:0047551D XOR EAX,EAX
0167:0047551F MOV [004B7924],EAX
0167:00475524 MOV AL,[EBP-09]
0167:00475527 XOR AL,BL
0167:00475529 AND EAX,000000FF
0167:0047552E MOV EDX,[004B7920]
0167:00475534 ADD EDX,[004B7920]
0167:0047553A ADD EAX,EDX
0167:0047553C ADD EAX,[004B7924]
0167:00475542 MOV [004B7920],EAX
0167:00475547 LEA EAX,[EBP-14]
0167:0047554A MOV EDX,EBX
0167:0047554C CALL 00403D50
<- memory islemleri, cok da onemli degil
0167:00475551 MOV EDX,[EBP-14]
0167:00475554 MOV EAX,[EBP-08]
0167:00475557 CALL 00403E30
<- burasi da onemli degil bizim icin
0167:0047555C MOV EAX,[EBP-08]
0167:0047555F INC ESI
0167:00475560 DEC EDI
0167:00475561 JNZ 004754B1
Program, buradaki donguye 3 kez geliyor. 4754B1’de eax’e atanan memory
bolgesindeki degerler sirasi ile ;
0030:00478908
43 61 6C 6C 65 72 49 44-20 4D 6F 6E 69 74 6F 72 CallerID
Monitor
0030:00478918 20 31 2E 35 20 28 45 6E-67 6C 69 73 68 29 00 00
1.5 (English)..
016F:016D2674 61 6D 6F 69 73 00 00 00-6A 00 00 00 68 9A 42 00
amois...j...h.B.
016F:01709658 34 31 44 44 42 38 31 33-00 32 6D 01 64 96 70 01
41DDB813.2m.d.p.
Biz, tablonun sonuna eklenen 8 byte’lik degisken bolumun, User name ve serial
number’a bagli oldugunu dusunurken, 3.uncu bir parametre daha cikti. 4756C0’daki
serialin uretildigi dongude, bu 3.uncu bolum var aslinda. Yalniz kucuk bir
ayrintiyi atlamamak gerekiyor. 4756C0’daki dongude, “(English)”
den sonra “1.5” ifadesi var. 4754B1’de atanan
bolumde bu “1.5” yok. Demek ki, “1.5”
sabit bir deger.
4754B1’deki dongude neler oluyor ? Bu dongunun iki onemli noktasi var.
1- [004B7920] ile gosterilen memory bolgesi
2- 475508’de BL’ye 20h eklendikten sonra olusan degerler.
[004B7920] bolgesi ilk olarak
00’lardan olusuyor. Ilk tur tamamlandiginda burada olusan deger ;
016F:004B7920
00 00 00 00 00 00 00 00-FF FF FF FF 50 DA 6E 01
<- baslangic
016F:004B7920 04 03 03 27 1E 00 00 00-FF FF FF FF
50 DA 6E 01 <- 1. tur
016F:004B7920 35 69 60 20 23 00 00 00-FF FF FF FF
50 DA 6E 01 <- 2. tur
016F:004B7920 55 8B 69 20 2B 00 00 00-FF FF FF FF
50 DA 6E 01 <- 3. tur
4754C7’de edx’e atanan degerler degisken. Peki, bunun tablonun sonuna eklenen 8
byte’lik bolumle ilgisi nedir ? “74 22 24 4D
42 32 65 53”. Her ne kadar aralarinda direkt bir
iliski yok gibi gozukse de, aslinda var. 3. tur donerken, yani 4754B1’de eax’e “41DDB813”
atanirken, donguyu dikkatli takip edelim. 475508’de BL’ye 20h eklendikten
sonraki degerleri not edersek, “74 22 24
4D 42 32 65 53” buluruz. Simdi, [004B7920] deki
degerlerin tabloya eklenen bolumle iliskisini bulduk. Bu degerlere gore BL
hesaplaniyor ve tablonun sonuna ekleniyor.
.data
sonuc db 32h dup(?)
; gecerli serial buraya
tablo_2 db 10h dup(?)
; tabloya eklenecek
tur db "%X",0
; hex. output
hedef dd 0h
; 3 tur dongude kullanilacak
kontrol dd 0h
; 3.tura geldigimizde kullanilacak
birlesmis db 50h dup(?)
; parametrelerin birlesmis halleri
LOC_004B7920 db 08h dup(0)
; 4754C7’de edx’e atanan bolum
LOC_004B7924 dd 0h
; orjinal programdan alinma
sabit_1 db "CallerID Monitor 1.5 (English)",0
; 1.sabit
sabit_2 db "1.5",0
; 2.sabit
isim db "amois",0
; User Name
serial db "41DDB813",0
; Serial number
tablo db 000h,000h,000h,000h,096h,030h,007h,077h
; tablo
db
02Ch,061h,00Eh,0EEh,0BAh,051h,009h,099h ; uzunluk
3FC
db
019h,0C4h,06Dh,007h,08Fh,0F4h,06Ah,070h
...
db
034h,03Fh,048h,000h,038h,03Fh,048h,000h
db
03Ch,03Fh,048h,000h,000h,000h,000h,000h
.code
start:
call @tablo_olus
; tabloya eklenecek bolumu olustur 7422244D42326553
invoke szMultiCat, 05h, addr birlesmis, addr isim, addr serial, addr sabit_1,
addr sabit_2, addr tablo_2
; 5 adet string birlestirildi
invoke StrLen, addr birlesmis
; uzunlugu eax’de
xor ebx, ebx
; dongu oncesi ayarlar, orjinal programdan
mov esi, 01
@004756C0:
lea edx, birlesmis
; parametrelerin birlesmis durumu
mov dl, [esi+edx-01]
xor dl, bl
and edx, 000000ffh
mov edx, dword ptr [edx*4+offset tablo]
shr ebx, 08h
and ebx, 00ffffffh
xor edx, ebx
mov ebx, edx
inc esi
dec eax
jnz @004756C0
; dongu sonucunda ebx’de gecerli serial var
@yaz:
invoke wsprintf, addr sonuc, addr tur, ebx
; seriali hex olarak yaz
invoke MessageBox, 0, addr sonuc, addr isim, 0
; goster
@cikis:
invoke ExitProcess, 0
@tablo_olus:
lea eax, sabit_1
; 1.tur, “CallerID Monitor
1.5 (English)”
mov hedef, eax
call @tablo_ek
; [004B7920] de -> 04 03 03 27 1E olustu
lea eax, isim
; 2.tur, “amois”
mov hedef, eax
call @tablo_ek
; [004B7920] de -> 35 69 60 20 23 olustu
lea eax, serial
; 3.tur, “41DDB813”
mov hedef, eax
mov kontrol, 1
; BL’deki degerleri tablo_2 bolgesine alacagiz
call @tablo_ek
; [004B7920] de -> 55 8B 69 20 2B olustu
ret
@tablo_ek:
invoke StrLen, hedef
; parametre uzunlugunu bul, 1E, 5, 8
mov ebx, eax
; buradaki ayarlar orjinal programdan
mov edi, eax
xor esi, esi
xor ecx, ecx
xor edx, edx
@004754B1:
; dongu
mov eax, hedef
; orjinal programdan uyarladik
mov al, byte ptr [esi+eax]
;
cmp al, 020h
jb @0047555F
cmp al, 07eh
...
; 475501'deki cagriyi kendiniz ekleyeceksiniz
mov ebx, eax
add bl, 020h
cmp kontrol, 1
; 3.tura geldik mi ?
jne @devam
mov byte ptr [offset tablo_2+esi], bl ;
o zaman BL degerini tablo_2 ye yaz
@devam:
inc dword ptr [loc_004B7924]
...
; orjinal programdaki 2 cagriyi cikartabiliriz.
inc esi
; bizim icin onemli degil
dec edi
jnz @004754B1
ret
end start
|
|
Bir programı kullanarak para kazanıyorsanız, programı satın alın.