| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2885 人关注过本帖
标题:PE解析之一、判断一个文件是否为PE文件(已经更新到PE解析之二)
取消只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:20 回复次数:9 
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
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
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
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
你们弄错了  我才是楼主
我的目标就是解析pe 而不是写病毒 木马 更不去做黑客

DO IT YOURSELF !
2012-11-29 14:24
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
而且猪猪说的是解析物理文件 貌似这也是解析pe的方法之一  
而我是照猫画虎,用的是镜像文件

DO IT YOURSELF !
2012-11-29 14:27
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
PE解析之二、输出FILEHEADER 和 OPTIONALHEADER中部分信息
程序代码:
#include <stdio.h>
#include <windows.h>

//判断是否是一个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;
}
//获取IMAGE_NT_HEADERS指针
PIMAGE_NT_HEADERS getntheaders(LPVOID imagebase)
{
    PIMAGE_DOS_HEADER pdh=NULL;
    PIMAGE_NT_HEADERS pnth=NULL;
    if(!ispefile(imagebase)) return NULL;
    pdh=(PIMAGE_DOS_HEADER)imagebase;
    pnth=(PIMAGE_NT_HEADERS32)((DWORD)pdh+pdh->e_lfanew);
    return pnth;
}
//获取IMAGE_FILE_HEADER指针
PIMAGE_FILE_HEADER WINAPI getfileheader(LPVOID imagebase)
{
    PIMAGE_NT_HEADERS pnth=NULL;
    PIMAGE_FILE_HEADER pfh=NULL;
    pnth=getntheaders(imagebase);
    if(!pnth) return NULL;
    pfh=&pnth->FileHeader;
    return pfh;
}
//获取IAMGE_OPTIONAL_HEADER指针
PIMAGE_OPTIONAL_HEADER WINAPI getoptionalheader(LPVOID imagebase)
{
    PIMAGE_OPTIONAL_HEADER poh=NULL;
    PIMAGE_NT_HEADERS pnth=NULL;
    pnth=getntheaders(imagebase);
    if(!pnth) return NULL;
    poh=&pnth->OptionalHeader ;
    return poh;
}
//主程序入口处//使用命令行参数获取待检测的pe文件名
int main(int argc,char *argv[])
{
    LPVOID lpMsgBuf;
    TCHAR szBuf[128];
    DWORD dw;
    PIMAGE_FILE_HEADER pfh=NULL;
    PIMAGE_OPTIONAL_HEADER poh=NULL;
    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)
     {
         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"),("CreateFile"), dw, lpMsgBuf);
         printf("%s",szBuf);
         LocalFree(lpMsgBuf);
         return 0;           
     }
    HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,
                                            0, 0, NULL);
    if (hFileMapping == NULL)
    {       
        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)
    {
        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"),("MapViewOfFile"), dw, lpMsgBuf);
        printf("%s",szBuf);
        LocalFree(lpMsgBuf);
        return 0;    
    }

    if(!ispefile(lpMemory)) printf("%s不是一个有效的pe文件\n",argv[1]);
    else
    {
        //传入的文件是一个有效的PE文件
        pfh=getfileheader(lpMemory);
        if(!pfh) return 0;
        //获取FILEHEADER部分信息
        printf("machine:%X\n",pfh->Machine);
        printf("numberofsections:%X\n",pfh->NumberOfSections);
        printf("timedatestamp:%X\n",pfh->TimeDateStamp );
        poh=getoptionalheader(lpMemory);
        if(!poh)
        {
            printf("获取optionalheader失败\n");
            return 0;
        }
        //获取OPTIONALHEADER部分信息
        printf("imagebase=:%X\n",poh->ImageBase );
        printf("addressofentrypoint=:%X\n",poh->AddressOfEntryPoint );
        printf("baseofcode=:%X\n",poh->BaseOfCode );
        printf("subsystem=:%X\n",poh->Subsystem  );
    }
   
    // 释放文件内核对象
    UnmapViewOfFile(lpMemory);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);

    return 0;
}

DO IT YOURSELF !
2012-11-29 17:54
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
这些都是pe结构 比较简单的一些结构
和英语有虾米关系

DO IT YOURSELF !
2012-11-30 05:49
快速回复:PE解析之一、判断一个文件是否为PE文件(已经更新到PE解析之二)
数据加载中...
 
   



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

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