BlackNullSec Path #3: Memory Walking & Arithmetic?
🚀 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+1); //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
🧠 Memory Walking Formülü
🔥 EN KRİTİK FORMÜL
(Address + offset) = (BasePointer + n × sizeof(type))
(Address + offset) = (BasePointer + n × sizeof(type))
Açıklama:
BasePointer → başlangıç adresi
n → kaç eleman ilerleyeceğin
sizeof(type) → veri tipi boyutu
BasePointer → başlangıç adresi
n → kaç eleman ilerleyeceğin
sizeof(type) → veri tipi boyutu
Ö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
int id = *(int*)(p); // 4 byte INT
short flag = *(short*)(p+4); // 2 byte
char c = *(char*)(p+6); // 1 byte
🔗 Array ve Pointer İlişkisi
int arr[3] = {10,20,30};
int *p = arr;
printf("%d\n", *(p + 2)); // 30
int *p = arr;
printf("%d\n", *(p + 2)); // 30
🌟 Sonraki Yazı: Pointer_4
← Önceki Sonraki →⚠️ 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