Program Nasıl Kırılır? |
08-17-2012 | #1 |
Prof. Dr. Sinsi
|
Program Nasıl Kırılır?Program Nasıl Kırılır? Bir programin kirilmasi o programin yazilis amaci disinda davranmasina sebep olmak olarak yorumlanabilirProgramlar belli bir programlama dilinde yazildiktan sonra derleyici denilen baska programlar ile çalistirilabilir kod haline çevrilir Bu çalisitirilabilir kod içerisinde CPU nun anlayacagi dilde ve isletim sisteminin özelliklerine bagli olarak makine dili olarak Hexedecimal (onaltilik) bir düzende bulunurMakine koduna çevrilmis programlar içerisinde programcinin yazmis oldugu kodu barindirmazlar Öyle ise programin içerigini derlenmis bir koddan açik ve net bir biçimde anlamak çok zordur Makine dili denilen dil aslinda rakamsal bir dildir Bu onaltilik sayi düzeninde bulunan kodlar ikilik sayi sistemine (binary) dönüstürülerek CPU ‘ya gider 0 ve 1 ler bilgisayarin isleyisindeki temel olan elektrik sinyali var (1) elektrik sinyali yok (0) olarak CPU tarafindan yorumlanarak programlar isler Makine dilininin bu zor ve anlasilmaz olusundan dolayi ASSEMBLY dili gelistirilmistir Bu dil bilgisayar dilleri içerisinde en alt düzey programlama dilidir Bu dil ile yazilan programlar CPU ya direkt olarak hitap eder Fakat bu dil ile uzun programlar yazmak ta oldukça zor ve gereksizdir Bunun yerine diger diller ile yazilan programlarda o programlama dilinin yetersiz kaldigi ya da yavas kaldigi noktalarda daha hizli ve direkt erisim olanagina sahip bir dil olan ASSEMBLY ile prosedür veya fonksiyonlar yazilir Günümüzde bu sadece bazi aygit sürücülerini yazarken yada virus lerde kullanilmaktadir Gelelim Windows programlarina ; Windows için yazilan programlar da çesitli programlama dilleri yada program gelistirme araçlari ile yazilarak derlenir ve çalistirilabilir kod haline dönüstürülür Bu çalistirilabilir kodun DOS programlarinda en belirgin farki içerisinde kullandigi isletim sistemini özel fonksiyonlaridir DOS isletim sisteminin INTERRUPT denilen bazi fonksiyonlari vardir Bu fonksiyonlar windows için yazdiginiz programlarin içerisinde direkt olarak yer almazlar bunun yerine Windows isletim sisteminin hali hazirda yazilmis fonksiyonlari kullanilir(Bu konu üzerinde istenirse daha ileriki yazilarimda durabilirim , ama simdilik bu kadar yeterli diyorum) Hepimizin mutlaka dikkatini çekmistir Windows / System dizini altinda bir çok DLL uzantili dosya mevcuttur Iste bu dosyalar içerisinde programlarin çalisirken kullandigi birçok fonksiyon yada tanim bulundururlar Iste bu fonksiyonlar programlari kirmamiza yardimci olacak noktalardir Daha önce de belirttigim gibi programlar makine dilinde bulunuyordu dosyalarda , öyleyse bunlari anlayabilecegimiz bir sekile sokmak için bu programlari ASSEMBLY diline çevirmemiz gerekecek Bu is için kullanacagimiz programlara Disassembler denilir Programlarin ham içerigini yani onaltilik sayi düzenindeki içerigini görüntüleyebilmek içinse HEX editör denilen programlara ihtiyacimiz olacak Bunun haricinde ise bazen programlarin CPU daki isenis sirasindaki içerigini görüntüleyebilen ve aslinda programlardaki hatalari ayiklamak için kullanilan Debugger denilen programlar ise ileride çok isimize yarayacak Öyle ise program kirmak için gerekli olan seyleri söyle siralayabiliriz 1-ASSEMBLY dilini bilmek 2- Windows isletim sistemini iyi tanimak ve fonksiyonlarini bilme (C++ kullananlar bu konuda pek zorluk çekmiyecektir ) 3-Iyi bir Disassembler programi 4-Hexeditör programi 5-Debugger programi 6- Sabir (en gerekli sey) Bu saydiklarimin hepsine sahip oldugunuzda program kirmak için herseyiniz vardir anlamina geliyor Isterseniz küçük bir örnek ile baslayabiliriz Bu is için oldukça kolay bir korumasi olan ve bizimde kullanacagimiz bir program olan HEXWORKSHOP ile ise baslayabiliriz Bu program daha önce birçok kisi tarafindan ve farkli yöntemler izlenerek kirilmistir Benim izleyecegim yötem ise bazilariniza saçma gelebilir ama unutmayiki buradaki amacim kendimi ispat etmek degil sadece ögretmektir Hedef Program :HexWorkshop 252 Nereden Bulurum : wwwbpsoftcom Kirarken Kullanilan Programlar :Wdasm89 & HexWorkshop 252 Öncelikle programin Demo yada deneme sürümü olmasinin bize sagladigi dezavantajlari inceliyoruz Programi ilk açtigimizda karsimiza bu programin 20 gün süreli bir demo versiyon oldugunu hatirlatan bir pencere ile karsilasiyoruzEger Bu versiyonu bu yakin tarihte kurduysaniz ayrica size upgrade etmenizi öneren bir baska pencere daha çikiyor karsimiza Bunun haricinde programin Demonstration Version diye bir menüsü oldugunu görüyoruz , buraya tikladigimizda ise bir oooooo Number soran pencere ile karsilasiyoruz Öyleyse bize burada bir dogru oooooo numara yada programa dogru oldugunu zannetirecek bir yöntem gerekli Programi disassemble ederek ise basliyabiliriz Programin disassemble islemi bittikten sonra kullandigi windows fonksiyonlarini inceleyelim functions menusunden imports ‘a baktigimizda user32getwindowtexta fonksiyonu ise yarayabilir diyoruz ve ilk denememizi bu fonksiyon ile yapiyoruz Programi load edip user32GetWindowTextA fonksiyonlarinin kullanildigi yerlere durak noktasi koyuyoruz Assagi yukari 7- 8 arasi durak noktasi koyduktan sonra programi çalsitirip Demonstration Version menüsünü tiklayip oooooo Number olarak herhangi bir no giriyoruzBen 99999999 girdim ve register tusuna bastiginizda HOP Wdasm içinde buluyoruz kendimizi yani ise yaradi !! Daha sonra F8 tusu ile hatali oooooo Number girdigimize dair ekran çikana kadar devam ediyoruz ilerlemeye Bu noktaya gelene kadar islenen kodlari iyi takip edin çünkü en son islenen Dallanma komutunun yeri çok önemli yani (je , Jne , Jz , jnz , Ja , Jb gibi ) En nihayetinde hata ekrani çiktiginda OK ye basip islemi tekrar yapalim ve her islenen kosullu dallanma komutuna bir durak noktasi daha koyalim :0043178B E8E8DC0100 call 0044F478 à oooooo Number in ekrandan okunmasi :00431790 8B8DFCFEFFFF mov ecx, dword ptr [ebp+FFFFFEFC] :00431796 83C164 add ecx, 00000064 :00431799 E8F21BFDFF call 00403390 :0043179E 50 push eax :0043179F 8D45DC lea eax, dword ptr [ebp-24] :004317A2 50 push eax :004317A3 E8E8B90000 call 0043D190 :004317A8 83C408 add esp, 00000008 :004317AB 680C534800 push 0048530C :004317B0 8D45DC lea eax, dword ptr [ebp-24] :004317B3 50 push eax :004317B4 E867CE0000 call 0043E620 :004317B9 83C408 add esp, 00000008 :004317BC 85C0 test eax, eax :004317BE 0F8414000000 je 004317D8 :004317C4 8D45DC lea eax, dword ptr [ebp-24] :004317C7 50 push eax :004317C8 E893970000 call 0043AF60 :004317CD 83C404 add esp, 00000004 :004317D0 8945EC mov dword ptr [ebp-14], eax :004317D3 E907000000 jmp 004317DF :004317DF 837DEC00 cmp dword ptr [ebp-14], 00000000 :004317E3 0F8479000000 je 00431862 à Girilen oooooo Nuber Yanlis ise dallanma olur :004317E9 8B8DFCFEFFFF mov ecx, dword ptr [ebp+FFFFFEFC] :004317EF 83C164 add ecx, 00000064 :004317F2 E8991BFDFF call 00403390 :004317F7 50 push eax Yukarida görülen kod üzerinde daha fazla da çalisabilirir ama ben buna su an gerek duymuyorum ,çünkü bu program girilen numarayi dogru kabul ettikten sonra çalistigi dizinde bir dosya olusturuyor REG uzantisi olan bu dosya var olunca yada içerisinde belli bir imza olunca girilen oooooo numaranin dogru olup olmadigini bir daha hiç kontrol etmiyor ve böylece sonsuza dek Full version olarrak çalisiyor Anlasildigi gibi bu JE 00431862 komutunu JNE 00431862 yada tamamini NOP komutuna çevirirsek bu program girecegimiz herhangi bir kodu kabul edicek ve oooooimiz tamamlanmis olucaktirWdasm programindan aradigimiz byte larin 30BE3h adresinde yer aldigini görüyoruz Hexworkshop programinin kendisini kullanip Hworks32exe dosyasini açip 30BE3h adrsine gidiyoruz 0F8479000000 byte larini 909090909090 byte lari ile degistirip baska bir isimle kaydediyoruz Çünkü ayni isimle o an hafiza da olan bir dosyayi kayit edemeyiz Daha sonra HexWorkshop programindan çikip orijinal dosyanin adini baska bir isimle kaydedip kirilmis dosyayi orijinal adiyla kaydedersek program hazir olur Geriye çalistirip herhangi bir oooooo Number kodu yazip Register etmek kaliyor (alıntı) |
Konu Araçları | Bu Konuda Ara |
Görünüm Modları |
|