Program Crackleme
 
Program Crackleme
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 DOSprogramlarinda 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 fonksiyonlarprogramlari 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 birDisassembler 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 2.52 

Nereden Bulurum : www.bpsoft.com 

Kirarken Kullanilan Programlar :Wdasm89 & HexWorkshop 2.52 

Ö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 karsilasiyoruz.EgerBu 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 tikladigimizdaise bir Serial Number soran pencere ile karsilasiyoruz. Öyleyse bize burada bir dogru serial numara yada programa dogru oldugunu zannetirecek bir yöntem gerekli. Programi disassemble ederek ise basliyabiliriz. Programin disassembleislemi bittikten sonra kullandigi windows fonksiyonlarini inceleyelim functions menusunden imports ‘a baktigimizda user32.getwindowtexta fonksiyonu ise yarayabilir diyoruz ve ilk denememizi bu fonksiyon ile yapiyoruz . Programi loadedip user32.GetWindowTextA fonksiyonlarinin kullanildigi yerlere durak noktasi koyuyoruz. Assagi yukari 7- 8 arasi durak noktasi koyduktan sonra programi çalsitirip Demonstration Version menüsünü tiklayip Serial Number olarak herhangi bir no giriyoruz.Ben 99999999 girdim ve register tusuna bastiginizda HOP Wdasm içinde buluyoruz kendimizi yani ise yaradi !! . Daha sonra F8 tusu ile hatali Serial 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 yapalimve her islenen kosullu dallanma komutuna bir durak noktasi daha koyalim. 


:0043178B E8E8DC0100 call 0044F478 à Serial 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 Serial 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 serial 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 Crackimiz tamamlanmis olucaktir.Wdasm programindan aradigimiz byte larin 30BE3h adresinde yer aldigini görüyoruz .Hexworkshop programinin kendisini kullanip Hworks32.exe 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 SerialNumber kodu yazip Register etmek kaliyor.
 
ASSEMBER HAKKINDA BİLGİ
Assembler programlama dili, çoğu zaman özel alanlarda geliştirilen programlarda kullanılan alt düzel bir Programlama dili olarak tanımlanır. Bu dilin komutları, bilgisayarın doğrudan işlettiği makine dili komutlarının birebir karşı lığıdır. Bu nedenle bu dil için makine dili de denilebilir.
 
Her ne kadar uzman programcıların özel alanlarda kullandığı bir dil olarak tanımlansa da, programcılar istedikleri takdirde her türlü uygulamayı bu dil ile geliştirebilirler yada kullandıkları üst düzey dil altından çağırabilecekler i procedurleryazabilirler. Çünkü hemen hemen her dilde assembler için destek bulunmaktadır.
 
Dilin en büyük avantajı CPU çevrebirimlerinin ve ana belleğin çok iyi bir şekilde kontrolünü sağlamasıdır. Ayrıca işletim sistem fonksiyonlarını da çok kolaylıkla kullanmak mümkündür. Assembler program dili derleyicisi kullanılan komutların birebir makine dili karşılıklarını üretir. Bu nedenle bu dil ile oluşturulan programlar olabilecek en kısa programlar olurlar.
 
Bir assembler programı çalışabilir bir programın tüm kesimlerinin tam olarak tanıtılması ile oluşturulabilir. Bu nedenle bir assembler programda minimum üç ana kesim bulunmalıdır.
 
1 - STACK Segment
 
2 - DATA Segment
 
3 - CODE Segment
 
Basit bir assembler programı;
 
STACK SEGMENT PARA ‘STACK’
 
DB 64 DUP (‘STACK’)
 
STACK ENDS
 
DATA SEGMENT PARA ‘DATA’
 
MESAJ DB ‘BU BİR ASSEMBLER PROGRAMIDIR $’
 
DATA ENDS
 
CODE SEGMENT PARA ‘CODE’
 
ANA PROC FAR
 
ASSUME CS;CODE, DS;DATA, ES;DATA, SS;STACK
 
PUSH DS
 
SUB AX,AX
 
PUSH AX
 
MOV AX,DATA
 
MOV DS,AX
 
MOV ES,AX
 
LEA DX,MESAJ
 
MOV AH,09
 
INT 21H
 
RET
 
ANA ENDP
 
CODE ENDS
 
END
 
 
1. BİLGİNİN TEMSİLİ
 
Elektronik bilgi işlem makinalarında bilgiler elektriksel uyarımlarla temsil edilirler. Bu uyarımların ifadesi 1 ve 0’lardan oluşan rakamlarla temsil edilirler. Bu uyarımları BIT adı verilir. Açıktır ki bir BIT ile 0 ve 1 gibi iki b ilginin temsilisözkonusudur. Ancak günlük hayatta kullandığımız bilgiler 2 adet değildir. Bu nedenle BIT’ler guruplanarak kullanılırlar. En küçük BIT gurubu 8 bitten oluşan guruptur ki bu guruba BYTE adı verilir. Bir byte ile +127 ile -127 arasındakirak amlar ile harflerin temsili mümkün olur. Bir byte ile temsil edilen harfler için kullanılan en yaygın stantdart ASCII(American Standard Code for Infırmation Interchange) standartdır.
 
2- VERİ TİPLERİ
 
Bir programlama dilinin temel özelliklerinden birisi dilin içinde kullanılacak olan veri tipleridir. Burada assembler dilinde kullanılan en basit veri tiplerinden bahsedilecektir.
 
Assembler programlama dilinde kullanılacak olan bilgilerin uzunlugu bilgisayarın mikroişlemcisine baglıdır. 8088 mikroişlemci için en fazla 16 bit uzunlugunda bir veri temsil edilebilir. 80286, 80386 ve 80486 mikroişlemcileri daha gelişmiş oldukları için kullandıkları bilgi uzunlugu daha fazla olabilir.
 
2.1 BYTE
 
Byte 8 bitten oluşan bir bilgi birimidir. Assembler’da byte ile hem nümerik hemde alfanümerik bilgileri temsil etmek mümkündür.
 
Gerek BYTE gerekse diger veri tiplerinde sayılar işaretli ve işaretsiz olarak iki ana guruba ayrılırlar. İşaretsiz sayılar tüm veri alanını bir bütün olarak degerlendirildiği bir durumu ifade eder. Sayıların işaretli veya işaretsiz olması makine açısından izafi bir durumdur.
 
 
1 0 0 0 0 0 0 1 İşaretsiz 129 sayısını temsil eder.
 
1 0 0 0 0 0 0 1 İşaretli -1 sayısını temsil eder.
 
Negatif sayılarda en duyarlı bit 1 olur.
 
 
Byte iki ana kısımdan oluşur. Her kısıma NIBBLE adı verilir. Her NIBBLE bir hexadecimal sayıyı temsil eder.
 
 
1 0 0 0 0 0 0 1
 
----------- -------------
 
2.NIBBLE 1.NIBBLE
 
2.2 WORD
 
2 Adet Byte ile oluşturulmuş bir yapıdır. 8088 ve diğer mikroişlemciler 16 bit uzunluğundaki bu yapıyı desteklerler. Word yapısını bir bütün olarak işleyebileceğiniz gibi yüksek byte (HB) veya Low byte (LB) olarak da işleyebilirsini z.
 
2.3 DOUBLEWORD
 
İki word uzunluğunda yani 32 bit uzunluğunda bir yapıdır. Gerek adreslemede gerekse büyük sayıların saklanmasında kullanılır.
 
2.4 QUADWORD
 
64 Bit uzunluğunda bir yapıdır. 4 word’un birleştirilmesi ile oluşturulur.
 
8088 Mikroişlemcisi olan bir makinada direkt mikroişlemcinin desteklediği BYTE ve WORD kavramları kullanılabilir. 80286, 80386 ve üzeri mikroişlemcilerde BYTE ve WORD kavramlarının dışında DOUBLEWORD ve QUADWORD kavramları da kulla nılabilir. 8088 mikroişlemcilerde WORD’den daha uzun sabit ve değişkenler de kullanılabilir. Ancak bu kullanım direkt mikroişlemci destegi dışında yazılım desteği ile olur.
 
3- MİKROİŞLEMCİ TASARIMI
 
Bir mikroişlemci,kendisine bağlı çevre birimlerle haberleşebilmek, yürütmekte olduğu programları kontrol edebilmek için REGİSTER adı verilen, kendi iç yapısında fiziksel olarak bulunan RAM elemanlarını kullanır. REGİSTERLER bir mikroişlemcinin en temel bileşenlerinden biridir. İntel 80xxx serisi mikroişlemcilerde uzunlukları değişmekle beraber aşağıdaki registerler bulunur.
 
 
Genel Amaclı Registerler
 
 
AX Ah-Al Accumulator
 
BX Bh-Bl Base
 
CX Ch-Cl Counter
 
DX Dh-Dl Data
 
 
Segment Registerleri
 
 
CS Code Segment
 
DS Data Segment
 
SS Stack Segment
 
ES Extra Segment
 
 
Offset Registerleri
 
 
IP Instraction Pointer
 
SP Stack Pointer
 
BP Base Pointer
 
SI Stack Information
 
DI Data Information
 
 
Flag Registerleri
 
 
Flag
 
 
3.1 Genel Amaçlı Registerler
 
AX,BX,CX,DX registerleri genel amaçlı registerlerdir. Mikroişlemci programları çalıştırırken verileri ana bellek ile iç bellek arasında sürekli olarak taşır. Genel amaçlı registerler bu taşıma sırasında aracılık ederler. Aynı zaman da matematiksel işlemlerde giriş ve çıkış noktaları olarak kullanılırlar. X
 
Bu registerlerin tamamı 16 bit uzunluğunda olup, 2 byte’tan oluşurlar. Byte’lar bir bütün olarak kullanılabileceği gibi ayrı ayrı da kullanılabilirler.
 
3.1.1 AX YAZMACI
 
Programlarda en çok kullanılan yazmaçlardan biridir. Accumulator’ün kısaltılması sonunda oluşan AX yazmacı bütün giriş ve çıkış işlemlerinde ve bazı aritmetik işlemlerde kullanılır.
 
AX
 
--------------------------------------------------------
 
AH AL
 
 
3.1.2 BX YAZMACI
 
BX Registeri Base register olarak da bilinir. RAM ve IO işlemlerinde adreslemede kullanılır. Register adresleme işlemlerinde daha çok offset degerlerini tutar. Ayrıca hesaplama işlemlerinde de kullanılır.
 
BX
 
--------------------------------------------------------
 
BH BL
 
3.1.3 CX YAZMACI
 
CX Registeri Counter registeridir. Döngü işlemlerinde ve kaydırma işlemlerinde sayaç olarak kullanılır.
 
CX
 
--------------------------------------------------------
 
CH CL
 
 
3.1.4 DX YAZMACI
 
Register bazı giriş çıkış işlemlerinde ve matematiksel işlemlerde kullanılır.Daha çok çarpma ve bölme işlemlerinde büyük sayıları saklamak için AX registerinin bir parçasıymış gibi kullanılır.
 
DX
 
--------------------------------------------------------
 
DH DL
 
 
3.2 Segment Registerleri
 
3.3 Pointer ve Index Registerleri
 
3.4 PSW Registeri
 
 
4. BELLEK , SEGMENT, OFFSET
 
5. DEBUG PROGRAMI
 
Debug programı exe veya com tipli, diger bir deyişle makine dili formatlı program dosyalarının çalıştırılması, bu programların bellek yerleşimlerinin, cpu üzerindeki etkilerinin ve verilerinin incelenmesi, değiştirilmesi vs. amacıyla ku llanılanbir programdır.
 
Debug programı ile bir makine dili programı bellege yükleyebilir, bu programı step step çalıştırabileceğiniz gibi programın belli bir kısmını çalıştırabilirsiniz veya programın makine dili kodları üzerinde değişiklik yapabilir, programa yeni kodlar ekleyebilir veya çıkarabilirsiniz. Yada herhangi bir programı assembly kullanarak veya makine dili kullanarak yeniden oluşturabilirsiniz.
 
5.1 Debug Komutları.
 
Debug programı dos işletim sisteminin bir parçasıdır. Bu nedenle dos versionları arasında komutlarda veya komut özelliklerinde değişiklikler olabilmektedir. Burada programın tüm komutlarını anlatmak yerine program yazmayı veya incelemeyi sağlayacak olan komutlar üzerinde durulacaktır.
 
A Assemble Assembly programlarının yazılmasını saglar.
 
G Go Bellekte yüklü olan bir programın çalıştırılmasını sağlar.
 
L Load Diskten belleğe bir proğramın yüklenmesini sağlar.
 
N Name Bellekteki program için isim seçmeyi sağlar.
 
Q Quit Programdan çıkarak işletim sistemine dönmeyi sağlar.
 
R Register Register degerlerini görme ve değiştirme.
 
T Trace Bellekteki bir veya daha fazla komutun çalıştırılmasını sağlar.
 
U Unassembly Assembly kodlarının makine dili karşılıklarını almanızı sağlar.
 
W Write Bellekteki proğramın diske yazılmasını sağlar.
 
Program sistem komut satırından debug yazılarak çalıştırılabilir. Program çalıştırılırken eger bir program bellege yüklenecekse bu program ismi komut satırından verilebilir. Program çalıştığında ekranın sol tarafında ( - ) işareti belirecektir. Bu prompt debug programının komut almaya hazır olduğunu gösterir.
 
5.1.1 A Assembly Komutu
 
A Komutu assembly program yazmak için kullanılır. Bu komutun kullanılış şekli;
 
 
-- A [segment:offset]
 
şeklindedir.
 
Komutun parametresi olan adres, yazılacak programın bellegin neresinden itibaren yerleşeceğini gösterir. Parametre seçimliktir. Eğer verilmeyecek olur ise mevcut CS ve IP üzerindeki değerler komutun parametresi olarak varsayılır. Komuttan sonra hiç bir parametre vermeyeceğiniz gibi sadece offset adresi de verebilirsiniz. Eğer komuttan sonra sadece tek bir sayı verilmişse verilen değer offset olarak algılanır ve IP registerine bu deger verilerek programın defaultsegment ve belirlenen offset üzerinde n yazılması sağlanır.
 
Komutun çalıştırılması ile, default veya belirlenen segment ve offset adresi yeni bir satır başına yazılarak bu adresin yanında komut girişi için beklenir. Her komut girilip enter tuşuna basıldığında debug ilk önce girilen komutu yorumlar ve girile n komut doğru ise segment ve offset adresleri yazılan komut uzunluğu kadar artırılarak yeni komut girişi için beklemeye başlar. Eğer girilen komut hatalı ise hata yeri gösterilerek komutun tekrar girilmesi için aynı segmet ve offsetadreslerinde beklenir. Eğer herhangi bir satırda komut girilmeyerek enter tuşuna basılırsa debug komut satırına geri döner. Örnek;
 
C>Debug
 
- A
 
2054:0100 Push Ds
 
2054:0101 Mov Ax,B800
 
2054:0104 Mov Ds,Ax
 
2054:0106 Mov Si,0000
 
2054:0109 Mov Word [Si],7941
 
2054:010C Pop Ds
 
2054:010D Int 20
 
2054:010F
 
- G
 
 
Program yazılırken en son girilen komutun offset adresi default offset olarak alınır. A komutundan çıktıktan sonra tekrar aynı komut kullanılırsa default segmentin son kalınan offseti ekrana getirilir. Eğer programa ek yapılacaksa bu yöntem kullanı labilir. Ancak herhangi bir komut değiştirilecekse komuta girilirken değiştirilecek satırın segment ve offset adresi verilerek girilmelidir.
 
A komutu ile girilen komutlar belleğe peşpeşe yerleştirilirler. Bu nedenle yazılmış bir proğramın değiştirilmesi oldukça zordur. Eğer değiştireceğiniz komut uzunluğu daha önce yazdığınız komut uzunluğu ile aynı ise problemsiz bir değişimsözkonusu olabilir. Ancak yazacağınız komut eskisinden uzun ise M komutu ile ramde yer açmak gerekir.
 
5.1.2. G Go Komutu
 
Go komutu hafızadaki bir programın icra ettirilmesi amacı ile kullanılır. Komutun formatı;
 
 
- G Adres
 
şeklindedir.
 
Komuttan sonra verilen Adres parametresi seçimliktir. Adres verilmez ise program CS;IP ikilisindeki değerler default olarak alınarak çalıştırılır. Verilen adres her zaman programın başlatılacağı adres olarak alınır. Bu değer sadece offsetolarak ve rilebileceği gibi segmet ve offest olarak da verilebilir.
 
Hafızadaki herhangi bir program RET yada INT 20 komutlarından biri ile bitmelidir. G komutu bu iki assembler komutundan birini icra ettirdiğinde PROGRAM TERMINATED NORMALLY deyimi ile sona erer. Bahsedilen komutlar program icrasını sona erdirerek k omut satırına dönmeyi sağlar. Herhangi bir program bu iki komuttan biri ile sona ermiyor ise makinanız denetimsiz komutlar yüzünden kilitlenecek yada istem dışı davranacaktır.
 
Herhangi bir proğramı birden fazla sayıda çalıştıracaksanız ikinci ve sonraki çalıştırmalarda CS:IP ikilisinin değerlerinden emin olmalısınız. CS:IP ikilisine istediğiniz herhangi bir değeri R komutu ile atayabilirsiniz.
 
5.1.3 L Load Komutu
 
L Komutu disk üzerindeki herhangi bir programın belleğe yüklenmesi için kullanılır. Komutun herhangi bir parametresi yoktur. Komut N komutu ile ismi belirlenmiş bulunan programı belleğe yükler.
 
5.1.4 N Name Komutu
 
N Komutu, L veya W komutu için dosya ismi seçmekte kullanılır. Komutun kullanım şekli;
 
- N Dosya Adı
 
şeklindedir.
 
Name komutu Load ve Write komutlarından önce kullanılarak diskten çağrılacak yada diske yazılacak dosyanın adını belirlemekte kullanılır.
 
5.1.4 Q Quit Komutu
 
Komut debug programını sonlandırır.
 
5.1.5 R Register Komutu
 
Komut CPU registerlerinin değerlerini görmek yada değiştirmek için kullanılır. R komutunun kullanım biçimi aşağıda verilmiştir.
 
- R Register Adı
 
Komut registerlerin kullanımı ile ilgili olmak üzere 3 ayrı görevi yerine getirir.
 
R : Komut tek başına kullanılırsa CPU registerlerinin o anki tüm degerleri gösterilir. Registerlerin yanısıra komut Flag registerinin degerlerini de temsili olarak gösterecektir. Komutun kullanımı sonunda CS:IP ile işaret edilen komut da ekranda göste rilecektir. R komutunun kullanımı sonunda aşağıdakine benzer bir görüntü alıncaktır.
 
- R
 
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
 
DS=2054 ES=2054 SS=2054 CS=2054 IP =0100 NV UP EI PL NZ NA PO NC
 
2054:0100 IE PUSH DS
 
 
NV UP EI PL NZ NA PO NC değerleri dışındaki tüm reğişterler daha önceki bölümlerde anlatılmıştı. Yukarıdaki değerler Flag registerinin temsili gösterimidir. Bu registerin alabileceği değerler aşağıda gösterilmiştir.
 
 
 
 
 
FLAGLAR
 
Overflow
 
Direction
 
Interrupt
 
Sign
 
Zero
 
Auxiliary Carry
 
Parity
 
Carry
BIT SET (1)
 
OV
 
DN
 
EI
 
NG
ZR
 
AC
 
PE
 
CY
BIT RESET (0)
 
NV
 
UP
 
DI
PL
NZ
NA
PO
 
NC
 
 
 
 
R komutundan sonra parametre olarak F harfi kullanılırsa program flagların değiştirilmesi için mevcut flagları ekrana getirir ve istediğiniz flagları değiştirmeniz için bekler. Bu durumda istediğiniz herhangi bir flagi set yada reset edebilirsiniz.
- R F
 
NV UP EI PL NZ NA PO NC - ZRUP
 
-
 
Yukarıdaki örnekte Zero flagı SET, direction flagı RESET edilmektedir.
 
R komutu ile sadece flagların değil tüm registerlerin degerleri değiştirilebilir. Bunun için R komutundan sonra değiştirilmesi istenen registerin isminin yazılması gerekir. Bu işlem gerçekleştiğinde registerin mevcut degeri ekrana yazılır ve ( : ) iş areti konularak registerin yeni degeri sorulur. Bu işaretin yanına deger 4 digit hexadecimal olarak verilmelidir. Eger bir deger verilmeyip enter tuşuna basılırsa registerin içeriği değiştirilmeyecektir.
5.1.6 T Trace Komutu
 
Trace komutu hafızada bulunan bir programın satırlarının tek tek veya belli bir kısmının çalıştırılması için kullanılır. Komutun kullanımı aşağıda verilmiştir.
 
- T=Adres Değer
 
Komutun parametreleri seçimliktir. Ilk parametre Adres parametresidir ki bu parametre kullanılacaksa komuttan sonra = işaretinin kullanımı zorunludur. Adres parametresi icra ettirilecek ilk komutun adresi olarak alınır.
 
Değer parametresi kaç adet komutun peşpeşe icra ettirileceğini gösterir. Eğer kullanılmamış ise bu değer 1 olarak alınır. Eğer herhangi bir parametre kullanılmaz ise komut CS:IP ile adreslenen yerden başlayarak 1 komut icra ettirilir ve komutun icr asından sonra registerlerin değeri ve işlenecek olan komut ekranda görüntülenir.
 
5.1.7 U Unassembly Komutu
 
U Komutu bellekteki programın makine dili ve assembly karşılıklarını ekranda listelemek için kullanılır. Komutun kullanım şekli aşağıda verilmiştir.
 
- U Adres1 Adres2
 
Parametre olarak verilen Adres1 listelenmek istenen programın başlangıç adresini gösterir. Bu adres segment ve offset olarak verilebilir. Bu adres verilirken herhangi bir komutu bölmemesine özen göstermek gerekir. Aksi halde ekrana getirilecek list e anlamsız bir liste olacaktır.
 
Ikinci verilen parametre listelemenin sonunu belirler. Burada verilecek adres offset niteliğinde olmalıdır. Segment Adres1’de belirtilen segment adresi olarak alınacaktır.
 
 
Örnek 1
 
 
U 101 106
 
 
2054:0101 B800B0 MOV AX,B000
 
2054:0104 8ED8 MOV DS,AX
 
2054:0106 BE0000 MOV SI,0000
 
 
Örnek 2
 
 
U 102 106
 
 
2054:0102 00B08ED8 ADD [BX+SI+D88E],DH
 
2054:0106 BE0000 MOV SI,0000
 
 
5.1.8 W Write Komutu
 
 
Bellekteki herhangi bir proğramın bir blok şeklinde diske proğram olarak yazılmasını sağlar. Komutun kullanım şekli;
 
W Adres
 
şeklindedir.
 
komuttan sonra verilen adres diske kaydedilecek proğramın başlangıç adresidir. Eğer bu parametre verilmezse 0100 offseti default olarak kabul edilir. Diske yazılacak programın uzunluğu BX:CX register çiftinden alınır.
 
Komut kullanılmadan önce N komutu ile diske yazılacak programın ismi belirlenmelidir. Aksi halde diske yazma işlemi default deger üzerinden yapılacaktır.
 
 
Örnek;
 
 
N Deneme.com
 
R BX
 
: 0000
 
R CX
 
: 0010
 
W
 
Writing 0010 Bytes
 
-
 
6. ASSEBLER PROGRAM YAPISI ve ILGILI KOMUTLAR
 
 
Bir program belleği parçalara bölerek (segmentleyerek) kullanır. Assembler programlarda da yapı itibariyle bellegin segmentlere ayrılması ve ayrılan her bölümün ayrı ayrı tanımlanarak kullanılması esastır. Bu nedenle bir assemblerprogramında genel itibariyle bölüm tanımları programın yapısını oluşturur. Genellikle bir proğramda geçici verilerin saklandığı stack, kalıcı verileri saklamak için data ve program kodlarının saklandığı code segment bölümleri yer alır. Birassembler programının örnek yapı sı aşağıda verilmiştir.
 
 
STK SEGMENT PARA ‘STK’
 
Tanimlar
 
Tanimlar
 
STK ENDS
 
 
DAT SEGMENT PARA ‘STK’
 
Tanimlar
 
Tanimlar
 
DAT ENDS
 
 
COD SEGMENT PARA ‘COD’
 
ANA PROC NEAR
 
ASSUME SS:STK, DS:DAT, CS:COD
 
....
 
....
 
ANA ENDP
 
COD ENDS
 
END
 
 
 
6.1 Segment Komutu
 
 
Segment komutu programın kullandığı segment kesimlerini tanımlamak için kullanılır. Program içinde tanımlanan herhangi bir segment segment registerleri tarafından takip edilir. Tanımlanan herhangi bir segmentin hangi register tarafından takip edil ecegi ASSUME deyimi ile tanımlanır. Komutun kullanım şekli;
 
isim SEGMENT tip ‘sınıf’
 
şeklindedir.
 
 
Komut bir isim ile başlar. Tanımlanan isim degişken olabilme kurallarına uygun herhangi bir harf dizisidir. Tanımlanan isim program içinde yapılacak atamalarda vb. işlemlerde kullanılabilir.
 
Tip segmentin adreslenebilme tipini belirler. Bu deyim ile kullanılabilecek tip çeşitleri;
 
PAGE 256 Byte ve katlarıyla adreslenebilen segment
 
PARA 16 Byte ve katlarıyla adreslenebilen segment
 
WORD Word ve katlarıyla adreslenebilen segment
 
BYTE Byte ve katlarıyla adreslenebilen segment
 
 
Segment anahtar cümlesi ile başlayan bir segment ENDS cümlesi ile son bulmak zorundadır.
 
Örnek
 
STK SEGMENT PARA ‘STK’
 
Tanimlar
 
Tanimlar
 
STK ENDS
 
 
STK SEGMENT PAGE ‘STK’
 
Tanimlar
 
Tanimlar
 
STK ENDS
 
 
 
6.2 Assume Komutu
 
Mikroişlemciler program içinde bellek kesimlerini takip edebilmek için en az 3 adet segment registeri kullanır. Bu registerler CS, DS, SS registerleridir. CS registeri program kodlarını takip etmek için, DS registeri program içinde sabit olarak kul lanılan verileri saklamak için, SS registeri ise program içinde kullanılan geçici verileri saklamak için kullanılır.
 
 
Program içinde belirlenen segmet kesimlerinden hangisinin hangi register ile takip edilecegi assembler derleyicisine Assume deyimi ile bildirilir. Komutun kullanım şekli,
 
 
Assume register : segment , register : segment , ........ şeklindedir.
 
 
Örnek:
 
STK SEGMENT PARA ‘STK’
 
Tanımlar
 
Tanımlar
 
STK ENDS
 
 
DATA SEGMENT PARA ‘DAT’
 
Tanımlar
 
Tanımlar
 
DATA ENDS
 
 
CODE SEGMENT PARA ‘CODE’
 
BASLA PROC FAR
 
ASSUME DS:DATA, SS:STK, CS:CODE
 
6.3 Proc Komutu
 
 
Proc komutu Code segment içindeki bir işlem blogunun tanımlanmasını sağlar. Tanımlanan bloklar bir procedure davranabilirler ve diger bloklar tarafından CALL komutu ile çağrılabilirler. Her assembler programı içinde en az 1 işlemblogunun olması zo runludur. İlk çalışacak olan blok segment başlanğıcındaki bloktur. Bu bloktan diger bloklar çağrılabilir. Eger assembler program üst düzey dillerden çağrılacak bir program ise ilk çalışacak blok çağrılan blok olacağından segment başında olma zorunluluğu y oktur. Komutun kullanılış şekli;
 
 
isim PROC tip
 
şeklindedir.
 
İsim, degişken olabilme kurallarına uymak koşulu ile istenen herhangi bir harf dizisi olabilir. PROC deyiminden sonra gelen tip FAR veya NEAR olabilir. Bu deyimler ilerideki bölümlerde detaylı olarak anlatılacaktır. ilk çalışacak bölümün FAR, dige r bölümlerin NEAR olabileceğinin bilinmesi bu bölüm için yeterlidir.
 
Proc deyimi ile başlayan herhangi bir program blogu ENDP deyimi ile sonlandırılmalıdır.
 
Örnek:
 
STK SEGMENT PARA ‘STK’
 
Tanımlar
 
STK ENDS
 
 
DATA SEGMENT PARA ‘DAT’
 
Tanımlar
 
DATA ENDS
 
 
CODE SEGMENT PARA ‘CODE’
 
BASLA PROC FAR
 
ASSUME DS:DATA, SS:STK, CS:CODE
 
Push DS
 
Push SS
 
Mov Ax, 15h
 
.
 
.
 
CALL ATLA1
 
BASLA ENDP
 
 
ATLA1 PROC FAR
 
.
 
RET
 
ATLA1 ENDP
 
ENDS
 
END
 
6.4 Call/Ret Komutu
 
 
Call komutu herhangi bir işlem blogu içinden bir başka işlem blogunu çagırmak için kullanılır. Komut aynı segment içindeki(Near) işlem bloklarını çağırabileceği gibi farklı segment içindeki(Far) işlem bloklarını da çağırabilir. Komutun kullanılış ş ekli;
 
CALL Çağrılan Blok Adı
 
Call komutunun işlenmesi sırasında mikroişlemci çağrılan bloga gitmeden önce code segment içinde bulunduğu adresi stack segment içine saklar ve çağrılan yere dallanır. Çağrılan blok içinde işlemler sona erdikten sonra stack segmentesaklanan adrese tekrar geri dönülür. Çağrılan blok içindeki işlemlerin bittiği RET komutu ile belirlenir.
 
Ret komutu genel olarak parametresiz kullanılır ve stack segment içindeki bilginin CS:IP ikilisine aktarılmasını sağlar.
 
7. DEGİŞKEN VE SABİT TANIMLAMA
 
Assembler program içinde herhangi bir segment kesiminde degişken tanımlaması yapılabilir. Değişken ve sabit tanımlamaları;
 
DB
DW
DD
DQ
DT
DUP
Komutları ile yapılır.
 
7.1 DB Deyimi
 
Byte tipi bir degişkenin veya sabitin tanımlanmasını sağlar. Tanımlama byte tipinde bir alan olabileceği gibi dizi şeklinde bir alan da olabilir. Tanımlanan alan(ların) 8 bit olması nedeni ile bu alana 0 ile FF arasında herhangi bir degeratanabili r. Deyimin kullanılış şekli;
 
degişken DB ilk deger
 
Tüm değişken veya sabit tanımlama deyimleri ile tanımlanan alanlara ilk deger atama işlemleri tanımlama anında gerçekleştirilir. Eğer tanımlanan alana deger atanmayacak ise ilk deger olarak ? atanmalıdır. Aşağıdaki atamalar geçerli atamalardır.
 
SAYI DB 30 ;ilk değeri 30 olan SAYI sabit/değişkeni
 
SAY DB 0AH ;ilk değeri 10 olan SAY sabit/değişkeni
 
ABC DB ‘ADI SOYADI’ ;ilk değeri ADI SOYADI olan karakter dizisi
 
DIZI DB 0,1,2,3,4,5,6,7 ;değerleri 0,1,2,3,4,5,6,7 olan byte dizisi
 
ilk değer ataması sırasında bir dizi oluşturulacak ve dizinin içine belirli bir değer/değerler atanacaksa DUP deyimi kullanılır.
 
ABC DB 10 DUP (?) ;içerikleri olmayan 10 byte’lık bir dizi
 
ABC DB 50 DUP (0AH) ;İçerikleri 10 olan 50 byte’lık bir dizi
 
ABC DB 25 DUP (0,1) ;içerikleri 0,1,0,1.... olan 25 byte’lık bir dizi
 
7.2 DW Deyimi
 
iki byte’lık bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış şekli;
 
degişken DW ilk değer
 
şeklindedir.
 
 
MESAJ DW 1210H
 
SAYI1 DW ?
 
SAYI2 DW 10 DUP(0)
 
SAYI3 DW 0,0AABH,CCCAH
 
 
7.3 DD Deyimi
 
Dört byte’lık bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış şekli;
 
degişken DD ilk değer
 
şeklindedir.
 
MESAJ DD 12100000H
 
SAYI1 DD ?
 
SAYI2 DD 10 DUP(0)
 
SAYI3 DD 0,0AABC12H,0H
 
 
7.4 DQ Deyimi
 
64 bitlik, Sekiz byte’lık bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış şekli;
 
 
degişken DQ ilk değer
 
şeklindedir.
 
 
MESAJ DQ 12100000H
 
SAYI1 DQ ?
 
SAYI2 DQ 10 DUP(0)
 
SAYI3 DQ 0,0AABC12H,0H
 
 
7.5 DT Deyimi
 
Seksen bit 10 byte’lık bir sabit/değişken tanımlamasının yapılmasını sağlar. Deyimin kullanılış şekli;
 
degişken DT ilk değer
 
şeklindedir.
 
  Copyright Security Hack Platform  
 

bigoo.ws
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol