Esen,
Assembly kodlarlen(Hatta C/C++ kodlarken de) gerek duyacağınız iki API’den bahsetmek istiyorum: RtlZeroMemory ve RtlFillMemory. Bu ikisi sayesinde bellek alanını boşaltabilir ya da istediğimiz veriyle doldurabiliriz.
RtlZeroMemory
Sürekli veri alan ve bunu kullanan bir değişkenimiz olduğunu düşünelim. Assembly yazarken bir yazmaca bir değişken atatığınızda mesela:
mov eax, 0FFFFh
eax’in değeri neyse silinir ve istenilen yeni veri yazılır. Ama bir tampon değişken tanımladınız mesela:
girdi db 256 dup(?)
256 baytlık bu içine string yazmak istediğimiz değişkenimize arka arkaya birşeyler yazdırdığımız zaman atılan verilerin uzunluğuna bağlı olarak içeriği değişecek ve önceden kalan artık veriler olacaktır. Örneğin bu değişkene “Esenlikler” verisini attık. Sonra da “Naber” verisini atalım. Çıktı almak istediğimizde sonuç şu oluyor: “Naberikler”. Bunun gibi hataları almamak için değişkenimizin içerisini sıfırlıyoruz. Ancak bu sıfır doğal sayılarda olan ve onaltılık değeri “30h” olan sıfır değil. ASCII tablosundaki en sıfır değeri.
Sıfırlama yöntemlerimizden birisi “RtlZeroMemory” APIsi kullanımı da oldukça basit:
invoke RtlZeroMemory, addr girdi, 256 invoke RtlZeroMemory, addr girdi, SIZEOF girdi
API iki argüman alıyor değişkenin adresi ve ne kadarlık bölümü sıfırlanacağı.
API kullanmadan sıfırlamanın bir diğer yöntemi de:
cld lea edi, girdi mov ecx, sizeof girdi mov al, 0 rep stosb
RtlFillMemory
Bu API ise istenilen bellek bölgesini ya da adresi verilen değişkenin içini istediğiniz veri ile doldurur. Yani sıfırlamak için de bunu kullanabilirsiniz. Kullanımı oldukça basittir.
invoke RtlFillMemory, addr girdi, SIZEOF girdi, 047h; G ile doldurur invoke RtlFillMemory, addr girdi, SIZEOF girdi, 0; RtlZeroMemory'nin yaptığını yapar
Comments of this post