RtlZeroMemory ve RtlFillMemory kullanarak belleği, değişkenleri temizlemek

Kategori Assembly, Belgeler
24.06.2016
2511 Okunma

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

Henüz yorum bulunmuyor!