AMP Hakediş

PoWeRGuArD

Program Url:www.amp.com.tr
Program Tipi: Hasp Dongle & Hasp Envelope

     Araçlar:

Softice, IceDump, Hiew

Basit ()  Orta (x )  Zor ( )  Pro ()


Başlangıç

Program inşatçıların kullandığı bir hakediş programı.
Yazı

Ö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ıSmile 

Umarım bu bilgiler arkadaşlara yardımcı olur,
Deneme, yanılmaya devam...
PoWeRGuArD
Son Notlar
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.
 

E-Mail: