验证PE文件有效性
2012-05-30 06:59
387 查看
// IsPE.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" BOOL IsPeFile(char szFile[]); int main(int argc, char* argv[]) { printf("%d",sizeof(float)); IsPeFile("c:\\123.exe"); return 0; } BOOL IsPeFile(char szFile[]) { //CreateFile既可以用来创建一个文件也可以打开一个文件,如果是打开一个文件的话,那么文件的属性就被忽略了, //只有创建一个文件的时候才需要指定这个文件的属性比如隐藏属性啊 ,系统属性啊之类的。 HANDLE hFile=CreateFile(szFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL); //注意CreateFile和CreateFileMapping的权限必须相同,或者CreateFile的权限应该兼容CreateFileMapping的权限。 if(INVALID_HANDLE_VALUE==hFile) { printf("CreateFile error! errorcode is %d",GetLastError()); CloseHandle(hFile); return FALSE; } HANDLE hcf=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,0); LPVOID lpmf=MapViewOfFile(hcf,FILE_MAP_ALL_ACCESS,0,0,0); if(NULL==lpmf) { printf("MapViewOfFile error errorcode is %d",GetLastError()); UnmapViewOfFile(lpmf); CloseHandle(hFile); return FALSE; } PIMAGE_DOS_HEADER a=(PIMAGE_DOS_HEADER)lpmf; if(IMAGE_DOS_SIGNATURE==a->e_magic) { printf("MZ\n"); } //指针为什么有类型呢? BYTE*类型的指针移动的时候是一个BYTE一个BYTE移动的,而DWORD*类型的指针移动的时候是一个DWORD一个DWORD移动的。 PIMAGE_NT_HEADERS32 b=(PIMAGE_NT_HEADERS32)((DWORD*)lpmf+a->e_lfanew/4); if(IMAGE_NT_SIGNATURE==b->Signature) { printf("PE\n"); } printf("this file is a valid PE !"); UnmapViewOfFile(lpmf); CloseHandle(hFile); return TRUE; }
//有没有朋友能帮忙看下我哪里写的不好,多谢了。 //另外还有一个问题,调用每个API都有可能出错,是不是每调用一个API就要在后面加上检测这个API执行结果的代码呢? 如何改进呢?
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
上面那是我今天写的,还有个前几个月前写的吧,今天给翻出来了。
PIMAGE_DOS_HEADER lpMapView=(PIMAGE_DOS_HEADER)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0); //check MZ signature BOOL bMZ; BYTE *bMZsig=(BYTE*)lpMapView; if('M'==*bMZsig) { bMZsig++; if('Z'==*bMZsig) { bMZ=TRUE; } } //check PE signature BOOL bPE; BYTE *bPEoffset=(BYTE*)lpMapView+sizeof(IMAGE_DOS_HEADER)-4; BYTE *bPEsig=(BYTE*)lpMapView+(*bPEoffset); if('P'==*bPEsig) { bPEsig++; if('E'==*bPEsig) bPE=TRUE; }
相关文章推荐
- PE文件-检验PE文件的有效性--转自iczelion,附vc示范
- RMAN 验证 数据文件 和 备份 的有效性
- 确定PE文件有效性
- PE教程2: 检验PE文件的有效性
- RMAN 验证 数据文件 和 备份 的有效性
- RMAN 验证 数据文件 和 备份 的有效性
- 《Windows核心编程》---检测PE文件有效性
- PE教程2: 检验PE文件的有效性
- 验证 PE 文件的数字签名
- 用C写的验证是否是PE有效文件
- RMAN 验证 数据文件 和 备份 的有效性
- RMAN 验证 数据文件 和 备份 的有效性
- 验证pe文件数字签名
- awk中一个验证passwd文件有效性的例子
- PE教程2: 检验PE文件的有效性
- 转:RMAN 验证 数据文件 和 备份 的有效性
- 验证pe文件数字签名
- PE文件格式详解(下)
- PE文件格式详解
- PE文件详解-----PE文件的简介