PE文件检测DOS头\NT头

以下都是我个人的浅见,如有不对,多谢指出。

1、Windows2种文件

01、可执行文件 EXE DLL

可执行文件 都有一个 PE 结构

PE结构:

DOS

NT

一个程序EXE= PE结构+数据

 

  1,每个PE文件是以一个DOS程序开始的,有了它,一旦程序在DOS下执行,DOS才能识别出这是有效的执行体。
   2,PE文件的第一个字节起始于一个传统的MS-DOS头部,被称作为IMAGE_DOS_HEADER。

 

  1. IMAGE_DOS_HEADER STRUCT  (转载)
  2. {  
  3. +0h WORDe_magic //Magic DOS signature MZ(4Dh 5Ah)     DOS可执行文件标记  
  4. +2h WORDe_cblp//Bytes on last page of file    
  5. +4h WORDe_cp//Pages in file  
  6. +6h WORD e_crlc//Relocations  
  7. +8h WORDe_cparhdr   //Size of header in paragraphs  
  8. +0ah WORD e_minalloc  //Minimun extra paragraphs needs  
  9. +0ch WORDe_maxalloc  //Maximun extra paragraphs needs  
  10. +0eh WORDe_ss  //intial(relative)SS value    DOS代码的初始化堆栈SS  
  11. +10h WORDe_sp  //intial SP value               DOS代码的初始化堆栈指针SP  
  12. +12h WORDe_csum  //Checksum  
  13. +14h WORDe_ip  //    intial IP value                   DOS代码的初始化指令入口[指针IP]  
  14. +16h WORDe_cs  //intial(relative)CS value                    DOS代码的初始堆栈入口  
  15. +18h WORDe_lfarlc  //File Address of relocation table  
  16. +1ah WORDe_ovno        //    Overlay number  
  17. +1ch WORDe_res[4]  //Reserved words  
  18. +24h WORDe_oemid  //    OEM identifier(for e_oeminfo)  
  19. +26h WORD      e_oeminfo   //    OEM information;e_oemid specific   
  20. +29h WORDe_res2[10]   //    Reserved words  
  21. +3ch DWORD   e_lfanew     //Offset to start of PE header             指向PE文件头  
  22. } IMAGE_DOS_HEADER ENDS  

02、不可执行文件 数据文件


2、每一个文件都是以二进制的方式存储在磁盘中的;

那么该如何区分一个文件是不是 可执行文件呢?

WORD e_magic  //---DOS可执行文件标记.
DWORD e_lfanew   ///--- 指向PE文件头(这个是一个指针)

00、打开一个文件

CFile cFile(m_strFilePath, CFile::modeReadWrite);

01、先获取该文件的DOS头 IMAG_DOS_HEADER, 这是用来兼容DOS程序的;DOS头中包含了NT头的偏移位置。

IMAGE_DOS_HEADER dosHeader = { 0 };
DWORD dosSize = 0;


dosSize = cFile.Read(&dosHeader, sizeof(dosHeader));
if (dosSize != sizeof(dosHeader))
{
break;
}

02、通过DOS头中偏移位获取NT头的位置;

IMAGE_NT_HEADERS32 ntHeader = { 0 };
DWORD dntSize = 0;
cFile.Seek(dosHeader.e_lfanew, CFile::begin);
dntSize=cFile.Read(&ntHeader, sizeof(IMAGE_NT_HEADERS32));
if (dntSize != sizeof(IMAGE_NT_HEADERS32))
{
break;
}

03、判断ntHeader.Signature == IMAGE_NT_SIGNATURE

以下是我的代码:

CString strCheckPE = L"Not PE!!";
if (m_strFilePath.IsEmpty())
{
OnClickedButton1();
}
do
{


CFile cFile(m_strFilePath, CFile::modeReadWrite);
if (cFile.m_hFile != CFile::hFileNull)
{
IMAGE_DOS_HEADER dosHeader = { 0 };
DWORD dosSize = 0;


dosSize = cFile.Read(&dosHeader, sizeof(dosHeader));
if (dosSize != sizeof(dosHeader))
{
break;
}
if (dosHeader.e_magic != IMAGE_DOS_SIGNATURE)
{
break;
}
IMAGE_NT_HEADERS32 ntHeader = { 0 };
DWORD dntSize = 0;
cFile.Seek(dosHeader.e_lfanew, CFile::begin);
dntSize=cFile.Read(&ntHeader, sizeof(IMAGE_NT_HEADERS32));
if (dntSize != sizeof(IMAGE_NT_HEADERS32))
{
break;
}
if (ntHeader.Signature == IMAGE_NT_SIGNATURE)
{
strCheckPE = L"Is PE!!";
}
}


} while (FALSE);


MessageBox(strCheckPE);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值