fork download
  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include "error.h"
  4.  
  5. #pragma comment(linker, "/DYNAMICBASE:NO")
  6. #pragma comment(linker, "/BASE:0x02000000")
  7.  
  8. void * FileToMemory(LPTSTR file)
  9. {
  10. HANDLE hFile = NULL;
  11. HANDLE hFileMap = NULL;
  12. LPVOID pMapView = NULL;
  13.  
  14. hFile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  15. if (hFile == INVALID_HANDLE_VALUE)
  16. {
  17. CloseHandle(hFile);
  18. return NULL;
  19. }
  20.  
  21. hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
  22. if (hFileMap == NULL)
  23. {
  24. CloseHandle(hFile);
  25. return NULL;
  26. }
  27.  
  28. pMapView = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
  29.  
  30. return pMapView;
  31. }
  32.  
  33. void GetHeaders(PBYTE ibase, PIMAGE_FILE_HEADER *pfh, PIMAGE_OPTIONAL_HEADER *poh, PIMAGE_SECTION_HEADER *psh)
  34. {
  35. PIMAGE_DOS_HEADER mzhead = (PIMAGE_DOS_HEADER)ibase;
  36. *pfh = (PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
  37. *pfh = (PIMAGE_FILE_HEADER)((PBYTE)*pfh + sizeof(IMAGE_NT_SIGNATURE));
  38. *poh = (PIMAGE_OPTIONAL_HEADER)((PBYTE)*pfh + sizeof(IMAGE_FILE_HEADER));
  39. *psh = (PIMAGE_SECTION_HEADER)((PBYTE)*poh + sizeof(IMAGE_OPTIONAL_HEADER));
  40. }
  41.  
  42. void * LoadPE(void *image)
  43. {
  44. PIMAGE_DOS_HEADER dos_hdr = NULL;
  45. PIMAGE_FILE_HEADER file_hdr = NULL;
  46. PIMAGE_OPTIONAL_HEADER opt_hdr = NULL;
  47. PIMAGE_SECTION_HEADER section_hdr = NULL;
  48. LPVOID pImageBase = NULL;
  49.  
  50. dos_hdr = (PIMAGE_DOS_HEADER) image;
  51. file_hdr = (PIMAGE_FILE_HEADER) ((DWORD)image + dos_hdr->e_lfanew + 4);
  52. opt_hdr = (PIMAGE_OPTIONAL_HEADER) (file_hdr + 1);
  53. section_hdr = (PIMAGE_SECTION_HEADER)((DWORD)opt_hdr + sizeof(IMAGE_OPTIONAL_HEADER));
  54.  
  55. printf("Allocating memory for image\n");
  56. UnmapViewOfFile((LPVOID)opt_hdr->ImageBase);
  57. pImageBase = VirtualAlloc((LPVOID)opt_hdr->ImageBase, opt_hdr->SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  58. if (pImageBase == NULL)
  59. {
  60. FormatError(GetLastError());
  61. printf("Error while allocating memory. Possible conflict of base addresses\n");
  62. return NULL;
  63. }
  64.  
  65. printf("Copying headers\n");
  66. CopyMemory(pImageBase, image, opt_hdr->SizeOfHeaders);
  67.  
  68. printf("Copying sections\n");
  69. for (DWORD i = 0; i < file_hdr->NumberOfSections; i++)
  70. {
  71. LPVOID VirtualAddress = (LPVOID)((DWORD)pImageBase + section_hdr[i].VirtualAddress);
  72. CopyMemory(VirtualAddress, (void *)((DWORD)image + section_hdr[i].PointerToRawData), section_hdr[i].SizeOfRawData);
  73. }
  74.  
  75. printf("Setting attributes\n");
  76. for (DWORD i = 0; i < file_hdr->NumberOfSections; i++)
  77. {
  78. LPVOID VirtualAddress = (LPVOID)((DWORD)pImageBase + section_hdr->VirtualAddress);
  79. DWORD VirtualSize = section_hdr[i].Misc.VirtualSize;
  80.  
  81. DWORD attributes = 0;
  82. if(section_hdr[i].Characteristics & IMAGE_SCN_MEM_EXECUTE ||section_hdr[i].Characteristics & IMAGE_SCN_MEM_READ )
  83. {
  84. attributes |= PAGE_EXECUTE;
  85. if(section_hdr[i].Characteristics & IMAGE_SCN_MEM_WRITE )
  86. attributes |= PAGE_READWRITE;
  87. else
  88. attributes |= PAGE_READONLY;
  89. }
  90. else if(section_hdr[i].Characteristics & IMAGE_SCN_MEM_WRITE )
  91. attributes |= PAGE_READWRITE;
  92.  
  93. VirtualProtect(VirtualAddress, VirtualSize, attributes, &attributes);
  94. }
  95.  
  96. return pImageBase;
  97. }
  98.  
  99. void CallPE(void *base)
  100. {
  101. PIMAGE_FILE_HEADER pfh;
  102. PIMAGE_OPTIONAL_HEADER poh;
  103. PIMAGE_SECTION_HEADER psh;
  104. LPVOID entry = NULL;
  105.  
  106. GetHeaders((PBYTE)base, &pfh, &poh, &psh);
  107.  
  108. entry = (LPVOID)((DWORD)base + poh->AddressOfEntryPoint);
  109. __asm call dword ptr [entry];
  110. }
  111.  
  112. int main()
  113. {
  114. void *pImage = FileToMemory(TEXT("test.exe"));
  115. void *pModule = LoadPE(pImage);
  116. CallPE(pModule);
  117. return 0;
  118. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c:1:21: fatal error: Windows.h: No such file or directory
compilation terminated.
stdout
Standard output is empty