PE 中NT头 遍历

博客围绕PE中NT头的遍历展开,但具体内容缺失,推测会涉及NT头遍历的相关信息技术知识,如遍历方法、作用等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LPVOID ReadPEFile(LPSTR lpszFile)		
{		
	FILE *pFile = NULL;	
	DWORD fileSize = 0;	
	LPVOID pFileBuffer = NULL;	
		
	//打开文件	
    pFile = fopen(lpszFile, "rb");		
	if(!pFile)	
	{	
		printf(" 无法打开 EXE 文件! ");
		return NULL;
	}	
    //读取文件大小		
	fseek(pFile, 0, SEEK_END);	
    fileSize = ftell(pFile);		
    fseek(pFile, 0, SEEK_SET);		
	//分配缓冲区	
	pFileBuffer = malloc(fileSize);	
		
	if(!pFileBuffer)	
	{	
		printf(" 分配空间失败! ");
		fclose(pFile);
		return NULL;
	}	
	//将文件数据读取到缓冲区	
	size_t n = fread(pFileBuffer, fileSize, 1, pFile);	
	if(!n)	
	{	
		printf(" 读取数据失败! ");
		free(pFileBuffer);
		fclose(pFile);
		return NULL;
	}	
	//关闭文件	
	fclose(pFile);	
    return pFileBuffer;		
}		
		
VOID PrintNTHeaders()		
{		
	LPVOID pFileBuffer = NULL;	
	PIMAGE_DOS_HEADER pDosHeader = NULL;	
	PIMAGE_NT_HEADERS pNTHeader = NULL;	
	PIMAGE_FILE_HEADER pPEHeader = NULL;	
	PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;	
	PIMAGE_SECTION_HEADER pSectionHeader = NULL;	
		
	pFileBuffer = ReadPEFile(FILEPATH);	
	if(!pFileBuffer)	
	{	
		printf("文件读取失败\n");
		return ; 
	}	
		
	//判断是否是有效的MZ标志	
	if(*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)	
	{	
		printf("不是有效的MZ标志\n");
		free(pFileBuffer);
		return ; 
	}	
	pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;	
	//打印DOC头	
	printf("********************DOC头********************\n");	
	printf("MZ标志:%x\n",pDosHeader->e_magic);	
	printf("PE偏移:%x\n",pDosHeader->e_lfanew);	
	//判断是否是有效的PE标志	
	if(*((PDWORD)((DWORD)pFileBuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)	
	{	
		printf("不是有效的PE标志\n");
		free(pFileBuffer);
		return ;
	}	
	pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);	
	//打印NT头	
	printf("********************NT头********************\n");	
	printf("NT:%x\n",pNTHeader->Signature);	
	pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);	
	printf("********************PE头********************\n");	
	printf("PE:%x\n",pPEHeader->Machine);	
	printf("节的数量:%x\n",pPEHeader->NumberOfSections);	
	printf("SizeOfOptionalHeader:%x\n",pPEHeader->SizeOfOptionalHeader);	
	//可选PE头	
	pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);	
	printf("********************OPTIOIN_PE头********************\n");	
	printf("OPTION_PE:%x\n",pOptionHeader->Magic);	
	//释放内存	
	free(pFileBuffer);	
}		

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值