AATools v4.31 |
|
|
|
Program Tipi: Bir sürü inter aracı bir arada |
|
|
|
|
|
|
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.
|
|
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.
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ı.
|
|
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.