首页
社区
课程
招聘
[求助]pe文件判断的问题
发表于: 2006-4-25 00:27 4476

[求助]pe文件判断的问题

2006-4-25 00:27
4476
以下是主要的代码,调用时lpMem的值老是0
在下是新手,还请前辈指教
BOOL LoadFile(LPSTR pszFileName)
{
        HANDLE hFile;
        BOOL bSuccess=FALSE;
        char buf[20];
        hFile=CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_ARCHIVE,0);
        if(hFile!=INVALID_HANDLE_VALUE)
        {
                DWORD dwFileSize;
                HANDLE hMapFile;
                LPVOID lpMem;
                dwFileSize=GetFileSize(hFile,0);
                hMapFile=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
                if(hMapFile=NULL)
                {
                        MessageBox(NULL,"创建映象失败","info",MB_ICONINFORMATION|MB_OK);
                        CloseHandle(hMapFile);
                        return bSuccess;
                }
                lpMem=MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
                if(lpMem=NULL)
                MessageBox(NULL,"映射文件失败","info",MB_ICONINFORMATION|MB_OK);
                if(IsPeFile(lpMem)==FALSE)
                {
                        wsprintf(buf,"value is %d",(DWORD)lpMem);//提示的地方
                        MessageBox(NULL,buf,"info",MB_ICONINFORMATION|MB_OK);
                }
                else
                {
                        MessageBox(NULL,"是PE格式的文件","info",MB_ICONINFORMATION|MB_OK);
                        bSuccess=TRUE;
                }
                UnmapViewOfFile(lpMem);
                CloseHandle(hMapFile);
                CloseHandle(hFile);               
        }
        return bSuccess;
}

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;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
2
是否应这样写:
wsprintf(buf,"value is %d",*((DWORD*)lpMem));
因为lpMem是个指针,
2006-4-25 01:06
0
雪    币: 255
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我试了试,这样的话,编译以后反倒一运行就出错
关键是我打开的确实是一PE格式文件,
何故IsPeFile()函数返回的却是FALSE
2006-4-25 01:13
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
将这一句if (hMapFile=NULL)改成if (!hMapFile)就行了。
2006-4-25 14:08
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
5
呵呵,经典错误
2006-4-25 17:01
0
雪    币: 255
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
还是不行呀,提示错误签名。
PE.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。

改了后出现这些
2006-4-27 19:30
0
雪    币: 122
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这一句if(lpMem=NULL)也要改啊,if(NULL==lpMem),不过改过之后也不一定就对
2006-4-27 21:21
0
雪    币: 255
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
我试成功了,谢谢各位前辈仁兄
2006-4-28 20:27
0
游客
登录 | 注册 方可回帖
返回
//