可重用函数:

ULONG MapPeFile(TCHAR* szFileName)
{
	HANDLE hFile;
	ULONG numR;
	IMAGE_DOS_HEADER dosHeader = {0};
	IMAGE_NT_HEADERS ntHeader;
	
	ULONG dwImageSize;
    ULONG dwNumOfSections;
	ULONG dwHeadSize;

	PIMAGE_SECTION_HEADER pSection;
    char* pBase;
	ULONG nIndex;
    
    hFile = CreateFile(szFileName, 
					   GENERIC_READ | GENERIC_WRITE,
					   FILE_SHARE_READ | FILE_SHARE_WRITE,
                       NULL,
					   OPEN_EXISTING,
					   FILE_ATTRIBUTE_NORMAL,
					   NULL
             		  );

	if (hFile == INVALID_HANDLE_VALUE)
	{
		OutputDebugString(_T("打开文件失败!"));
		return 0;
	}
    ReadFile(hFile,
		     &dosHeader,
			 sizeof(IMAGE_DOS_HEADER),
             &numR,
			 NULL
			 );

	SetFilePointer(hFile,
		           dosHeader.e_lfanew,
				   NULL,
				   FILE_BEGIN
		            );

	ReadFile(hFile,
		     &ntHeader,
			 sizeof(IMAGE_NT_HEADERS),
             &numR,
			 NULL
			 );
    
	dwImageSize = ntHeader.OptionalHeader.SizeOfImage;
    dwNumOfSections = ntHeader.FileHeader.NumberOfSections;
    dwHeadSize = ntHeader.OptionalHeader.SizeOfHeaders;

   
	
	pBase =(char*)malloc(dwImageSize);
    memset(pBase , 0 , dwImageSize);

    SetFilePointer(hFile , 0 , NULL , FILE_BEGIN);
	ReadFile(hFile, pBase , dwHeadSize ,&numR , NULL);

    pSection = (PIMAGE_SECTION_HEADER)(dosHeader.e_lfanew  
		        + sizeof(ntHeader.Signature)
		        + sizeof(IMAGE_FILE_HEADER)
				+ ntHeader.FileHeader.SizeOfOptionalHeader
				+ (ULONG)pBase);
	
    for (nIndex = 0 , pSection ; nIndex < dwNumOfSections ; nIndex++ ,pSection++)
	{
	   SetFilePointer(hFile , pSection ->PointerToRawData , NULL , FILE_BEGIN);
       ReadFile(hFile , &pBase[pSection->VirtualAddress] , pSection->SizeOfRawData ,&numR ,NULL);
	}

	CloseHandle(hFile);

    return (ULONG)pBase;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值