增加节表存放shellcode


将shellcode放在PE文件新增的节表中

  1. // InsertShellCodeToPE.cpp : Defines the entry point for the console application.  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5. #include <Windows.h>  
  6.  
  7. #define FILENAME    "hello.exe"  
  8.  
  9. //自定义的shellcode  
  10. char shellcode[] = "\x90\x90\x90\x90\xb8\x90\x90\x90\x90\xff\xe0\x00"
  11.  
  12. /************************************************************************/ 
  13. /* 函数说明:将dwNum按dwAlign大小生成对齐大小                           */ 
  14. /* 参数:dwNum 待对齐的数据长度                                            */ 
  15. /*       dwAlign  对齐粒度                                              */ 
  16. /* 返回值:返回按指定粒度对齐后的大小                                    */ 
  17. /************************************************************************/ 
  18. DWORD Align(DWORD dwNum, DWORD dwAlign) 
  19.     if (dwNum % dwAlign == 0) 
  20.     { 
  21.         return dwNum; 
  22.     } 
  23.     else 
  24.     { 
  25.         return (dwNum / dwAlign + 1) * dwAlign; 
  26.     } 
  27.  
  28.  
  29. int main(int argc, char* argv[]) 
  30.     HANDLE hFile = ::CreateFile(FILENAME, FILE_GENERIC_READ|FILE_GENERIC_WRITE|FILE_GENERIC_EXECUTE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
  31.     if (NULL == hFile) 
  32.     { 
  33.         printf("createfile error"); 
  34.         return -1; 
  35.     } 
  36.     HANDLE hFileMap = ::CreateFileMapping(hFile, NULL, PAGE_EXECUTE_READWRITE, 0, 0, NULL); 
  37.     int n = GetLastError(); 
  38.     if (NULL == hFileMap) 
  39.     { 
  40.         printf("CreateFileMapping error"); 
  41.         return -1; 
  42.     } 
  43.     LPVOID lpMemory = ::MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
  44.     if (NULL == lpMemory) 
  45.     { 
  46.         printf("MapViewOfFile error"); 
  47.         return -1; 
  48.     } 
  49.      
  50.     PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpMemory; 
  51.     PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)lpMemory + pDosHeader->e_lfanew); 
  52.     PIMAGE_FILE_HEADER pFileHeader = (PIMAGE_FILE_HEADER)&(pNTHeader->FileHeader); 
  53.     PIMAGE_OPTIONAL_HEADER pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)&pNTHeader->OptionalHeader; 
  54.  
  55.     PIMAGE_SECTION_HEADER pSection = NULL; 
  56.     IMAGE_SECTION_HEADER secToAdd = {0}; 
  57.  
  58.     if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE || pNTHeader->Signature != IMAGE_NT_SIGNATURE) 
  59.     { 
  60.         printf("Not valid PE file..."); 
  61.         return -1; 
  62.     } 
  63.  
  64.     pSection = (PIMAGE_SECTION_HEADER)((BYTE*)pOptionalHeader + pFileHeader->SizeOfOptionalHeader); 
  65.      
  66.     DWORD dwSectionNum = pFileHeader->NumberOfSections; 
  67.     DWORD dwSectionAlign = pOptionalHeader->SectionAlignment; 
  68.     DWORD dwOEP = pOptionalHeader->AddressOfEntryPoint; 
  69.     dwOEP = (DWORD)(pOptionalHeader->ImageBase + dwOEP); 
  70.  
  71.      
  72.     pSection = pSection + dwSectionNum - 1;     //pSection指向了最后一个section节表的起始,下面根据最后一个section节表设置新的节表数据  
  73.     strcpy((char *)secToAdd.Name, ".xiaoju"); 
  74.     secToAdd.Characteristics = pSection->Characteristics; 
  75.     secToAdd.VirtualAddress = pSection->VirtualAddress + Align(pSection->Misc.VirtualSize, dwSectionAlign); 
  76.     secToAdd.Misc.VirtualSize = dwSectionAlign; 
  77.     secToAdd.PointerToRawData = pSection->PointerToRawData + pSection->SizeOfRawData; 
  78.     secToAdd.SizeOfRawData = dwSectionAlign; 
  79.  
  80.     pSection++; //pSection指向了所有节表的最后  
  81.     //写入新的节表  
  82.     memcpy(pSection, &secToAdd, sizeof(IMAGE_SECTION_HEADER)); 
  83.  
  84.     //改写pe文件中节表的数量  
  85.     pFileHeader->NumberOfSections++; 
  86.  
  87.     //将shellcode中的预留位填充好  
  88.     *(DWORD*)&shellcode[5] = dwOEP; 
  89.  
  90.     //增加文件大小  
  91.     BYTE bNum = '\x0'
  92.     DWORD dwWritten = 0; 
  93.     ::SetFilePointer(hFile, 0, 0, FILE_END); 
  94.     ::WriteFile(hFile, &bNum, dwSectionAlign, &dwWritten, NULL); 
  95.  
  96.     //在新增节表的PointerToRawData处写入shellcode  
  97.     ::SetFilePointer(hFile, pSection->PointerToRawData, 0, FILE_BEGIN); 
  98.     ::WriteFile(hFile, shellcode, strlen(shellcode)+3, &dwWritten, NULL); 
  99.  
  100.     //修改程序的映象大小和OEP  
  101.     pOptionalHeader->SizeOfImage = pOptionalHeader->SizeOfImage + dwSectionAlign; 
  102.     pOptionalHeader->AddressOfEntryPoint = pSection->VirtualAddress; 
  103.  
  104.     ::UnmapViewOfFile(lpMemory); 
  105.  
  106.      
  107.     ::CloseHandle(hFileMap); 
  108.     ::CloseHandle(hFile); 
  109.  
  110.     return 0; 

原始hello.exe

程序运行后,修改后的hello.exe

相关内容

    暂无相关文章