PELib.cpp
上传用户:sdguojin
上传日期:2022-07-31
资源大小:1726k
文件大小:2k
源码类别:

系统编程

开发平台:

Visual C++

  1. #include "PELib.h"
  2. namespace PELib
  3. {
  4. CPELib::CPELib() 
  5. {}
  6. CPELib::~CPELib()
  7. {
  8. if( m_pSection )
  9. {
  10. delete []m_pSection;
  11. m_pSection = NULL;
  12. }
  13. }
  14. BOOL CPELib::Init(wstring str_FileName)
  15. {
  16. BOOL bRetCode = FALSE;
  17. DWORD dwTempNum = 0;
  18. HANDLE hNewFile = ::CreateFile(
  19. str_FileName.c_str(), 
  20. GENERIC_READ, 
  21. FILE_SHARE_READ, 
  22. NULL, 
  23. OPEN_EXISTING, 
  24. NULL, NULL);
  25. if( hNewFile == INVALID_HANDLE_VALUE )
  26. goto Exit0;
  27. ReadFile(hNewFile, &m_DosHeader, sizeof(IMAGE_DOS_HEADER), &dwTempNum, NULL);
  28. if( sizeof(IMAGE_DOS_HEADER) != dwTempNum ) 
  29. goto Exit0;
  30. if( 0x5A4D != m_DosHeader.e_magic )
  31. goto Exit0;                               //验证PE第一个成员是否等于MZ
  32. SetFilePointer(hNewFile, m_DosHeader.e_lfanew, NULL, FILE_BEGIN);
  33. ReadFile(hNewFile, &m_NtHeader, sizeof(IMAGE_NT_HEADERS32), &dwTempNum, NULL);
  34. if ( sizeof(IMAGE_NT_HEADERS32) != dwTempNum )
  35. goto Exit0;
  36. if( 0x4550 != m_NtHeader.Signature)
  37. goto Exit0;
  38. DWORD dwSectionNum = m_NtHeader.FileHeader.NumberOfSections;
  39. m_pSection = new IMAGE_SECTION_HEADER[dwSectionNum];
  40. if( !m_pSection )
  41. goto Exit0;
  42. memset(m_pSection, 0, dwSectionNum * sizeof(IMAGE_SECTION_HEADER));
  43. ReadFile(hNewFile, m_pSection, sizeof(IMAGE_SECTION_HEADER) * dwSectionNum, &dwTempNum, NULL);
  44. bRetCode = TRUE;
  45. Exit0:
  46. if ( hNewFile )
  47. {
  48. CloseHandle(hNewFile);
  49. hNewFile = NULL;
  50. }
  51. return bRetCode;
  52. }
  53. }