IDE Mimari v3.4

amois

Program Url: www.ideyapi.com.tr
Program Tipi: Mimari
     Araçlar:
 SoftICE, Icedump, PEditor, Hex Editor
Basit (  )  Orta ( )  Zor (x )  Pro (x)

Başlangıç

Mimarlar icin hazirlanmis, bina dizayni yapan bir program.
Yazı

Demo versiyonunda Save edemiyorsunuz. Program guncellemesi bolumunden gerekli dosyayi indirelim. Hasp Envelope ve Hasp Dongle korumalari var. Hasp Envelope, cok sayida anti-debugging vb.. iceriyor. Programi calistirdiginizda, "Hasp Koruma Sistemi, Hasp Donanim Kilidi bulunamadi" seklinde hata veriyor. Object Table inceledigimiz zaman .protect adli section gorecegiz. Bu section disinda kalanlar sifrelenmis durumda. Ama, bu korumaya karsi takip edilecek bir yontem var. Hasp Envelope korumasini, dongle varmis gibi gostererek atlatmaya calisacagiz. Boylece, diger section lar desifre edilmis olacak ve OEP e gelindigi zaman da dump edebilecegiz.

[bpx FreeEnvironmentStringsA] --> idemimids.exe

016F:006C620F PUSH DWORD PTR [ESI]
016F:006C6211 LEA ESI,[KERNEL32!FreeEnvironmentStringsA]
016F:006C6217 CALL [ESI]
016F:006C6219 POPAD                                         <-- Buradayiz
016F:006C621A RET

RET komutu ile geri donunce

016F:006C40A7 PUSH EBP
016F:006C40A8 CALL 006C605F                                 <-- Dongle check
016F:006C40AD POP EBP                                       <-- Buradayiz
016F:006C40AE MOV EDI,[EBP+1C]

Dongle kontrolu yapan cagri 6C40A8 adresinde duruyor. IceDump --> SoftIce loader ile idemimids.exe yi yukleyelim. Bundan sonra breakpoint kullanirken BPX yerine BPM kullanacagiz. Cunku, Hasp Envelope BPX leri pek sevmiyor. [bpm 6C40A8 x]
6C40A8 adresindeyiz ve ebx degerinin 00000100 oldugunu goruyoruz. Burada BH registerinin degeri 01 ve bu Hasp Service de su anlama geliyor.
Bh=01 --> IsHasp --> ax=1 (HASP var), ax=0 (HASP yok)
6C40A8 deki cagriyi [F10] ile gectigimiz zaman ax, bx, cx, dx registerlerimizin 0 olduklarini gorecegiz. [r ax=1] yazip [F5] yapiyoruz. Breakpoint hala aktif durumda. Yeniden 6C40A8 adresine geldik. Eger ax=1 yapmamis olsa idik buraya tekrar gelemeyecektik. Program, dongle var zannediyor ve bir takim sorgulamalar yapmak uzere tekrar 6C40A8 e geldi. Bu sefer bh degerimiz 02.
Bh=02 --> HaspCode --> 4 registere atanan degerleri kontrol edecek. 6C40A8 de iken register degerlerimiz soyle; AX=21BB, BX=0200, CX=1719, DX=5677. [F10] ile cagriyi gectigimizde bu 4 registerdeki degerlerimiz 0 oldu. Cagridan onceki degerlere gore bunlara yeni degerler atanmasi gerekiyor. HASP algoritmasi daha onceden cozulmus durumda ve IceDump ile beraber geliyor. Komut su sekilde ;
[\haspcode cx dx ax]. Su an 7ADACD adresindeyiz ve [\haspcode 1719 5677 21BB] yaziyoruz --> AX=9ACE, BX=D7DE, CX=A689, DX=F6C8 degerleri atandi. [F5] yapinca birkez daha 6C40A8 adresine geldik. Register degerlerimiz ustteki ile ayni geldi.
Cagriyi [F10] ile gectikten sonra [\haspcode 1719 5677 21BB] yaziyoruz. [F5] yapinca birkez daha 6C40A8 adresine geldik. Register degerlerimiz bu sefer farkli geldi. AX=F6C8, BX=0200, CX=1719, DX=5677. Cagriyi [F10] ile gectikten sonra [\haspcode 1719 5677 F6C8] yaziyoruz. AX=6508, BX=1D52, CX=02F7, DX=53CA degerleri atandi --> [F5] --> program calismaya basladi ve "Donanim kilidi bulunamadi" seklinde baska bir hata verdi. Demek ki Hasp Envelope korumasini gectik. Fakat programin icindeki baska bir dongle check e takildik. Simdi yapmamiz gereken Orjinal Entry Point degerini bulmak.
Yukarida yaptigimiz islemleri bir daha yapacagiz. 6C40A8 deki cagriyi sonkez gectikten ve yeni degerleri haspcode ile atadiktan sonra breakpoint leri [bc*] ile temizleyin.

[bpx VirtualAlloc] --> [F5] --> [F11]

016F:006BF3F5 CALL [EBP-10]
016F:006BF3F8 MOV [EBP-08],EAX                             <-- Buradayiz
016F:006BF3FB CMP DWORD PTR [EBP-08],00

Neden VirtualAlloc a breakpoint koyduk diye sormayin. Hasp Envelope un kullandigi teknik yuzunden buraya breakpoint koymamiz tutorial larda tavsiye ediliyor. Bundan sonra OEP yi bulmak icin GetProcAddress e breakpoint koyup takip edecegiz.


[bc*] --> [bpx GetProcAddress] --> [F5] --> [F11] --> [bc*]

016F:006DBBDB PUSH EAX
016F:006DBBDC CALL [KERNEL32!GetProcAddress]
016F:006DBBE2 MOV [EBP-08],EAX                             <-- Buradayiz
016F:006DBBE5 PUSH 006DD490

Bulundugumuz adresten daha gerideki bir adrese sicradigimiz yeri bulmamiz gerekiyor. OEP degerini bulabilmek icin IceDump in tracex fonksiyonunu [\tracex 400000 700000] denedim, yemedi. SoftIce in bpr breakpoint ini [bpr 400000 700000 rw] denedim, yine yemedi. Ben de manual olarak [F10] takibine basladim. Bazi mov komutlarinin kernel32.dll nin fonksiyonlarina donustugunu kendiniz takip sirasinda goreceksiniz. Yani Hasp Envelope su an Import Table olusturuyor. Tamamladigi zaman da OEP ye gidecek. Bu noktada da biz dump edecegiz. Programi SoftIce loader ile yukleyip, [F10] takibi sirasinda [wc] ile code window u kapatirsaniz, hangi cagridan sonra programin calismaya basladigini sonradan bulabilirsiniz. Cunku, program calisip hata verdikten sonra SoftIce a geri donmuyor.

016F:006DBAD6 MOV EAX,[EBP+08]
016F:006DBAD9 PUSH EAX
016F:006DBADA CALL [006DD2F0]                             <-- Program calisiyor

Tekrar deneyecegiz. Bu is biraz zahmetli. Ama SoftIce, doskey gibi yazdiginiz komutlari hafizasinda tuttugundan, \haspcode komutlarini yazmak pek de zor degil. En son \haspcode komutundan sonra [bc*] --> [bpm 6DBADA x] --> [F5]. Cagrinin icine [F8] ile girip [F10] takibine basliyoruz.

016F:006D9711 REPZ MOVSD
016F:006D9713 MOV EAX,[EBP+08]
016F:006D9716 PUSH EAX
016F:006D9717 CALL [006D97AC]                             <-- Program calisiyor

Tekrar deneyecegiz. [bc*] --> [bpm 6D9717 x] --> [F5]. Cagrinin icine [F8] girip [F10] ile takip edelim.

016F:006BD5FC PUSH DWORD PTR [006BD650]
016F:006BD602 RET
016F:0058660C PUSH EBP                                     <-- OEP
016F:0058660D MOV EBP,ESP
016F:0058660F PUSH FF

6BD602 deki RET komutu ile Orjinal Entry Point 58660C ye geldik. Nereden mi anlasiliyor ? Adresdeki geriye dogru buyuk sicramadan tabii ki. OEP de sectionlari kontrol ederseniz, hepsinin decryp edildigini gorursunuz.

:map32 idemimids
Owner Obj Name Obj# Address Size Type
IDEMIMIDS .text         0001 016F:00401000 00198CDD CODE RO
IDEMIMIDS .rdata        0002 0177:0059A000 00029350 IDATA RW
IDEMIMIDS .data         0003 0177:005C4000 00003D88 IDATA RW
IDEMIMIDS _TEXT_HA      0004 0177:005C8000 0000FDE6 IDATA RW
IDEMIMIDS .rsrc         0005 0177:005D8000 000E31D0 IDATA RO
IDEMIMIDS .protect      0006 016F:006BC000 00021C1D CODE RW

Ornegin, [dd 401000] yazdiginizda ?? ?? cikarken, OEP de [dd 401000] yazarsaniz ?? ?? lar yerine kod goreceksiniz. Hasp Envelope ile korunmus bazi programlarda .rsrc bolumu sifrelenmemis olabiliyor. Ama bizim programimizda hepsi sifrelenmis durumda.

OEP de iken [dump 400000 2DE000 c:\dump.exe] yazarak Hasp Envelop dan arinmis exe ye sahip oluyoruz. (Image Base = 400000, Size of Image = 2DE000)
PEditor ile dump.exe yi acalim --> Entry Point --> 58660C - 400000 = 18660C
sections --> .text --> dumpfixer --> Boylece calismaya hazir hale gelmis oldu. Calistirdigimizda verdigi hata, Hasp Envelope un verdigi hatadan farkli. Simdiki isimiz, bu hatanin sebebini bulup cozum uretmek.

[bpx FreeEnvironmentStringsA] --> dump.exe --> [F11]

016F:00585545 POPAD
016F:00585546 RET <-- Buradayiz
016F:005833DB POP EBP

016F:005833D5 PUSH EBP
016F:005833D6 CALL 0058538B                             <-- Dongle check
016F:005833DB POP EBP

Yukarida acikladigim metodu kullandik ve kullanacagiz. [bpm 5833D6 x] --> dump.exe
Simdi 5833D6 adresindeyiz --> AX=000C, BX=0500, CX=0DF6, DX=5677 --> yani bh=05

bh=05 --> HaspStatus --> ax=1 (memohasp-1), bx=1 (memohasp-1~4), cx=1 (lpt1 port)

(Ayrintili bilgiyi, internet ten edinebilirsiniz. (tutorial by Zafer/BSCA))

Daha sonra 5 inci cagrida --> AX=00E6, BX=0300, CX=1719, DX=5677 --> yani bh=03

bh=03 --> Readword --> bx= word, cx=status (success=0)-->

Service 3 oldugunda, bx registerindeki deger daha sonra kullanilacak. [F10] ile takip ettigimizde

016F:004DDB0E MOV EAX,[ESP+34]
016F:004DDB12 ADD ESP,24
016F:004DDB15 SUB EAX,00004E1A                         <-- eax = 4E1A olmali
016F:004DDB1A MOV [ESP+10],EAX
016F:004DDB1E JZ 004DDB5A                              <-- iyi cocuk
016F:004DDB20 MOV ECX,[005C7D4C]
016F:004DDB26 PUSH 00004F4C
016F:004DDB2B CALL 004E5B50
016F:004DDB30 MOV ESI,EAX
016F:004DDB32 PUSH 00001000
016F:004DDB37 PUSH 005C52A8
016F:004DDB3C PUSH ESI
016F:004DDB3D PUSH EBX
016F:004DDB3E CALL [USER32!MessageBoxA]

4DDB15 adresinde eax degerimiz 4E1A olursa hata vermeyecek. Demek ki, Service 3 cagrisindan sonra bx ile donmesi gereken degerimiz 4E1A. Program calistiktan sonra bir dosya acmak veya programdan cikmak istedigimizde Service 32 cagriliyor. Bu servisin emulate edilmesi ile ilgili tutorial lar mevcut. Ben burada kismen Mr_STOP dan alinti yapacagim. Emulasyonumuz su sekilde oldu;

cmp bh,3
jnz @service5
mov ebx,04E1Ah
mov ecx,00000h
ret
@service5:
cmp bh,5
jnz @service33
mov eax,1
mov ebx,eax
mov ecx,eax
ret
@service33:
cmp bh,32h
jz @service32
xor ecx,ecx
ret
@service32:
push ebp
call delta
delta:
pop ebp
lea ebx, [ebp+14]
pop ebp
mov ecx, esi
shl edi, 1
lea esi, [ebx][edi]
shr edi, 1
xchg edi, eax
repe movsw
xchg edi, eax
ret
DB 112 dup(0)


Yukaridaki kodu compile edip, Hasp Envelope dan arinmis dump.exe nin sonlarindaki bosluga yerlestirecegiz. (Offset 2DDC1E den itibaren) 5833D6 daki cagriyi CALL 6DDC1E seklinde degistirelim. Programimiz simdi calisiyor, ama dosya acarken veya programdan cikarken hata veriyor.
[bpm 6DDC1E x if bh==32] --> programimizi calistiralim. Bir dosya acmaya kalktigimizda breakpoint calisti. [F10] ile takip edelim.

016F:006DDC52 CALL 006DDC57                 <-- EAX degerimiz 5C79F0
016F:006DDC57 POP EBP
016F:006DDC58 LEA EBX,[EBP+0E]
016F:006DDC5B POP EBP
016F:006DDC5C MOV ECX,ESI
016F:006DDC5E SHL EDI,1
016F:006DDC60 LEA ESI,[EDI+EBX]             <-- ESI ye atanan deger 6DDCC9
016F:006DDC63 SHR EDI,1
016F:006DDC65 XCHG EAX,EDI
016F:006DDC66 REPZ MOVSW
016F:006DDC69 XCHG EAX,EDI
016F:006DDC6A RET

[bpm 5C79F0] --> programi yeniden yukleyelim.

016F:004E5677 CALL 004DD640                 <-- icine girmemiz gerekecek
016F:004E567C JMP 004E5680
016F:004E567E XOR EAX,EAX
016F:004E5680 PUSH 00
016F:004E5682 MOV [EBX+00000178],EAX        <-- eax = 98E918
016F:004E5688 MOV [EBX+00000448],EAX        <-- Buradayiz
016F:004E568E MOV EDX,[EAX]

4E5677 deki cagridan sonra, 6DDCC9 adresine 98E918 degerini veya eax atamaliyiz.

4E5677 deki cagrinin icine girelim --> [F10] takibi --> RET ile dondugumuz yeri bulalim. Donmeden once 6DDCC9 adresine eax atamasini yapsak iyi olur.

Bu sekilde de patch yapilabilir.

016F:004DDBEA MOV FS:[00000000],ECX
016F:004DDBF1 ADD ESP,24
016F:004DDBF4 MOV [006DDCC9],EAX
016F:004DDBF9 RET

Sizde cikacak degerler 6DDCC9 ve 98E918 den farkli olabilir.

 
Son Notlar

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