Image

Malware giriş.

Malware

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”