Kyodai Mahjongg v17.24

amois
Program Url: www.kyodai.com
Program Tipi: Zeka oyunu
     Araçlar:
SoftIce, IceDump
Basit (x )  Orta ( )  Zor ( )  Pro ( )


Başlangıç

Uzakdogu kokenli ve guzel design edilmis bir oyun.
Yazı

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)
)

Son Notlar

Bir programı kullanarak para kazanıyorsanız, programı satın alın.