PE解析之一、判断一个文件是否为PE文件(已经更新到PE解析之二)
											
程序代码:#include <stdio.h>
#include <windows.h>
//内存映像结构
typedef struct _MAP_FILE_STRUCT
{
    HANDLE hfile;
    HANDLE hmapping;
    LPVOID imagebase;
} MAP_FILE_STRUCT;
//判断是否是一个pe文件
BOOL ispefile(LPVOID imagebase)
{
    PIMAGE_DOS_HEADER pdh=NULL;
    PIMAGE_NT_HEADERS pnth=NULL;
    if(!imagebase) return FALSE;
    pdh=(PIMAGE_DOS_HEADER)imagebase;
    if(pdh->e_magic!=IMAGE_DOS_SIGNATURE) return FALSE;
    pnth=(PIMAGE_NT_HEADERS32)((DWORD)pdh+pdh->e_lfanew);
    if(pnth->Signature !=IMAGE_NT_SIGNATURE) return FALSE;
    return TRUE;
}
//主程序入口处//使用命令行参数获取待检测的pe文件名
int main(int argc,char *argv[])
{
    if (argc<2) return 0;
    //使用createfile、createfilemapping 、MapViewOfFile获取imagebase
    HANDLE hFile = CreateFile(argv[1],GENERIC_WRITE | GENERIC_READ,
                               FILE_SHARE_READ, NULL,OPEN_EXISTING,
                               FILE_FLAG_SEQUENTIAL_SCAN,NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
         printf("创建文件对象失败,错误代码:%d ", GetLastError());        
         return 0;
     }
        HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,
                                            0, 0, NULL);
    if (hFileMapping == NULL)
    {       
        DWORD dw=GetLastError();
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGID(LANG_NEUTRAL,
                      SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0, NULL);
        wsprintf(szBuf,("%s 出错信息 (出错码=%d): %s"),("CreateFileMapping"), dw, lpMsgBuf);
        printf("%s",szBuf);
        LocalFree(lpMsgBuf);
        return 0;    
    }
    LPVOID lpMemory = MapViewOfFile(hFileMapping,FILE_MAP_READ,0, 0, 0);
    if (lpMemory==NULL)
    {
         printf("创建文件视图对象失败,错误代码:%d ", GetLastError());
         return 0; 
    }
    if(!ispefile(lpMemory)) printf("%s不是一个有效的pe文件\n",argv[1]);
    else printf("%s是一个有效的PE文件\n",argv[1]);
   
    // 释放文件内核对象
    UnmapViewOfFile(lpMemory);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
   
    return 0;
}[ 本帖最后由 wp231957 于 2012-11-29 18:01 编辑 ]



											
	    

	

