免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

模拟windows PE文件加载器

  1. #include "stdio.h"
  2. #include <WINDOWS.H>

  3. typedef BOOL (__stdcall *pSetFilePointerEx)(
  4.    HANDLE hFile,
  5.    LARGE_INTEGER liDistanceToMove,
  6.    PLARGE_INTEGER lpNewFilePointer,
  7.    DWORD dwMoveMethod);



  8. void ReadPeFile()
  9. {
  10.         HANDLE hFile;
  11.         HMODULE h;
  12.         BOOL bStatus;
  13.         ULONG uIndex;
  14.         DWORD dwRetSize;
  15.         LARGE_INTEGER FileOffset;
  16.         IMAGE_DOS_HEADER ImageDosHeader;
  17.         IMAGE_NT_HEADERS ImageNtHeader;
  18.         IMAGE_SECTION_HEADER *pImageSectionHeader;

  19.         pSetFilePointerEx SetFilePointerEx;

  20.         hFile = CreateFile("c:\\NOTEPAD.EXE", GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
  21.                 FILE_ATTRIBUTE_NORMAL, NULL);

  22.         if (hFile == INVALID_HANDLE_VALUE)
  23.         {
  24.                 printf("CreateFile Failed!\n");
  25.                 return;
  26.         }

  27.         bStatus = ReadFile(hFile, &ImageDosHeader, sizeof(IMAGE_DOS_HEADER), &dwRetSize, NULL);

  28.         if (bStatus == FALSE)
  29.         {
  30.                 printf("read image_dos_header falied! :%d \n", GetLastError());
  31.                 CloseHandle(hFile);
  32.         }
  33.        
  34.         printf("e_magic:%s, e_lfanew:0x%X\n", &ImageDosHeader.e_magic, ImageDosHeader.e_lfanew);


  35.         h = LoadLibrary("Kernel32.dll");
  36.         if(!h)return;
  37.        
  38.         SetFilePointerEx=(pSetFilePointerEx)GetProcAddress(h,"SetFilePointerEx");

  39.         FileOffset.QuadPart = ImageDosHeader.e_lfanew;
  40.     bStatus = SetFilePointerEx(hFile, FileOffset, NULL, FILE_BEGIN);
  41.         if (bStatus == FALSE)
  42.         {
  43.                 printf("SetFilePointerEx falied! :%d \n", GetLastError());
  44.                 CloseHandle(hFile);
  45.         }
  46.        

  47.         bStatus = ReadFile(hFile, &ImageNtHeader, sizeof(IMAGE_NT_HEADERS), &dwRetSize, NULL);
  48.         if (bStatus == FALSE)
  49.         {
  50.                 printf("read image_nt_header falied! :%d \n", GetLastError());
  51.                 CloseHandle(hFile);
  52.         }
  53.         printf("Signature:%s, NumberOfSections: %d\n", &ImageNtHeader.Signature, ImageNtHeader.FileHeader.NumberOfSections);


  54.         FileOffset.QuadPart += sizeof(IMAGE_NT_HEADERS);
  55.         bStatus = SetFilePointerEx(hFile, FileOffset, NULL, FILE_BEGIN);
  56.         if (bStatus == FALSE)
  57.         {
  58.                 printf("SetFilePointerEx falied! :%d \n", GetLastError());
  59.                 CloseHandle(hFile);
  60.         }       
  61.        
  62.         pImageSectionHeader = (IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER) * ImageNtHeader.FileHeader.NumberOfSections);
  63.         if (pImageSectionHeader == 0)
  64.         {
  65.                 CloseHandle(hFile);
  66.                 return;
  67.         }
  68.         bStatus = ReadFile(hFile, pImageSectionHeader, sizeof(IMAGE_SECTION_HEADER) * ImageNtHeader.FileHeader.NumberOfSections, &dwRetSize, NULL);
  69.         if (bStatus == FALSE)
  70.         {
  71.                 printf("read IMAGE_SECTION_HEADER falied! :%d \n", GetLastError());
  72.                 CloseHandle(hFile);
  73.         }

  74.         for (uIndex = 0; uIndex < ImageNtHeader.FileHeader.NumberOfSections; uIndex++)
  75.         {
  76.                 printf("pImageSectionHeader[%d]:%s\n", uIndex, &pImageSectionHeader[uIndex].Name);
  77.         }

  78.         CloseHandle(hFile);
  79.         free(pImageSectionHeader);
  80.        
  81. }

  82. void ReadFileToMemory()
  83. {
  84.         HANDLE hFile;
  85.         HMODULE h;
  86.         BOOL bStatus;
  87.         ULONG uIndex;
  88.         DWORD dwRetSize;
  89.         DWORD FileAlign, VirtualAlign;
  90.         DWORD VirtualSizeOfImage;
  91.         PVOID pVirtualPoint;
  92.         DWORD SectionVirtualAddr, SizeOfSection;
  93.         DWORD PointerToRawData;
  94.         LARGE_INTEGER FileOffset;
  95.         IMAGE_DOS_HEADER ImageDosHeader;
  96.         IMAGE_NT_HEADERS ImageNtHeader;
  97.         IMAGE_SECTION_HEADER *pImageSectionHeader;
  98.        
  99.         pSetFilePointerEx SetFilePointerEx;
  100.        
  101.         hFile = CreateFile("c:\\NOTEPAD.EXE", GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS,
  102.                 FILE_ATTRIBUTE_NORMAL, NULL);
  103.        
  104.         if (hFile == INVALID_HANDLE_VALUE)
  105.         {
  106.                 printf("CreateFile Failed!\n");
  107.                 return;
  108.         }
  109.        
  110.         bStatus = ReadFile(hFile, &ImageDosHeader, sizeof(IMAGE_DOS_HEADER), &dwRetSize, NULL);
  111.        
  112.         if (bStatus == FALSE)
  113.         {
  114.                 printf("read image_dos_header falied! :%d \n", GetLastError());
  115.                 CloseHandle(hFile);
  116.                 return;
  117.         }
  118.        
  119.         printf("e_magic:%s, e_lfanew:0x%X\n", &ImageDosHeader.e_magic, ImageDosHeader.e_lfanew);
  120.        
  121.        
  122.         h = LoadLibrary("Kernel32.dll");
  123.         if(!h)return;
  124.        
  125.         SetFilePointerEx=(pSetFilePointerEx)GetProcAddress(h,"SetFilePointerEx");
  126.        
  127.         FileOffset.QuadPart = ImageDosHeader.e_lfanew;
  128.     bStatus = SetFilePointerEx(hFile, FileOffset, NULL, FILE_BEGIN);
  129.         if (bStatus == FALSE)
  130.         {
  131.                 printf("SetFilePointerEx falied! :%d \n", GetLastError());
  132.                 CloseHandle(hFile);
  133.                 return;
  134.         }
  135.        
  136.        
  137.         bStatus = ReadFile(hFile, &ImageNtHeader, sizeof(IMAGE_NT_HEADERS), &dwRetSize, NULL);
  138.         if (bStatus == FALSE)
  139.         {
  140.                 printf("read image_nt_header falied! :%d \n", GetLastError());
  141.                 CloseHandle(hFile);
  142.                 return;
  143.         }
  144.         printf("Signature:%s, NumberOfSections: %d\n", &ImageNtHeader.Signature, ImageNtHeader.FileHeader.NumberOfSections);
  145.        
  146.        
  147.         FileOffset.QuadPart += sizeof(IMAGE_NT_HEADERS);
  148.         bStatus = SetFilePointerEx(hFile, FileOffset, NULL, FILE_BEGIN);
  149.         if (bStatus == FALSE)
  150.         {
  151.                 printf("SetFilePointerEx falied! :%d \n", GetLastError());
  152.                 CloseHandle(hFile);
  153.                 return;
  154.         }       
  155.        
  156.         pImageSectionHeader = (IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER) * ImageNtHeader.FileHeader.NumberOfSections);
  157.         if (pImageSectionHeader == 0)
  158.         {
  159.                 CloseHandle(hFile);
  160.                 return;
  161.         }
  162.         bStatus = ReadFile(hFile, pImageSectionHeader, sizeof(IMAGE_SECTION_HEADER) * ImageNtHeader.FileHeader.NumberOfSections, &dwRetSize, NULL);
  163.         if (bStatus == FALSE)
  164.         {
  165.                 printf("read IMAGE_SECTION_HEADER falied! :%d \n", GetLastError());
  166.                 CloseHandle(hFile);
  167.                 free(pImageSectionHeader);
  168.                 return;
  169.         }
  170.        
  171.         for (uIndex = 0; uIndex < ImageNtHeader.FileHeader.NumberOfSections; uIndex++)
  172.         {
  173.                 printf("pImageSectionHeader[%d]:%s\n", uIndex, &pImageSectionHeader[uIndex].Name);
  174.         }
  175.        

  176.         FileAlign = ImageNtHeader.OptionalHeader.FileAlignment;
  177.         VirtualAlign = ImageNtHeader.OptionalHeader.SectionAlignment;
  178.         VirtualSizeOfImage = ImageNtHeader.OptionalHeader.SizeOfImage;

  179.         pVirtualPoint = malloc(VirtualSizeOfImage);
  180.         if (pVirtualPoint == 0)
  181.         {
  182.                 CloseHandle(hFile);
  183.                 free(pImageSectionHeader);
  184.                 return;
  185.         }

  186.         memset(pVirtualPoint, 0, VirtualSizeOfImage);

  187.         memcpy(pVirtualPoint, &ImageDosHeader, sizeof(IMAGE_DOS_HEADER));
  188.         memcpy((PVOID)((LONG)pVirtualPoint + ImageDosHeader.e_lfanew), &ImageNtHeader,
  189.                 sizeof(IMAGE_NT_HEADERS));
  190.         memcpy((PVOID)((LONG)pVirtualPoint + ImageDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS)),
  191.                 pImageSectionHeader, sizeof(IMAGE_SECTION_HEADER) * ImageNtHeader.FileHeader.NumberOfSections);
  192.                

  193.         for (uIndex = 0; uIndex < ImageNtHeader.FileHeader.NumberOfSections; uIndex++)
  194.         {
  195.                 SectionVirtualAddr = pImageSectionHeader[uIndex].VirtualAddress;
  196.                 SizeOfSection = pImageSectionHeader[uIndex].SizeOfRawData;
  197.                 PointerToRawData = pImageSectionHeader[uIndex].PointerToRawData;

  198.                 FileOffset.QuadPart = PointerToRawData;
  199.                 bStatus = SetFilePointerEx(hFile, FileOffset, NULL, FILE_BEGIN);
  200.                 if (bStatus == FALSE)
  201.                 {
  202.                         CloseHandle(hFile);
  203.                         free(pImageSectionHeader);
  204.                         free(pVirtualPoint);
  205.                         return;
  206.                 }

  207.                 bStatus = ReadFile(hFile, (PVOID)((DWORD)pVirtualPoint + SectionVirtualAddr),
  208.                         SizeOfSection, &dwRetSize, NULL);
  209.                 if (bStatus == FALSE)
  210.                 {
  211.                         CloseHandle(hFile);
  212.                         free(pImageSectionHeader);
  213.                         free(pVirtualPoint);
  214.                         return;
  215.                 }
  216.         }

  217.         printf("pVirtualPoint:0x%X\n", pVirtualPoint);

  218.         getchar();
  219.         getchar();

  220.         CloseHandle(hFile);
  221.         free(pImageSectionHeader);
  222.         free(pVirtualPoint);

  223. }

  224. void main(int argc, char** argv)
  225. {
  226.         ReadFileToMemory();
  227. }
复制代码

返回列表