首页
社区
课程
招聘
[求助]请问如何编写查看文件是否是pe格式文件
发表于: 2009-8-29 23:55 4839

[求助]请问如何编写查看文件是否是pe格式文件

2009-8-29 23:55
4839
delphi
大约是对比他的dos头及pe签名。。但是我不知如何把文件装入内存这步。

想这样来深入学pe文件格式

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
可以直接获取文件大小然后申请buffer后Read进去,或者MapViewOfFile更方便一点~
2009-8-30 07:38
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
楼主可以搜索下论坛,论坛上有不少分析PE文件分析工具源码。
至于打开文件可以使用fopen函数,像这样:
BOOL OpenFileOffopen(const char *filename)
{
	FILE * pFile;       
	int len;
	char * buff;

	pFile=fopen(filename,"rb");
	if(NULL==pFile)
	{
		return FALSE;
	}
	else
	{
	    fseek(pFile,0,SEEK_END);
	    len=ftell(pFile);
	    buff=new char[len+1];
	    rewind(pFile);
	    fread(buff,len,1,pFile);
	    m_lpFile=buff;
	    fclose(pFile);
	
		return TRUE;
	}

	

}


或者使用内存映射文件,像这样:
BOOL OpenFileofMapping(const char *filename)
{
	HANDLE hFile;
	HANDLE hFileMapping=NULL; 	LPVOID pVoid;

	hFile = CreateFile(filename,      
                GENERIC_READ,                        
                FILE_SHARE_READ,           
                NULL,                      
                OPEN_EXISTING,            
                FILE_FLAG_SEQUENTIAL_SCAN,     
                NULL);                   

                if(hFile==INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	hFileMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);

	if(hFileMapping==NULL)
	{
		return FALSE;
	}

	pVoid=MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0);

	if(NULL==pVoid)
	{
		return FALSE;
	}
	m_lpFile=(LPTSTR)pVoid;
	
	return TRUE;

}


这里是一个C++的源码 http://bbs.pediy.com/showthread.php?t=95422&highlight=
楼主可以参考下。
2009-8-30 09:43
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
直接map进去不更好?
2009-8-30 20:00
0
雪    币: 122
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
http://blog.chinaunix.net/u3/96987/showart_1988475.html

看这个
2009-8-31 09:00
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这代码经典。
可以看看下面的:
WindPE v1.0 (PE文件格式分析工具)
WinPEDump v2.0 Beta (可执行文件格式分析器…
PEEncrypt 文件 加密 加壳 修改 PE入口地址
随意区段名器

FS := TFileStream.Create(F, fmOpenRead);
   if FS.Size < $1000 then
   begin //判断文件大小,小于0x1000的判定为非有效PE
       result := 0;
       exit;
   end;

   FS.ReadBuffer(doshead, sizeof(IMAGE_DOS_HEADER));

   if doshead.e_magic <> IMAGE_DOS_SIGNATURE then
   begin //判断Dos头
       result := 0;
       exit;
   end;

   FS.Seek(doshead._lfanew, SoFromBeginning);
   FS.ReadBuffer(pehead, sizeof(IMAGE_NT_HEADERS));
   if pehead.Signature <> IMAGE_NT_SIGNATURE then
   begin //判断PE头
       result := 0;
       exit;
   end;
   if pehead.FileHeader.Characteristics and IMAGE_FILE_DLL = IMAGE_FILE_DLL
       {//判断是EXE还是DLL}then
       result := 2
   else
       result := 1;
2009-9-1 05:52
0
游客
登录 | 注册 方可回帖
返回
//