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”
“Windows Belleğiyle Konuşan Kodlar”
hacker