检索 PE 文件部分的内容

逆向工程 C 聚乙烯 操作码 部分
2021-06-13 08:08:25

我正在尝试使用以下代码获取文件 (notepad.exe) 的 .text 部分的内容:

#define SECHDROFFSET(a) ((LPVOID) ( (LPBYTE) a           + \
                    ((PIMAGE_DOS_HEADER)a)->e_lfanew + \
                    sizeof(IMAGE_NT_HEADERS)))

PIMAGE_DOS_HEADER     pDosH;
PIMAGE_NT_HEADERS     pNtH;
PIMAGE_SECTION_HEADER pSecH;

HANDLE hFile;

DWORD  dwFileSize, dwSectionSize, dwStubSize,
       dwVSize, dwOldProt, dwSpot, dwGap, bytes;

LPBYTE FileBuffer, SectionBuffer;
CHAR FileName[MAX_PATH];

printf("Input file path: ");
scanf("%s", &FileName);

// open it and get the size
hFile = CreateFileA(FileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
dwFileSize = GetFileSize(hFile, 0);

// load it into memory
FileBuffer = (LPBYTE) malloc(dwFileSize);
ReadFile(hFile, FileBuffer, dwFileSize, &bytes, 0);

pDosH = (PIMAGE_DOS_HEADER) FileBuffer;

// basic checks
if(pDosH->e_magic != IMAGE_DOS_SIGNATURE)
    return -1;

pNtH = (PIMAGE_NT_HEADERS) (FileBuffer + pDosH->e_lfanew);

if(pNtH->Signature != IMAGE_NT_SIGNATURE)
    return -2;

pSecH = (PIMAGE_SECTION_HEADER) SECHDROFFSET(FileBuffer);

while(memcmp(pSecH->Name, ".text", 5)) 
    pSecH++;

问题是部分名称无效;调试时我从来没有看到一个类型的字符串.<section_name>来取pSecH->Name. 它们始终是不可打印的字符。

我是否从正确的偏移量中读取?

1个回答

根据上面的评论,SECHDROFFSET()宏公式不可靠。您应该改用宏IMAGE_FIRST_SECTION()