|
IDE Mimari v3.4 |
|
amois |
|
Program Tipi: Mimari |
|
SoftICE, Icedump, PEditor, Hex Editor |
|
|
|
|
Mimarlar icin hazirlanmis, bina dizayni yapan bir program.
|
|
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.
|
|
Bir programı kullanarak para kazanıyorsanız, programı satın alın.