Image

Malware giriş.

Malware

BlackNullSec Path #2: Pointer Nedir?

🚀 Amaç:Bir pointer, bellekteki bir adresi tutan değişkendir. Yani başka bir değişkenin adresini saklar.

🔎 Neden Pointer Kullanırız?

  • Pointer Arithmetrics:Verini türü belli olmadıgnda yada +1 byte ilerlertmek için kullanılır.
  • Memory Walking: Türü belli olmayan verileri yurutmek için kullanılır.
  • Void Pointer: Girilen verinin türü belli olamyacagı yada her türlü veri kullanmak için .
  • Cast Etme :Belli olmayan verilerin türüne degiştirme .

🧪 Pointer Arithmetrics

Not: Bir pointer +1 eklemek byte ilerletmez.Pointer tutugu tipin boyutu kadar ilerler
ÖR:
 int= 4 byte
 char= 1 byte
 double= 8 byte 

ÖR=
 int=*p
 p=p+1  //4 byte ilerler


 ÖR= Pointer Arithmetrics(Malware için onemli)

 typedef struct{
  int id;
  int age;
  int score;

 }info

 int main (){
  info data={1,25,90};
  int *ptr=(int*)&data;

  printf("%d\n",*ptr);     //id
  printf("%d\n",*(ptr);   //age
  printf("%d\n",*(ptr+2); // score 
 }

Memory Walking

Formül: (Address + offset) = (BasePointer + n × sizeof(type))
NOT= Eger pointer char* ise (p+n)-> n byte ileri, memory walking için ideal. Eger pointer türü int*size ise p+n -> n*4 byte ileri Eger pointer türü void* ise p+n çalışmaz çünkü void* Pointer Arithmetrics yasak unsigned char *p=(unsigned char*)memory
ÖNEMLİ: Memory walking her zaman (unsigned char*) ile yapılır.
ÖNEMLİ: Her zaman memory walking'de "unsigned char *p=(unsigned char*)memory; bu sayede trden kurtulur ve 1 byte şeklinde ilerler
ÖNEMLİ: unsigned char *p = (unsigned char*)memory; int id = *(int*)(p); // 4 byte INT short flag = *(short*)(p+4); // 2 byte char c = *(char*)(p+6); // 1 byte
Önemli=Daha sonra türüne cast edilmelidir

Void Pointer

Void Pointer nedir= void* tipi belli olmayan pointer yani "bu bir adres ama içinde ne var bilmiyorum" AMA void olunca tür yok-> boyut yok-> arithmetrics yok Neden WİNDOWS apı neden hep void* kullanır. Çünkü her türden veri verecegim her türlü veri ile çalışırsam sebep tek bit fonksiyon farklı veri tipleriyle çalışabilsin
ÖNEMLİ: Void Pointer ile çalışabilmenin sırrı= cast etmek dogru türe cast etmek
  ÖRNEK=

  void *p;
  int x=1337;
  p=&x;
  int val=*(int*)p;
Doğru Türe Cast Etme
1.)void *p; → türsüz bir pointer oluşturur.

2.)int x = 1337; → integer değişken yaratır.

3.)p = &x; → x'in adresi türsüz pointer’a atanır.

4.)(int*)p → p’deki adresi int pointer olarak yorumlar.

5.)*(int*)p → adresin işaret ettiği integer değeri okur.

6.)val değişkeni 1337 olur.
   

⚠️ Kritik Uyarı

Bu teknikler yalnızca eğitim amaçlıdır. Gerçek sistemlere uygulanması yasadışı olabilir. Asla gerçek ortamlarda test etme.

BlackNullSec
“Windows Belleğiyle Konuşan Kodlar”