PE头部重点.png

    1. // win原理Day001.cpp : 定义控制台应用程序的入口点。
    2. //
    3. #include "stdafx.h"
    4. #include <windows.h>
    5. //1 把文件读到内存中
    6. char* ReadFileToMemory(char* pFilePath)
    7. {
    8. //1 获取文件句柄
    9. HANDLE hFile = CreateFileA(pFilePath,
    10. GENERIC_READ | GENERIC_WRITE,
    11. FALSE,
    12. NULL,
    13. OPEN_EXISTING,
    14. FILE_ATTRIBUTE_NORMAL,
    15. NULL);
    16. if (hFile == INVALID_HANDLE_VALUE)
    17. {
    18. printf("文件打开失败\n");
    19. return 0;
    20. }
    21. //2.获取文件大小
    22. DWORD dwFileSize = GetFileSize(hFile, NULL);
    23. //3.申请内存空间
    24. char* pBuf = new char[dwFileSize]{};
    25. if (!pBuf)
    26. {
    27. CloseHandle(hFile);
    28. printf("内存申请失败\n");
    29. return 0;
    30. }
    31. //4.读取文件内容到内存空间
    32. DWORD dwRead;
    33. ReadFile(hFile, pBuf, dwFileSize, &dwRead, NULL);
    34. //5. 返回内存地址
    35. return pBuf;
    36. }
    37. //2 是否是PE文件
    38. bool IsPeFile(char* pBuf)
    39. {
    40. PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuf;
    41. if (pDos->e_magic != IMAGE_DOS_SIGNATURE)
    42. {
    43. printf("不是PE文件\n");
    44. return false;
    45. }
    46. PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)
    47. (pDos->e_lfanew + pBuf);
    48. if (pNt->Signature != IMAGE_NT_SIGNATURE)
    49. {
    50. printf("不是PE文件\n");
    51. return false;
    52. }
    53. return true;
    54. }
    55. //3 解析PE(头部重要字段)
    56. void ShowImportantHead(char* pBuf)
    57. {
    58. PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)pBuf;
    59. PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS)(pDos->e_lfanew + pBuf);
    60. //文件默认加载基址
    61. printf("默认加载基址:0x%08X\n", pNt->OptionalHeader.ImageBase);
    62. //文件入口点
    63. printf("文件入口点:0x%08X\n", pNt->OptionalHeader.AddressOfEntryPoint);
    64. //文件区段个数
    65. printf("文件区段个数:%d\n", pNt->FileHeader.NumberOfSections);
    66. //。。。
    67. }
    68. int _tmain(int argc, _TCHAR* argv[])
    69. {
    70. char* pBuf = ReadFileToMemory("123.exe");
    71. if (IsPeFile(pBuf))
    72. {
    73. ShowImportantHead(pBuf);
    74. }
    75. delete pBuf;
    76. return 0;
    77. }