Kyodai Mahjongg v17.24 |
|
|
|
Program Tipi: Zeka oyunu |
|
SoftIce, IceDump |
|
|
|
|
Uzakdogu kokenli ve guzel design edilmis bir oyun.
|
|
Aspack 2.11c ile paketlenmis. Unpack bolumunu hizli gececegim. [bpx getprocaddress] --> [F12]
:map32 kyodai Owner Obj Name Obj# Address Size Type KYODAI CODE 0001 0177:00401000 000ED000 IDATA RW KYODAI DATA 0002 0177:004EE000 00003000 IDATA RW KYODAI BSS 0003 0177:004F1000 0023B000 IDATA RW KYODAI .idata 0004 0177:0072C000 00003000 IDATA RW ...
[bpm 4F1000] --> [\tracex 401000 4EE000] -->
016F:004EDA74 PUSH EBP <-- OEP 016F:004EDA75 MOV EBP,ESP
Register bolumune "amois_fb" ve sallama serial girelim. "Sorry
.." diyerek hata veriyor.
[bpx hmemcpy] --> tekrar deneyelim --> [bc*] --> exe koduna kadar [F12]
--> [F10] takip
016F:004B47EA CALL 004B61F0 <-- Ne ise yariyor acaba ? 016F:004B47EF TEST AL,AL 016F:004B47F1 JZ 004B4819 <-- kotu cocuk 016F:004B4819 MOV EAX,[EBX+00062E90] <-- amois_fb 016F:004B481F CALL 004040F4 <-- uzunlugunu hesapla 016F:004B4824 CMP EAX,08 <-- User Name uzunlugu kontrol 016F:004B4827 JGE 004B484F <-- en az 8 karakter olmali ... 016F:004B4852 MOV EDX,004B4928 <-- [d edx] --> "Sorry .." 016F:004B4857 MOV EAX,[EBX+00000488] 016F:004B485D CALL 0045F1C4 016F:004B4862 MOV EAX,[EBP-14] 016F:004B4865 MOV CX,[004B48E0] 016F:004B486C MOV DL,02 016F:004B486E CALL 004B12A8 <-- "Sorry .." 016F:004B4873 JMP 004B487C
Girdigimiz serialin yanlis oldugunu soyleyen 4B486E deki cagriya 4B47F1 den ziplayarak geldik. Hata vermeden once, girdigimiz User Name uzunlugu kontrol ediliyor ve 8 den az ise uyari veriyor. Butun olayin dondugu yer ise 4B47EA cagrisi.
[bpx 4B47EA] --> [F8]
... 016F:004B626C MOV EDX,[EBX+00062E90] <-- amois_fb 016F:004B6272 MOV EAX,EBX 016F:004B6274 CALL 004B2BDC <-- serial hesaplaniyor 016F:004B6279 MOV EAX,[EBP-08] <-- dogru serial 016F:004B627C MOV EDX,[EBX+00062E94] <-- girdigimiz sallama serial 016F:004B6282 CALL 00404204 <-- esit mi ? 016F:004B6287 JNZ 004B69B8 <-- esit degil
Artik, girdigimiz bir User Name icin gecerli seriali bulduk. Simdi hata mesaji yerine gercek seriali gostermesini saglayalim. 4B627C de iken [d eax] ile serialimizi gorebiliyorduk. Seriali [004B4928] memory adresine yazdiracagiz. Cunku, burada normalde "Sorry .." yaziyor. Memorye yazma islemi bittikten sonra 4B69B8 e ziplayacagiz
0167:004B6282 PUSH EAX <-- eax=[ebp-08] 0167:004B6283 PUSH 004B4928 <-- nereye yazacagiz 0167:004B6288 CALL USER32!wsprintfA <-- yaz 0167:004B628D POP EAX <-- eax=4B4928 0167:004B628E POP EAX <-- eax=[ebp-08] 0167:004B628F CALL 00404204 0167:004B6294 JMP 004B69B8
4B6287 de hep JUMP yapacagimiz icin 4B69B8 e kadar olan bolume istedigimizi
yazabiliriz.
wsprintfA fonksiyonu icin 2 deger yeterli oluyor. Yazacagimiz bilginin offset
degeri ve yazacagimiz bolge. 4B6279 da eax, zaten dogru serialin offset degerini
iceriyor. Bu nedenle direkt olarak PUSH EAX yazabildik. Serial kontrolunden
once de, eax degerini orjinal haline getirmek icin 2 kere POP kullandik. Program
simdi, yanlis serial girdiniz uyarisi yerine dogru seriali veriyor.
Sira geldi KeyGen algoritmasina. [bpx 4B6274] --> [F8]
016F:004B2C10 MOV EDX,[EBP-08] 016F:004B2C13 MOVZX EAX,BYTE PTR [EAX+EDX-01] <-- "a" 016F:004B2C18 MOV EDX,[EBP-08] 016F:004B2C1B MOVZX EDX,BYTE PTR [EDX] <-- "b" 016F:004B2C1E ADD EAX,EDX 016F:004B2C20 MOV ECX,0000000A 016F:004B2C25 XOR EDX,EDX 016F:004B2C27 DIV ECX 016F:004B2C29 ADD EDX,30 ... 016F:004B2C48 MOV EAX,[EBP-08] 016F:004B2C4B MOVZX EAX,BYTE PTR [EBX+EAX-02] <-- a m o i s _ f 016F:004B2C50 MOV EDX,[EBP-08] 016F:004B2C53 MOVZX EDX,BYTE PTR [EBX+EDX-01] <-- m o i s _ f b 016F:004B2C58 ADD EAX,EDX <-- eax=eax+edx 016F:004B2C5A MOV ECX,0000000A <-- ecx=10 016F:004B2C5F XOR EDX,EDX <-- edx=0 016F:004B2C61 DIV ECX <-- eax i ecx e bol, kalan edx e 016F:004B2C63 ADD EDX,30 <-- edx=edx+30 ... 016F:004B2C7A JNZ 004B2C48
User Name in her karakteri kendisinden sonra gelen ile isleme tutuluyor. Bu dongu 4B2C48 ile 4B2C7A arasinda. Buraya gelmeden ise ilk ve son karakterler 4B2C13 den baslayarak hesaplaniyor. Sonucta ortaya cikan serialin uzunlugu, girdigimiz User Name uzunluguna esit oluyor.
Her zamanki gibi yine AutoLISP
(DEFUN C:KYO ()
;*** Kyodai Mahjongg v17.24 Key Generator ***
(atoms-family 0)
(setq user_name (getstring "\nUser Name =")
user_name_uzun (strlen user_name)
sayac 1 kontrol 0 ecx 10 serial nil)
(repeat user_name_uzun
(setq harf1 (substr user_name sayac 1)
harf2 (substr user_name (+ 1 sayac)))
(if (= kontrol 0)(progn
(setq harf2 (substr user_name user_name_uzun 1))))
(setq eax (ascii harf1)
edx (ascii harf2)
eax (+ eax edx)
edx (- eax (* ecx (fix (/ eax ecx))))
edx (+ edx 48)
serial (append serial (list (chr edx)))
sayac (+ 1 sayac))
(if (= kontrol 0)(setq sayac 1))
(setq kontrol 1)
)
(princ serial)(princ)
)
|
|