AMP Hakediş |
|
PoWeRGuArD |
|
Program Tipi: Hasp Dongle & Hasp Envelope |
|
Araçlar: Softice, IceDump, Hiew |
|
|
|
|
Program inşatçıların kullandığı bir hakediş programı.
|
|
ÖNCELİKLE PROGRAM ASPACK 2.1 İLE KORUNMUŞ PROGRAMIN EXE DOSYASINI UNPACK EDİYORUZ.
ICEDUMPIMIZI YÜKLÜYORUZ. ŞİMDİ PROGRAMI AÇIYORUZ. KULLANICI ADI VE ŞİFRESİNİ AMP OLARAK YAZDIKTAN SONRA
ENTER'A basmadan önce softice'a geçip Bpx FreeEnvironmentStringsA yazıyoruz ve programı tekrar geri
dönüyoruz. Entera bastığımızda program KERNEL32 içerisine düşüyor bir defa F12 yaptıktan sonra $öyle
yere geliyoruz.
CALL [ESI]
POPAD
RET => HASP Servisine geri dön. F10 ile ilerliyoruz.
.. döndükten sonra
00699F83 CALL 0069BEBA (bu adres sizde farklı olabilir)
00699F88 POP EBP
00699F89 MOV EDI, [EBP+14] ; dongledan geriye dönen değerler burada başlıyor
00699F8C MOV [EDI], EAX
00699F8E MOV EDI, [EBP+10]
00699F91 MOV [EDI], EBX
00699F93 MOV EDI, [EBP+0C]
00699F96 MOV [EDI], ECX
00699F98 MOV EDI, [EBP+08]
00699F9B MOV [EDI], EDX
00699F9D POP ESI
00699F9E POP EDI
00699F9F POP EBX
00699FA0 POP EAX
00699FA1 POP EBP..
Programı reverse ederken dikkat etmemiz gereken nokta hasp servisleri ne zaman ne şekilde çağrılıyor.
HASP Servisleri ile ilgili detay bilgi geçmiyorum internette çok fazla örnek var. Şimdi biz bu CALL satırına
geldiğimizde bu satıra BPX koymamız gerekiyor bpx 00699f83. Şimdi softice'dan çıkıp programı kapatalım.
Tekrar programı çalıştırıp AMP amp yazdıktan sonra program direk olarak CALL Satırında duruyor. Evet şimdi
registerların aldığı değerlere göre işlemi takip ediyoruz ve notlarımızı alıcaz, çünkü bir emulasyon kodu
yazmamız gerekecek. Program CALL satırında durdu,
EAX=0000B132 EBX=00000100 ECX=000021FF EDX=000052B3
işte Servis EBX=100 bir çağrılmış durumda yani IsHasp() Dongle varmı yokmu? F10'a basarak bir aşağı iniyoruz.
POP EBP satırında programa dongle olduğunu söylemek için EAX 'ı 1 yapmak gerekiyor bizde yapıyoruz. R EAX=1
evet şimdi programa GO diyelim G yazıp entera bastık. Program tekrar CALL Satırında durdu, şimdi register
değerlerine bakıyoruz.
EAX=0000B132 EBX=00000500 ECX=000021FF EDX=000052B3
Program 2. olarak service 5'i çalıştırdı. Yani HASP Status evet bu durumda bizim POP EBP Satırlarına geldiğimizde
EAX, EBX, ECX Değerlerini 1 yapmamız gerekiyor. Tekrar F10 ile ilerleyip POP EBP satırında, R EAX=1, R EBX=1, R ECX=1
yapıyoruz. Go diyoruz. (G enter)
Tekrar CALL Satırı üzerine geldik ve register değerlerini kontrol ediyoruz.
EAX=0000B132 EBX=00000200 ECX=000021FF EDX=000052B3
Şimdi burada bir nokta var service 2 çalıştı. Yani HaspCode dongle'dan dönen değerleri CALL satırından sonra
programa göndermemiz gerekiyor. Bizim ICE Dumpun HASPCODE özelliğini kullanarak dönen değerleri hesaplattırıyoruz.
F10 yapıyoruz ve POP EBP Satırı üzerindeyken şunu yazıyoruz.
\HASPCODE 21FF 52B3 B132 bundan sonra dönen değerleri not alıyoruz. (şimdi biz programa dongledan dönecek değerleri
gönderdik) registerlar şu durumu aldı,
EAX=00007C22 EBX=000083A7 ECX=00009645 EDX=0000A209
Tekrar GO diyoruz ve CALL Satırına geliyoruz şimdi registerlar değişti.
EAX=0000B132 EBX=00000600 ECX=000021FF EDX=000052B3
Service 6 ile çağrıldı, bunun sonucunda ECX Değerinin Sıfırlanması gerekiyor ki program dongle varmış gibi işleme
devam etsin, F10 diyoruz ve POP Ebp Satırında iken R ECX=0 diyoruz ve Go diyoruz.
Evet şimdi yine CALL Satırına geri döndük ve her zamanki gibi Registerlara baktık.
EAX=0000B132 EBX=00000300 ECX=000021FF EDX=000052B3
Service 3 çağrıldı bunun sonucunda da ECX=0 değerini alması gerekiyor F10 yapıyoruz ve POP EBP Satırında R ECX=0
diyoruz. Tmmdır program bu şekilde başka servis çağırmayacak her çağırdı servise göre istenlen işlemleri
yukarıdaki gibi yapıyoruz. Ama bu şekilde programı debug ederek her zaman çalıştıramayızki, şimdi programımızın
emulasyon kodu şu şekilde oluşmuş oldu,
*******************************************
CMP BH, 1 => IsHASP() (service1)
JNZ @nextservice
XOR EAX, EAX => aha işte dongle var dedik
INC EAX
RET
CMP BH, 5 (Service 5)
JNZ @nextservice => service 5 mi?
MOV EAX,1
MOV EBX, EAX
MOV ECX, EAX
ret
CMP BH, 2 (service 2)
JNZ @nextservice
MOV EAX, 00007C22 => 1. dönen değer
MOV EBX, 000083A7 => 2. dönen değer
MOV ECX, 00009645 => 3. dönen değer
MOV EDX, 0000A209 => 4. dönen değer
ret
CMP BH, 6 (service 6)
JNZ @nextservice
XOR ECX, ECX
RET
CMP BH, 3
JNZ @emulasyonbaşı
XOR ECX, ECX
ret
**********************************************
evet şimdi bu kodu nereye yazacaz?? ben burada biraz takılmıştım, biraz araştırma yaptım birazda saksıyı çalıştırdık
şöyle yaptık bakın. Bu kodları exe dosyasının sonunda bulunan boşluğa yazdım ama şimdi bu CALL dan dongle servisleri
çağrıldığında bizim emulasyon çalışsınki program dongle varmış gibi işlem yapsın evet bunun içinde şu bizim ünlü
00699F83 CALL satırının içerisine giriyoruz F8 ile program dongle servislerinden gelen cevapları nerede registerlara
atıyor bakıyoruz, biraz F8 ile trace ettikren sonra şöyle bir yer çıkacak,
0069C030 CALL 0069B27B
0069C035 POPAD
0069C03B CALL [EBP+00] => evet işte bizim emulasyon kodunu burada yönlendirmemiz gerekiyor..
0069C03E PUSHAD
0069C03F MOV ESI, 00BE7A35
....
...
0069C04D POPAD
ve benim yazdığım koda göre ben şu şekilde yaptım
0069C03B CALL 00BE1B05 (emulasyon kodu adresim sizde farklı olacaktır) ve ondan sonra devam
0069C035 POPAD => bundan sonrada PUSHAD satırına kada NOP luyoruz yoksa emulasyonumuz hata verdiriyor ve
program göçüyor..
.... NOP
.... NOP
.... NOP
0069C03E PUSHAD
işlem tamamdır, (tabi bu kodları HIEW programı yardımı ile içeriye yazıyoruz). Bundan sonra programı açıyoruz ve tataam..!
program dongle varmış gibi çalıştı, (isterseniz softice ile bakın nasıl çalışıyor emulasyon) Hemde daha hızlı
Umarım bu bilgiler arkadaşlara yardımcı olur,
Deneme, yanılmaya devam...
PoWeRGuArD
|
|
NOT : Bu işlemleri dosyayı unpack ettikten sonra yapın ha!
Yardımlarından dolayı RvaZero, MrStop, Euclides ve tüm
mdk forumdaki arkadaşlara teşekkürler.