| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2885 人关注过本帖
标题:PE解析之一、判断一个文件是否为PE文件(已经更新到PE解析之二)
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wp231957在2012-11-29 14:24:13的发言:

你们弄错了  我才是楼主
我的目标就是解析pe 而不是写病毒 木马 更不去做黑客

哦,是错了。我说的是猪猪侠。

授人以渔,不授人以鱼。
2012-11-29 14:25
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
     羞死我了,我只是喜欢数理逻辑而已呀。我从C到汇编再到保护模式,再到pe,就只是1个问题没明白,这个程序到底是怎么放到内存怎么被执行起来的,看正面教材木有这方面的呀,只好看反面的啦,一个很奇怪的问题,这些书通通的说自己是为安全服务的。哈哈

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

DO IT YOURSELF !
2012-11-29 14:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实,你看看BMP图像文件的格式,就知道这种靠头信息解析数据的方式有什么“漏洞”,以前有一种病毒就是靠依附在BMP文件末尾传播的,这个漏洞后来有了补丁,解决的办法是先把图像解析到内存中,然后复制图像的真实部分显示出来,舍弃多余的数据,防止那部分代码被运行,在网站上允许上传图像的功能,都要防这一手。

授人以渔,不授人以鱼。
2012-11-29 14:37
bccnyouke
Rank: 2
等 级:论坛游民
帖 子:26
专家分:49
注 册:2012-11-23
收藏
得分:0 
以下是引用TonyDeng在2012-11-29 14:37:43的发言:

其实,你看看BMP图像文件的格式,就知道这种靠头信息解析数据的方式有什么“漏洞”,以前有一种病毒就是靠依附在BMP文件末尾传播的,这个漏洞后来有了补丁,解决的办法是先把图像解析到内存中,然后复制图像的真实部分显示出来,舍弃多余的数据,防止那部分代码被运行,在网站上允许上传图像的功能,都要防这一手。
一张图片就能破PSP了,玩过PSP的都知道
2012-11-29 14:46
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
哈哈,PE是个艺术品,思想很多呢,我要专注的弄懂他,肯定会有个高层次的超越的,所以嘛,不受勾引

我要成为嘿嘿的黑客,替天行道
2012-11-29 14:52
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
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
天啦,我跪了。加油
你逼的,我要学英语了,看了半天,看不进去。怎么阅读能给个经验么

我要成为嘿嘿的黑客,替天行道
2012-11-30 03: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.047120 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved