Assembly dilinde komutlar, genellikle mikroişlemcinin çalıştırdığı makine diline dönüştürülür ve bu dönüştürülmüş komutlar mikroişlemci tarafından yürütülür. Örneğin, bir Assembly dilinde yazılmış programın çalıştırılması için, öncelikle programın Assembly dilinde yazılmış olan komutlarının, mikroişlemcinin anlayabileceği makine diline dönüştürülmesi gerekir. Bu dönüştürme işlemine derleyici (compiler) adı verilir. Derleyici, Assembly dilinde yazılmış komutları makine diline dönüştürür ve dönüştürülmüş komutları bir dosyaya kaydeder. Bu dosya, mikroişlemci tarafından okunarak ve yürütülerek, Assembly dilinde yazılmış olan programın çalıştırılmasını sağlar.
Assembly dilinde komutları kullanarak, mikroişlemci tarafından yapılabilecek işlemleri daha ayrıntılı olarak kontrol edebilirsiniz. Örneğin, veri hafızasındaki değerleri okuyarak ve yazarak, veri hafızasında işlem yaparak veya giriş/çıkış cihazları ile iletişim kurarak gibi işlemleri yapabilirsiniz.
Assembly dilinde kullanılabilecek birçok komut var. Aşağıda bazı örnekler verilmiştir:
- mov: Verilen kaynak değeri, hedef değişkene kopyalanır. Örneğin: mov ax, bx komutu AX değişkenine BX değişkeninin değerini kopyalar.
- add: Verilen kaynak değer, hedef değişkene eklenir. Örneğin: add ax, bx komutu AX değişkenine BX değişkeninin değerini ekler.
- sub: Verilen kaynak değer, hedef değişkenindan çıkarılır. Örneğin: sub ax, bx komutu AX değişkenindan BX değişkeninin değerini çıkarır.
- mul: Verilen kaynak değer, hedef değişkeniyle çarpılır. Örneğin: mul ax, bx komutu AX değişkenini BX değişkeniyle çarpar.
- div: Verilen kaynak değer, hedef değişkene bölünür. Örneğin: div ax, bx komutu AX değişkenini BX değişkenine böler.
- inc: Verilen değişkenin değeri 1 artırılır. Örneğin: inc ax komutu AX değişkeninin değerini 1 artırır.
- dec: Verilen değişkenin değeri 1 azaltılır. Örneğin: dec ax komutu AX değişkeninin değerini 1 azaltır.
- cmp: İki değer arasında karşılaştırma yapılır. Örneğin: cmp ax, bx komutu AX değişkenini BX değişkeniyle karşılaştırır.
- jmp: Verilen etikete atlanır. Örneğin: jmp start komutu “start” etiketine atlar.
- je: Eğer karşılaştırma sonucu eşitse, verilen etikete atlanır. Örneğin: je equal komutu “equal” etiketine eğer karşılaştırma sonucu eşitse
- loop: Verilen etiketi belirtilen sayıda iterasyon yapar. Örneğin: loop 5 komutu etiketi 5 kez iterasyon yapar.
- call: Verilen etikete atlar ve geri döndükten sonra çalışmaya devam eder. Örneğin: call func1 komutu “func1” etiketine atlar ve geri döndükten sonra çalışmaya devam eder.
- ret: İşlevden döndürür ve çağrıldığı yere geri döner.
- int: Bir işlev çağırır ve kontrolü işlevin sonuna kadar işlevin yürütülmesine bırakır. Örneğin: int 21h komutu 21h numaralı işlevi çağırır.
- nop: Hiçbir işlem yapmayacak bir komuttur.
- hlt: Çalışmayı durdurur.
- xor: İki değerin bitlerine göre XOR işlemi yapar. Örneğin: xor ax, bx komutu AX ve BX değişkenlerinin bitlerine göre XOR işlemi yapar.
- and: İki değerin bitlerine göre AND işlemi yapar. Örneğin: and ax, bx komutu AX ve BX değişkenlerinin bitlerine göre AND işlemi yapar.
- or: İki değerin bitlerine göre OR işlemi yapar. Örneğin: or ax, bx komutu AX ve BX değişkenlerinin bitlerine göre OR işlemi yapar.
- not: Verilen değerin bitlerinin tersini alır. Örneğin: not ax komutu AX değişkeninin bitlerinin tersini alır.
- shl: Verilen değerin bitlerini sola kaydırır. Örneğin: shl ax, 2 komutu AX değişkeninin bitlerini 2 pozisyon sola kaydırır.
- shr: Verilen değerin bitlerini sağa kaydırır. Örneğin: shr ax, 2 komutu AX değişkeninin bitlerini 2 pozisyon sağa kaydırır.
- in: Bir giriş cihazından (örneğin, klavye veya fare) veri okur. Örneğin: in al, 60h komutu 60h numaralı giriş cihazından veri okur ve AL değişkenine yazar.
- out: Bir çıkış cihazına (örneğin, ekran veya yazıcı) veri yazar. Örneğin: out 60h, al komutu AL değişkenindeki veriyi 60h numaralı çıkış cihazına yazar.
- push: Bir değerin, Yığın (stack) yapısının üstüne eklenmesini sağlar. Örneğin: push ax komutu AX değişkenindeki değeri Yığın yapısının üstüne ekler.
- pop: Yığın yapısının üstündeki değeri alır ve verilen değişkene yazar. Örneğin: pop ax komutu Yığın yapısının üstündeki değeri alır ve AX değişkenine yazar.
- enter: Bir işlevde, Yığın yapısının üstüne işlevin parametreleri ve önceki konum kaydırıcısı (frame pointer) değerinin yazılmasını sağlar. Örneğin: enter 0, 0 komutu Yığın yapısının üstüne işlevin parametreleri ve önceki konum kaydırıcısı değerinin yazılmasını sağlar.
- leave: Bir işlevden çıkarken, Yığın yapısındaki değerleri siler ve önceki konum kaydırıcısı değerini Yığın yapısından alır. Örneğin: leave komutu bir işlevden çıkarken, Yığın yapısındaki değerleri siler ve önceki konum kaydırıcısı değerini Yığın yapısından alır.
- les: Bir segmantasyon hatası vermeyen şekilde, verilen değişkene bir segment ve bir offset değerini yükler. Örneğin: les bx, [si] komutu SI değişkenindeki adresi gösterdiği yerden bir segment ve bir offset değerini alır ve BX değişkenine yükler.
- lodsb: Bir veri yükleme işlemi yapar ve verilen değişkeni bir adım ilerletir. Örneğin: lodsb komutu SI değişkenini gösterdiği yerden bir veri yükler ve SI değişkenini bir adım ilerletir.
- scasb: İki veri arasında karşılaştırma yapar ve verilen değişkeni bir adım ilerletir. Örneğin: scasb komutu AL değişkenindeki veriyi DI değişkenini gösterdiği yere yazılmış veriyle karşılaştırır ve DI değişkenini bir adım ilerletir.
- stosb: Verilen değişkenin değerini, verilen adreslere yazar ve verilen değişkeni bir adım ilerletir. Örneğin: stosb komutu AL değişkenindeki veriyi DI değişkenini gösterdiği yere yazar ve DI değişkenini bir adım ilerletir.
- loopz: Verilen etiketi, ECX değişkeni sıfırdaysa ve Z flagı 1 ise iterasyon yapar.
Assembly dilini tersine mühendislikte, bir binary dosyasının (örneğin, bir executable dosyasının) içinde yer alan makine diline dönüştürülmüş Assembly kodunun okunması ve anlaşılması amacıyla kullanılır. Bu işlem, bir binary dosyanın çalışma mantığını anlamaya veya bir güvenlik açığının bulunması amacıyla yapılabilir.
Tersine mühendislik süreci, binary dosyanın içinde yer alan makine diline dönüştürülmüş kodun, öncelikle bir disassembler (tersine çözümleyici) programı kullanılarak Assembly diline dönüştürülmesiyle başlar. Bu Assembly kodu, bir Assembly diline özgü olarak yazılmış olan ve human-readable (insan tarafından okunabilir) bir şekle getirilir. Bu Assembly kodu, sonraki aşamalarda incelenir ve anlaşılmaya çalışılır.
Tersine mühendislik süreci, genellikle bir binary dosyayı inceleyen ve anlamaya çalışan bir güvenlik açığı bulucusu tarafından yapılır. Bu süreç, ayrıca bir binary dosyanın çalışma mantığını anlamaya çalışan bir yazılım mühendisi tarafından da yapılabilir. Tersine mühendislik süreci, yaygın olarak kullanılan araçlar ve teknikler kullanılarak yapılır. Bu araçlar ve teknikler, genellikle disassembler programları, debugge’lar ve hex editor’lar olabilir.
Yaygın olarak kullanılan araçlar ve teknikler, tersine mühendislik sürecinde kullanılır ve bu sürecin etkili bir şekilde yapılmasını sağlarlar. Örnek olarak, aşağıdaki araçlar ve teknikler verilebilir:
- Disassembler programları: Bu programlar, binary dosyaların içinde yer alan makine diline dönüştürülmüş kodun, Assembly diline dönüştürülmesine yardımcı olur. Örnek olarak, IDA Pro, Binary Ninja ve Ollydbg gibi disassembler programları kullanılabilir.
- Debugge’lar: Bu programlar, binary dosyaların çalışması sırasında, içinde yer alan kodun çalışma mantığını anlamaya yardımcı olur. Örnek olarak, GDB, WinDbg ve Ollydbg gibi debugge’lar kullanılabilir.
- Hex editor’lar: Bu programlar, binary dosyaların içinde yer alan verinin, hexadecimal (onaltılık) gösterim şeklinde görüntülenmesine yardımcı olur. Bu sayede, binary dosyaların içinde yer alan verinin ne olduğu ve ne işe yaradığı anlaşılmaya çalışılır. Örnek olarak, HxD, 010 Editor ve Hex Workshop gibi hex editor’lar kullanılabilir.
Tersine mühendislik (reverse engineering) sırasında kullanılabilecek bazı Assembly dilinde komutlar şunlardır:
- disassemble: Bir makine diline yazılmış kodun, Assembly diline dönüştürülmesini sağlar.
- debug: Bir kod parçacığının çalışma sırasında adım adım izlenmesini sağlar.
- trace: Bir kod parçacığının çalışma sırasında çalıştığı işlemlerin takip edilmesini sağlar.
- breakpoint: Bir kod parçacığının çalışma sırasında, belirli bir noktada durdurulmasını sağlar.
- patch: Bir kod parçacığının, çalışma sırasında değiştirilmesini sağlar.
- dump: Bir veri hafızasının, çalışma sırasında okunmasını ve ekranda gösterilmesini sağlar.
- examine: Bir verinin, çalışma sırasında incelenmesini ve ekranda gösterilmesini sağlar.
- search: Bir verinin, veri hafızasında aranmasını ve bulunmasını sağlar.
- compare: İki verinin, çalışma sırasında karşılaştırılmasını sağlar.
- calculate: Bir verinin, çalışma sırasında hesaplanmasını sağlar.