Advertisement
Guest User

pefile.h

a guest
Oct 24th, 2010
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #ifndef _PEFILE_H_
  2. #define _PEFILE_H_
  3.  
  4. // Includes
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdarg.h>
  9. #include <string.h>
  10. #include <tchar.h>
  11. #include <cmath>
  12.  
  13. // Ignore
  14. #pragma warning(disable:4311) // warning C4311: 'Typumwandlung': Zeigerverkürzung von XXX * zu XXX
  15. #pragma warning(disable:4312) // warning C4312: 'Typumwandlung': Konvertierung von XXX in größeren Typ XXX
  16. #pragma warning(disable:4996) // Verkürzung/Verlust
  17. #pragma warning(disable:4244) // Verkürzung/Verlust
  18.  
  19. // Defines - Konstanten
  20. #define PASTE_IN_CODECAVE   0x0001
  21. #define ADD_SECTION         0x0002
  22. #define CREATE_CAVE         0x0004
  23.  
  24. #define UPDATE_HEADERPOINTER            0x00000001
  25. #define UPDATE_SECIONHEADERPOINTER      0x00000002
  26. #define UPDATE_SECTIONHEADERCAVESIZE    0x00000004
  27. #define UPDATE_EP_INFOS                 0x00000008
  28. #define UPDATE_RELOCBLOCKINFOS          0x00000010
  29. #define UPDATE_CODECAVEPOINTER          0x00000020
  30. #define UPDATE_IMPORTINFOS              0x00000040
  31. #define UPDATE_ALL                      UPDATE_HEADERPOINTER | UPDATE_SECIONHEADERPOINTER | UPDATE_SECTIONHEADERCAVESIZE | UPDATE_EP_INFOS | UPDATE_RELOCBLOCKINFOS | UPDATE_CODECAVEPOINTER | UPDATE_IMPORTINFOS
  32.  
  33. // Defines - Pointerarithmetik
  34. #define Align(number, alignment) ((int) ceil((double) (number) / (alignment)) * (alignment))
  35. #define BytesBetween(addr1, addr2) (((BYTE *) (addr1) <= (BYTE *) (addr2)) ? ((int) ((BYTE *) (addr2) - (BYTE *) (addr1))) : ((int) ((BYTE *) (addr1) - (BYTE *) (addr2))))
  36. #define SectionHeaderFitBetween(addr1, addr2) ((int )floor((double) BytesBetween(addr1, addr2) / sizeof(IMAGE_SECTION_HEADER)))
  37. #define Min(num1, num2) ((num1 <= num2) ? (num1) : (num2))
  38. #define Max(num1, num2) ((num1 >= num2) ? (num1) : (num2))
  39.  
  40. // Defines - RawOffset Interpretationen
  41. #define ReadBYTE(RawOffset) (*((BYTE *) &this->pbRawData[RawOffset]))
  42. #define ReadWORD(RawOffset) (*((WORD *) &this->pbRawData[RawOffset]))
  43. #define ReadDWORD(RawOffset) (*((DWORD *) &this->pbRawData[RawOffset]))
  44. #define WriteBYTE(RawOffset, BYTEValue) (*((BYTE *) &this->pbRawData[RawOffset]) = (BYTEValue))
  45. #define WriteWORD(RawOffset, WORDValue) (*((WORD *) &this->pbRawData[RawOffset]) = (WORDValue))
  46. #define WriteDWORD(RawOffset, DWORDValue) (*((DWORD *) &this->pbRawData[RawOffset]) = (DWORDValue))
  47.  
  48. #define InInterval(RowOffset, SizeElem, Interval) ((Interval.roLowBoundary) <= (RowOffset) && ((RowOffset) + (SizeElem)) <= (Interval.roHighBoundary))
  49.  
  50. // Typedef - Strukturen
  51. typedef struct _CODE_CAVE {
  52.     DWORD   RawOffset;
  53.     DWORD   dwCaveSize;
  54. } CODE_CAVE;
  55.  
  56. typedef struct _RELOC_INTERVAL {
  57.     DWORD   roLowBoundary;
  58.     DWORD   roHighBoundary;
  59.     DWORD   dwDelta;
  60. } RELOC_INTERVAL;
  61.  
  62. // Funktionen
  63. void fireError(const char *, ...);
  64. void fireDebug(const char *, ...);
  65.  
  66.  
  67. // PEFile - Klasse
  68. class PEFile {
  69.     private:
  70.         // Interne Variablen
  71.         char                    *szFilename;
  72.         BYTE                    *pbRawData;
  73.         DWORD                   dwFileSize;
  74.         IMAGE_DOS_HEADER        *pImageDOSHeader;
  75.         IMAGE_NT_HEADERS        *pImageNTHeaders;
  76.         DWORD                   dwNumberOfSections;
  77.         IMAGE_SECTION_HEADER    **ppSectionHeader;
  78.         DWORD                   dwNumberOfSectionHeaderFitInCave;
  79.         DWORD                   roOEP;
  80.         DWORD                   dwSectionOfOEP;
  81.         CODE_CAVE               *CaveArr;
  82.         DWORD                   dwNumCodeCaves;
  83.         DWORD                   roIBR;
  84.         DWORD                   dwNumRelocBlocks;
  85.         DWORD                   dwFreeBytesAfterRelocs;
  86.         DWORD                   dwNumImportDescriptors;
  87.         DWORD                   roImportDir;
  88.         DWORD                   roOFT;
  89.         DWORD                   roIAT;
  90.         DWORD                   dwNumImportByName;
  91.         DWORD                   dwNumImportByOrdinal;
  92.         DWORD                   *dwNumImportsModule;
  93.  
  94.         DWORD roNthSectionHeader(__in DWORD);
  95.         void gatherInformations(__in DWORD);
  96.  
  97.     public:
  98.         // Konstruktoren/Destruktor
  99.         PEFile(void);
  100.         PEFile(__in const char *);
  101.         ~PEFile();
  102.        
  103.         // Caves
  104.         CODE_CAVE *findCodeCaves(__in DWORD *);
  105.         CODE_CAVE *findNullPatterns(__in DWORD, __out DWORD *);
  106.         CODE_CAVE *findNullPatternsInSection(__in DWORD, __in DWORD, __out DWORD *);
  107.         bool createCodecave(__in DWORD, __in DWORD);
  108.        
  109.         // Relocations
  110.         bool switchSections(__in DWORD, __in DWORD);
  111.         bool switchSectionHeader(__in DWORD, __in DWORD);
  112.         bool shuffleSections();
  113.         bool writeAllRelocations(__in DWORD);
  114.         bool writeRelocationsForRawOffsetInterval(__in RELOC_INTERVAL);
  115.         bool addRelocation(__in DWORD, __in BYTE);
  116.        
  117.         // Injections
  118.         int addSection(__in const char *, __in DWORD, __in DWORD);
  119.         int insertCode(__in const char *, __in BYTE *, __in DWORD, __in DWORD);
  120.         bool writePEFile(__in const char *);
  121.        
  122.         // Konverter
  123.         DWORD getSectionIdByName(__in const char *);
  124.         DWORD getSectionIdByRVA(__in DWORD);
  125.         DWORD getSectionIdByRawOffset(__in DWORD);
  126.         DWORD getRawOffsetOfSectionEnd(__in DWORD);
  127.         DWORD getRawOffsetByRVA(__in DWORD);
  128.         DWORD getRVAByRawOffset(__in DWORD);
  129.  
  130.  
  131.         bool deleteSectionById(DWORD);
  132.  
  133.         // Get'ter
  134.         IMAGE_NT_HEADERS *getNTHeaders();
  135.         DWORD getEntryPointRawOffset();
  136.         BYTE *getPointerToDataByRO(__in DWORD);
  137.         IMAGE_SECTION_HEADER *getSectionHeaderById(__in DWORD);
  138.         IMAGE_SECTION_HEADER *getSectionHeaderByRO(__in DWORD);
  139.         IMAGE_SECTION_HEADER *getSectionHeaderByName(__in const char *);
  140.         DWORD getNumberOfSections();
  141.         DWORD getFileSize();
  142.         CODE_CAVE *getSecEndCCByName(__in const char *);
  143.  
  144.  
  145.         // Set'ter
  146.         void setFileSize(DWORD dwFileSize);
  147. };
  148.  
  149. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement