| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2885 人关注过本帖
标题:PE解析之一、判断一个文件是否为PE文件(已经更新到PE解析之二)
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:20 回复次数:28 
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 编辑 ]
2012-11-28 21:35
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
发现还是用c写代码好,毕竟都是ms自己的东东 ,融合度非常好
要是用delphi写,那些pe结构(PE中结构体太多了)都需要自己实现(或者叫翻译过来) 好繁琐啊

启示:要努力学好C

DO IT YOURSELF !
2012-11-28 21:49
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:20 
这个东西直接用肉眼看就得了,还用的着写工具吗?why还搞个内存映像来判断,有必要么?直接读文件不就完了么,呵呵
你这个照搬别人的代码吧,kssd上的,或者看雪第3版page 300 10.15.1文件格式检查,完全一样的代码
2012-11-28 22:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用bccnyouke在2012-11-28 22:13:20的发言:

这个东西直接用肉眼看就得了,还用的着写工具吗?why还搞个内存映像来判断,有必要么?直接读文件不就完了么,呵呵
你这个照搬别人的代码吧,kssd上的,或者看雪第3版page 300 10.15.1文件格式检查,完全一样的代码
太对了 就是搬得 不过原代码不全 只有部分函数  主函数部分是我自己写的

DO IT YOURSELF !
2012-11-28 22:15
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:0 
大概只有printf错误代码是你自己想的吧,不要这么写
直接FormatMessage出来,你打印一个err_code不是半调子么,呵呵
2012-11-28 22:22
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用bccnyouke在2012-11-28 22:22:11的发言:

大概只有printf错误代码是你自己想的吧,不要这么写
直接FormatMessage出来,你打印一个err_code不是半调子么,呵呵
老大,这些对于你来说可能过于easy
但是我调试main()这段代码  可是废了不少时间呢
一开始,那个什么函数指针老是返回0 我加了一个错误代码打印 发现是1006
后来发现有几处错误,即使是书上的 或者网上的 也不是拿过来就能用的
等调试成成功时,自己也会差不过了

DO IT YOURSELF !
2012-11-28 22:28
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:0 
回复 6楼 wp231957
和你说话真的很累的,你看错误代码,能看出点什么东西?你是不是拿了1006再去baidu?
都告诉你了用FormatMessage直接把错误信息打印出来,怎么就不懂呢,累哦
2012-11-28 22:41
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用bccnyouke在2012-11-28 22:41:05的发言:

和你说话真的很累的,你看错误代码,能看出点什么东西?你是不是拿了1006再去baidu?
都告诉你了用FormatMessage直接把错误信息打印出来,怎么就不懂呢,累哦
谢谢,我再看看

DO IT YOURSELF !
2012-11-28 22:45
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


弄好了 谢谢游客

DO IT YOURSELF !
2012-11-28 23:08
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
搬砖,不是好习惯。读文件就好了       起先开始两个字节不是 mz 就一定不是pe 文件   将文件指针往后挪动多少个字节忘掉   dos头尾巴最后4个字节 放的偏移   用这个地址去找pe头的地址判断  是否为pe
讲述完毕   编程照着上面的一翻译就完了,不费多大的事

我要成为嘿嘿的黑客,替天行道
2012-11-29 14:01
快速回复:PE解析之一、判断一个文件是否为PE文件(已经更新到PE解析之二)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018508 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved