20CN网络安全小组第一代论坛
发表新主题  发表回复

个人资料 | 社区目录 用户登录 | | 论坛搜索 | 常见问题 | 论坛主页
  下一个最老的主题   下一个最新的主题
» 20CN网络安全小组第一代论坛   » 电 脑 技 术   » 编程破解   » WIN32 PE 文件格式判定

   
作者 标题: WIN32 PE 文件格式判定
病毒
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
WIN32 PE 文件格式判定

作者:病毒 发表于:绿色兵团

很多时候需要判断文件是否为WIN32 PE格式,以便此文件可以在WIN32系统下
正常运行,这在病毒和反病毒软件中尤为重要,下面就先简单介绍下PE文件
格式,首先所有PE文件必须以一个简单的DOS MZ头开始,这也就是为什么在
纯DOS方式下运行PE格式文件会给出一条“此程序只能运行在WIN32系统下”
的原因。显示此信息功能是由紧跟DOS MZ头后的DOS stub来完成的。
紧接着DOS stub后的就是PE头,其中包含了许多PE装载用到的重要信息,
PE头中就包含了PE标志。当PE文件被执行时装载检查DOS MZ头里的PE头偏移量。
如果找到,则跳转到PE头,此时PE装载器检查PE头的有效性。在PE头结构中有
一个Signature标记,此标记为DWORD类型,其值为50h, 45h, 00h, 00h即
PE\0\0。正好在WIN32 PE文件的偏移3ch处有一个指向PE头结构中Signature标
记的指针。那么我们就可以通过程序设置文件指针在偏移3ch处并读取,再根据
读取内容设置文件指针到相应的区域,并读出一个DWORD值来判断是否为PE标识
0x4550,此时就达到了我们判断WIN32 PE文件的目的。下面给出一个完整列子。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hFile;
LONG lnOff;
DWORD dwVes;
const WIN32_PE_ID=0x4550; //PE标识

if(OpenDialog1->Execute())
{
//打开文件

hFile=CreateFile(OpenDialog1->FileName.c_str(),GENERIC_READ,FILE_SHARE_READ,0,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hFile!=INVALID_HANDLE_VALUE)
{
//设置文件指针

if(SetFilePointer(hFile,0x3c,0,FILE_BEGIN))
{
//读取指向PE标记指针

if(ReadFile(hFile,&lnOff,2,&dwVes,0))
{
//根据读取内容重新设置文件指针,使其指向PE标记

SetFilePointer(hFile,lnOff,0,FILE_BEGIN);

//读区PE标记

ReadFile(hFile,&lnOff,4,&dwVes,0);

//判断是否为WIN32 PE格式

if(lnOff==WIN32_PE_ID) ShowMessage("此文件是WIN32 PE格式");
}

else ShowMessage("读文件错误!");

}

else ShowMessage("文件指针出错!");

}

else ShowMessage("打开件错误!");
}
}

IP: 已记录

 
发表新主题  发表回复 关闭主题 突出主题 移动主题 删除主题 下一个最老的主题   下一个最新的主题
 - 适于打印的主题视图
转到:
联系我们 | 20CN网络安全小组

Powered by Infopop Corporation
UBB.classic™ 6.5.0
NetDemon修改版 1.5.0, 20CN网络安全小组 版权所有。