1 // IsPE.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "windows.h" 6 BOOL IsPeFile(char szFile[]); 7 int main(int argc, char* argv[]) 8 { 9 printf("%d",sizeof(float)); 10 IsPeFile("c:\\123.exe"); 11 return 0; 12 } 13 14 15 16 BOOL IsPeFile(char szFile[]) 17 { 18 //CreateFile既可以用来创建一个文件也可以打开一个文件,如果是打开一个文件的话,那么文件的属性就被忽略了, 19 //只有创建一个文件的时候才需要指定这个文件的属性比如隐藏属性啊 ,系统属性啊之类的。 20 HANDLE hFile=CreateFile(szFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL); 21 22 //注意CreateFile和CreateFileMapping的权限必须相同,或者CreateFile的权限应该兼容CreateFileMapping的权限。 23 24 if(INVALID_HANDLE_VALUE==hFile) 25 { 26 printf("CreateFile error! errorcode is %d",GetLastError()); 27 CloseHandle(hFile); 28 return FALSE; 29 } 30 31 HANDLE hcf=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,0); 32 33 34 LPVOID lpmf=MapViewOfFile(hcf,FILE_MAP_ALL_ACCESS,0,0,0); 35 if(NULL==lpmf) 36 { 37 printf("MapViewOfFile error errorcode is %d",GetLastError()); 38 UnmapViewOfFile(lpmf); 39 CloseHandle(hFile); 40 return FALSE; 41 } 42 43 44 PIMAGE_DOS_HEADER a=(PIMAGE_DOS_HEADER)lpmf; 45 if(IMAGE_DOS_SIGNATURE==a->e_magic) 46 { 47 printf("MZ\n"); 48 } 49 //指针为什么有类型呢? BYTE*类型的指针移动的时候是一个BYTE一个BYTE移动的,而DWORD*类型的指针移动的时候是一个DWORD一个DWORD移动的。 50 PIMAGE_NT_HEADERS32 b=(PIMAGE_NT_HEADERS32)((DWORD*)lpmf+a->e_lfanew/4); 51 if(IMAGE_NT_SIGNATURE==b->Signature) 52 { 53 printf("PE\n"); 54 } 55 56 printf("this file is a valid PE !"); 57 UnmapViewOfFile(lpmf); 58 CloseHandle(hFile); 59 return TRUE; 60 }
//有没有朋友能帮忙看下我哪里写的不好,多谢了。 //另外还有一个问题,调用每个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;
}
本文介绍了一个C++程序,用于检测Windows PE文件的有效性。通过使用CreateFile、CreateFileMapping和MapViewOfFile等API,程序能够读取并验证PE文件的DOS和NT头部签名。文章还讨论了API错误处理和内存映射文件的使用。
3566

被折叠的 条评论
为什么被折叠?



