AATools v4.31

Mr_Stop
Program Url: http://www.glocksoft.com
Program Tipi:
Bir sürü inter aracı bir arada
     Araçlar: SoftIce, IceDump, Dede
Basit ( )  Orta ( )  Zor (x )  Pro ( )


Başlangıç

Yine Aspotect ile ilgili bir yazı.Fakat bu sefer nasıl unpacklenir vs yi anlatmıycam.Onu diğeryazılarda bulabilirsiniz.Bu yazıda size eğer program asprotect apisi kullanıyorsa bun nasıl emule edicez onu göstericem.
Yazı

Program Asprotect ile korunmuş versiyonundan pek emin değilim.Öncelikle unpack edip importu düzeltiyoruz.

Unpack

1) bpx getdiskfreespacea
2) map32 aatools 


AATOOLS 0001 0187:00401000 00216000 IDATA RW
AATOOLS 0002 0187:00617000 00005000 IDATA RW
AATOOLS 0003 0187:0061C000 00002000 IDATA RW
AATOOLS 0004 0187:0061E000 00004000 IDATA RW
AATOOLS 0005 0187:00622000 00001000 IDATA RW
AATOOLS 0006 0187:00623000 00001000 IDATA RW
AATOOLS 0007 0187:00624000 00001000 IDATA RW
AATOOLS 0008 0187:00625000 00021000 IDATA RW
AATOOLS .rsrc 0009 0187:00646000 000AD000 IDATA RW
AATOOLS .aatools 000A 0187:006F3000 00010000 IDATA RW
AATOOLS .adata 000B 0187:00703000 00001000 IDATA RW

3) -tracex 401000 617000 .

iki defa duracak F10 ile takip edin.Asprotect koduna döndüğünde yine

 -tracex 401000 617000

Sonunda OEP olan 00616138 da duracak.Normal olarak dump edin.

Importu düzeltmek

Revirgini açın OEP yerine 00616138 yazın fetch iat a tıklayın.Iat resolver ile bozuk olanları düzeltin.Bu biraz uzun sürüyo.İşlem bitince Resolve again'e tıklayın.Hemen hemen hepsi çözülecektir.Bir kaç tane bozuk kalacaktır.Bozuk olanları ilk başta Trace ile düzeltmeye çalışın.Yine bir kaç tanesi düzelecektir.Yine resolve againe tıklayın.Şimdi trace ile de çözülmeyen girişlerin üzerine gelip Apiemulatoru seçin.Hepsi tamamen çözülecektir.Daha sonra generate ile importu rebuild edin.

Program hala çalışmıyor neden?

Ama program yine çalışmıycaktır.Programı Hiew vs ile dissamble edin.

00616154: FF1538AD6100 call [00061AD38]

00061AD38 bölgesi asprotect kodu ve memory de olmadığı için tabiiki program göçüyor.Bizim orda ne olduğunu öğrenmemiz lazım.Yine yukarıdaki işlemleri yapıyoruz.Orjinal exe de o bölgeyi F8 ile izliyoruz.Call'a girdiğimizde şunu görüyoruz.

017F:0139C8E8 833DA8353A0100 CMP DWORD PTR [013A35A8],00 ;asprotect var mı    
017F:0139C8EF 7406           JZ 0139C8F7 ;yoksa çık 
017F:0139C8F1 FF15A8353A01   CALL [013A35A8] ;dd yazınca 61576c görürsünüz.
017F:0139C8F7 C3             RET 

Yine F8 ile izliyoruz ve şuraya geliyoruz.

0061576C: 6800586100 push 000615800 
00615771: 6A20 push 020
00615773: 6A00 push 000
00615775: 6A02 push 002
00615777: 6A00 push 000
00615779: 6AFF push 0FF

Demekki O callı biz call 0061576C şeklindedeğiştiricez.

00616154: E813F6FFFF call 00061576C 
00616159: 90 nop

yaptığımız zaman programın çalıştığını görüyoruz ama yine nag ekranı çıkıyor expired olmuş ve unregistered yazıyor.

Şimdi normal olarak işimiz burda biterdi.Bir şekilde nag vs yi hallederdik.Ama bu sefer sizlere Asprotect Api sinin ne menem bir şey olduğunu göstermek istiyorum.Bu apilerin nasıl bir şey olduğunu kavrarsanız artık sadece unpack edip benim şimdi anlatıcağım yöntemle patch yapmak zorunda kalmıycaksınız.Kulağa hoş geliyor öyle değil mi ?

Asprotect API Emulasyonu

     Bu api emulasyonunu ben keşfetmedim.Bunu bulan adam AS-AntiProtect'ın yazarı VAG. Bu unpackerı internette bulmak mümkün ama ne yazıkki eski versiyonları destekliyor ve ben hiç bir dosyayı unpack edemedim.Neyse zip paketinin içinde birde api_dll.zip diye bir dosya var.Bunun içinde asprapi.dll ve bunun kaynak kodu var.Bu dll bu adamın yazdığı asprotect api emulator.Unpacker ı incelediyseniz zaten eğer yapabilirse apileri emule ediyor bu dll ile.


Bütün api fonksiyonları ASProt1 ve ASProt2 girişlerine yönlendiriliyor.Bu girişler 'kullanmaya hazır' değerleri (gün sayısı vs) veya gerçek api rutinlerini sonuç olarak veriyor.

; Api-griş rutinleri APITABLE tablosunu inceliyerek geriye değer/api gönderiyor.
   ;
   ; Desteklenen api fonksiyonları (değerolarak):
   ;
   ; -1 - kalan gün sayısı                (değer) (az) (* UNDOC *)
   ; 0 - kalan çalıştırma sayısı          (değer) (az) (* UNDOC *)
   ; 1 - 0                                (değer) (az) (* UNDOC *)
   ; 2 - 0                                (değer) (az) (* UNDOC *)
   ; 3 - null-proc                        (ret) (VB kullanıyor) (* UNDOC *)
   ; 4 - kod parçalarını decrypt ediyor   (basit return `herşey tamam`)
   ; 5 - kayıt bilgisinin yerini gönderir
   ; 6 - bellek bloğu ayır                             (* UNDOC *)
   ; 7 - bellek bloğu temizle                          (* UNDOC *)
   ; 8 - kalan gün sayısı
   ; 9 - kalan çalıştırma sayısı
   ; 10 - kayıt bilgilerini buffera kopyala            (* UNDOC *)

   AsProtect Apileri GetProcAddress,-1,fonksiyon ismi şeklinde çağrılıyor.Geriye de eax ta sonuç veya api çağırılıyor.Kısacası unpack ettiğiniz exede GetProcAddress e -1 yani FFFFFFFFh gönderildiğini görürseniz bu kesinlkile Asprotect API'sidir.

   Şimdi programa geri dönelim ve bu Asportect API sini daha yakından görelim.Dede ile dissamble ediyoruz.Main formun FormCreate eventine tıklıyoruz.

0060DA23   E860F9FFFF             call    0060D388
0060DA28   8B55F8                 mov     edx, [ebp-$08]
0060DA2B   8B45FC                 mov     eax, [ebp-$04]
0060DA2E   05A4040000             add     eax, +$000004A4

* Reference to: System..LStrAsg()
|
0060DA33   E8EC64DFFF             call    00403F24
0060DA38   33C0                   xor     eax, eax
0060DA3A   5A                     pop     edx
0060DA3B   59                     pop     ecx
0060DA3C   59                     pop     ecx
0060DA3D   648910                 mov     fs:[eax], edx
0060DA40   EB0A                   jmp     0060DA4C

****** EXCEPT
|
0060DA42   E9BD5CDFFF             jmp     00403704

* Reference to: System..DoneExcept()
|
0060DA47   E8685FDFFF             call    004039B4

****** END
|
0060DA4C   8B45FC                 mov     eax, [ebp-$04]

* Reference to field TMainForm.OFFS_04A4
|
0060DA4F   83B8A404000000         cmp     dword ptr [eax+$04A4], +$00
0060DA56   753F                   jnz     0060DA97
0060DA58   8B45FC                 mov     eax, [ebp-$04]
0060DA5B   05A4040000             add     eax, +$000004A4

* Possible String Reference to: 'NOT REGISTERED'
|
0060DA60   BA8CDB6000             mov     edx, $0060DB8C

Adamın yaptığı call 0060D388 dan sonra registerlı olup olmadığına bakıyor lstrarg ile orada bir değer var mı diye bakıyor.0060D388 adresine F8 yapıyoruz.

0060D39A   64FF30                 push    dword ptr fs:[eax]
0060D39D   648920                 mov     fs:[eax], esp
0060D3A0   A128AD6100             mov     eax, dword ptr [$61AD28] ;05 (kayıtlı ismi çağır)
0060D3A5   50                     push    eax
0060D3A6   A124AD6100             mov     eax, dword ptr [$61AD24] ;FFFFFFFF
0060D3AB   50                     push    eax
|
0060D3AC   E8D3A5DFFF             call    00407984  ;GetProcAddress
0060D3B1   FFD0                   call    eax       ;AsprotectApi
0060D3B3   8BD0                   mov     edx, eax
0060D3B5   8B45FC                 mov     eax, [ebp-$04]

* Reference to: System..LStrFromPChar(System.AnsiString)
|           or: System..WStrFromPChar(System.WideString)
|
0060D3B8   E8C76CDFFF             call    00404084

Program burda 05 yani Kayıtlı ismi geriye yoluyan fonksiyonun adresini Aspotect Api de atıyıp onu çağırıyor.Biz burayı aslında kolayca patch edebiliriz. Exenin boş bir yerine isim vs yazarız.Daha sonra direkt mov eax,yazdığımız adress yaparız olur.Fakat sonuçta önemli olan daha genel bir yol bulmak ve en az patch ile bu işi bitirmek.

Gördüğünüz gibi Asprotect apiyi çağırmadan öce adam GetProcAddress ile fonksiyonun adresini öğreniyor.Biz bundan faydalanabiliriz.Exe ye ilk başta yeni bir import ekleriz asprapi.dll AsProt1 fonksiyonu.Daha sonra exedeki GetProcAddres API sinin IAT ını yeni eklediğimiz Asprot1 fonksiyonun IATı ile değiştiririz.Böylelikle bütün GetProcAddress apileri bizim dll ye yönlenir.Eğer ilk parametresi -1 ve diğer parametresi bizim API tablosunda varsa ona göre sonuç yollarız olmazsa geriye orjinal GetProcAddresi yollarız.

Şimdi uygulamaya geçiyoruz.PeEditor vs ile Exeye yeni bir Import ekliyoruz Asprapi.dll ASProt1 fonksiyonu.(Dll aynı klasörde olucak.Eğer hata verirse exenin en sonuna birkaç 0 ekleyip yeniden deneyin).Peeditor bir text dosyası oluşturuyor exeismi._IData.txt diye onun içinde eklenen fonksiyonun adresini bulmak mümkün.Benim dosyada

ASProt1 - call dword ptr [0070820A]

yazıyordu.Şimdi GetProcAddressin yerini öğreniyoruz.407984 orayı Hiew vs ile dissamble edince şunu görüyoruz

.00407984: FF254CE46100 jmp GetProcAddress ;KERNEL32.dll

aslında orasının manasını şu

00007984: FF254CE46100 jmp d,[00061E44C]

Yani 61E44C adresindeki fonksiyonu çağır.Burası IAT windows burayı exe yüklendiği zaman GetProcAddresin adresi ile dolduruyor.Bizim yapıcağımız.61E44C ye zıplamak yerine 70820A adresine zıplamak bu şekilde olayı halletmiş olucaz.Değiştirince hiew de şöyle gözükecek

.00407984: FF250A827000 jmp ASProt1 ;Asprapi.dll

Bu şekilde çalıştırdığımız zaman zamaın 20 gün kaldığını görüyoruz(dll 10 gün geçmiş diye emule ediyor) ve yine Nag çıkıyor :(

Help/Aboutkısmında ama ASAP yazıyor işte bu gerçekten ilginç :) Ben ilk başta hayal kırıklığına uğramıştım.O kadar uğraş sonunda About ta isim yazıyor ama nag gitmemiş.Bende bari about kısmında hem benim nick yazsın hemde bizim siteye link yazsın dedim.Nasıl olsa yer var diyerekten

_regName equ 'Mr_Stop / DESPERATE',13,10,'http://kickme.to/desperate' ;13,10 hex olarak 0Dh,0Ah demek.

Şeklinde değiştirip dll yi yeniden compile ettim.Programı çalıştırdığımda olay tam istediğim gibiydi.Nag ekranı gitmişti ve About ta şunlar yazıyordu

User Name:             Mr_Stop / DESPERATE
Number of lic. copies: http://kickme.to/desperate

Eheuh, meğer adamın derdi iki satırlık bir bilgi olmasıymış.Aslında Number of lic. copies i bir rakam yapmak daha iyi ama bu şekide de çok iyi çalışıyor.Şimdi yaptıklarımızı tekrardan gözden geçiriyoruz.

  1. Programı dump et ve import tablosunu düzelt
  2. Peeditor vs ile Asprapi.dll ASProt1 importunu ekle.
  3. GetProcAddress apisinin yerini ASProt1 ile değiştir.
  4. İhtiyaca göre dll deki sabitleri değiştir.trialdays,trialexec,regname vs.regname in benim yaptığım gibi iki satırlık olması daha iyi.

Bu yöntem ile artık eskisi gibi patch yapmaktan kurutuluruz umarım.Tabi ben crack ile beraber dll dağıtmaktan pek hoşlanamdığım için exeyi patch ettim ama inanın bana dll yöntemi en sağlam ve en pratik olanı.

 

Son Notlar

Bu yazıda yazım yanlışları hatta bilgi hatası olabilir.Eğer bir yanlış bulursanız bana email atın düzeltmeye çalışırım.Bir programı eğer gerçekten kullanıyorsanız, programı satın almayı düşünün.Micro$oft programlarını - bırakın satın almayı - kullanmayı bile düşünmeyin.