BlackNullSec Path : Pointer_3
🚀 Amaç:Bir pointer, bellekteki bir adresi tutan değişkendir. Yani başka bir değişkenin adresini saklar.
🔎 Neden Pointer Kullanırız?
🧪 Function Pointer
Not:
Normal pointer=Veri adresini tutar.
Function Pointer= Fonksiyonun adresini tutar.
yani fonksiyonun bir degişken gibi saklayabilir,çagırabilirsin
Windows Apı'de neden function pointer gerekir
1-)GetProcAdddres Apı adresini void* olarak dondür
2-)NtDll içinde dinamik Apı resolve ederken Function kullanın
3-)Reflective Loader/Manuel Mapping -> Apılerin pointer saklar
4-)Thread yaratırken EntryPoint fonsiyonu pointer olarak veririsin
ÖR:
typeDef NTSTATUS(NTAPI *FnNTWriteVirtualMemory)(
HANDLE,DVOID,ULONG,PULONG
);
Bu satırı anlamı *FnNTWriteVirtualMemory isimli degişken bir fonksiyonun adresini tutacak yani=Bu adresi çagırdıgımızda NTAPI çalışıcak.
Cast+Pointer
Cast:
Bir pointerin veya degerin türünü degiştirmek demek.
(int*) -> p'yi int poniter yapar
(int)p -> bu adresteki 4byte'i int olark oku
byte-byte memory walking casting yapar
(int*) -> p'yi int poniter yapar
(int)p -> bu adresteki 4byte'i int olark oku
byte-byte memory walking casting yapar
Casting+Function Pointer
GetProcAddress fopnksiyonunu adresini FARPROC(void*) benzeri ile dondürür
ÖNEMLİ:
CreateFileA
typedef HANDLE(WINAPI *FnCreateFileA){
LPCSTR,DWORD,DWORD,LPSECURITY-ATTRIBUTTES,DWORD,DWORDHANDLE
};
Adresini alıyoruz:
FARPROC addr=GetProcAddress(h,"CreateFileA")
Cast ediyoruz:
FnCreateFileA CreateFileA=(FnCreateFileA)addr;
CreateFileA("test.txt"...);
Cast'in 3 altın kuraLı
1.)
Okuma için mutlaka cast gerekir çünkü derleyici boyutları bilmez
2.)
Memory walking -> "unsignedchar* " +cast
ilerle = p+offset
castet = (int*)
oku = *(int*)
3.)
Function pointer -> cast edilmeden cagrılamaz çünkü imza bilinemez
Önemli:
*p neden var çünkü pointer bir adres tutar
int *p=(int*)(p byte+4); int value=*p byte-byte memory walking casting yapar 1-) Bellekte ilerledik 2-) Doğru tipe cast ettik 3-) Pointer degişkenine koyduk 4-) x p ile degeri okuduk
Pointer to Pointer (Double Pointer)
Önemli:
Bir pointer'ın adresini tutan pointer
int x=10;
int*p= & x; // p=x'in adresi
int **pp= & p; // pp=p'in nin adresi
printf("%d",**pp); // 10
Çok Önemli:
Pointer= evin adresi tutan kayıt
Pointer adresi= o kagıdın masadaki konumu
Sen birine "EVİNE GİT " demek istiyorsan kagıttaki adres yeterli -> *p
Sen birine "kagıttaki adresi degiştir demek istiyorsan " kagıdın masadaki adresini degiştir vermen gerekir -> **pp çünkü kagıt(pointer) taşınabilir
Önemli:
Malwarede pointer'in adresi neden lazım
Process Hollowingde
STARTUPINFO ve PROCESS_INFORMATION structlarını createprocess'e verdiginde
CreateProcess(...,&si,&pi) yani struct'ın adresini veriyorsun
Neden:
Çünkü kernel bu struct içini degiştirmek zorunda
si -> start ayarları okunur
pi -> işlem bilgileri yazılır
Pointer'ı degil pointer adresini veriyorsun çünkü CreateProcess yeni degerler yazmak zorunda -> bunun yapıla bilmesi için struct'ın bulundugu adresi bilmesi gerekir
NOT:
Eger sadece pointer gönderilseydi fonksiyon pointer'ın işaret ettigi yeri görür ama pointer'ın kendisini degiştiremezdi
Özet bilgi
Pointer -> Bellek bir verinin adresini tutar Pointer'ın adresi -> Pointer'ın kendisini bellekte kullanmızı için bu fonksiyon Pointer'ın işaret ettigi degeri degiştirmesi için --> int *p Pointer'ın işaret ettigi adresi degiştirmesi --> int **pp bu sayede . Başka fonksiyon pointer!ın içini deiştirebilir pointer'a yeni adres atanabilir Ve Pointer yeniden yonlendirilebilir
Remote Memory
Tanım:
Bu kısım malware geliştirmenin kalbidir. Process Hollowing,Manual Mapping,Shellcode Execution --> buradan başlıyor
remote pointer --> Başka bir işlemdeki Ram
ÖR=
HANDLE hProcess=OpenProcess
bu handle baska bir programın belleginde erişim izni verir
Remote Pointer
LPVOID remote =Virtual AllocEx(hProcess,WriteProcessMemory(hProcess,remote,payload size,Null)
Burada remote pointer!ın adrsinr sen dokunamazsın çünkü o bellek senin programına ait degil baska bir
processe ait.
BU yüzden:
1.) remote adres --> başka Ramde
2.)sen erişemezsin
3.) Sadece Windows Apı aracılıgıyla dokunabilirsin
Bu çalışır WriteProcessMemory(hProcesss,remote,valuıe,4,NULL);
çünkü Windows kernel (senin yerine uzaktakia bellege yazmaya odaklanır)
⚠️ 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