| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1874 人关注过本帖
标题:关键字:基础 EXE PE C 复习 一
取消只看楼主 加入收藏
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
结帖率:92.31%
收藏
已结贴  问题点数:100 回复次数:5 
关键字:基础 EXE PE C 复习 一
观看此贴需要基本的C知识---会写你好世界 会查MSDN 会谷歌百度
需要稍微了解一点点的数据结构知识---不了解也问题不是很大
需要一点点的耐心


=================================================================
程序代码:
lkd> dt _IMAGE_DOS_HEADER
nt!_IMAGE_DOS_HEADER
   +0x000 e_magic          : Uint2B
   +0x002 e_cblp           : Uint2B
   +0x004 e_cp             : Uint2B
   +0x006 e_crlc           : Uint2B
   +0x008 e_cparhdr        : Uint2B
   +0x00a e_minalloc       : Uint2B
   +0x00c e_maxalloc       : Uint2B
   +0x00e e_ss             : Uint2B
   +0x010 e_sp             : Uint2B
   +0x012 e_csum           : Uint2B
   +0x014 e_ip             : Uint2B
   +0x016 e_cs             : Uint2B
   +0x018 e_lfarlc         : Uint2B
   +0x01a e_ovno           : Uint2B
   +0x01c e_res            : [4] Uint2B
   +0x024 e_oemid          : Uint2B
   +0x026 e_oeminfo        : Uint2B
   +0x028 e_res2           : [10] Uint2B
   +0x03c e_lfanew         : Int4B

win32下的EXE DLL 文件都是PE结构,所以我们统称这些为PE文件。
学习PE文件结构,首先需要了解的就是 IMAGE_DOS_HEADER  结构


PE文件结构的第一个结构,就是   IMAGE_DOS_HEADER ,即DOS头,
这个是以前16位的遗留,虽然已经用处不大,但是在PE文件中还是必不可少
的部分,使用DOS头中的标志可以判断该文件是否是合法的EXE或者DLL。

上面是我在自己电脑上使用windbg查看的    IMAGE_DOS_HEADER 结构。
这个是不会变的。 你也可以在VC里直接查找该定义,好象在winnt.h中。
程序代码:
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
    FILE *p;
    IMAGE_DOS_HEADER    tou;
    unsigned long       biaozhi;

    p = fopen("bccn.exe","r+b");
    if(p == NULL)
        return -1;

    fread(&tou,sizeof(tou),1,p);
    fseek(p,tou.e_lfanew,SEEK_SET);
    fread(&biaozhi,4,1,p);
    fclose(p);

    printf("IMAGE_DOS_HEADER dump:\n");
    printf("e_magic   : %08x\n",tou.e_magic);
    printf("e_cblp    : %08x\n",tou.e_cblp);
    printf("e_cp      : %08x\n",tou.e_cp);
    printf("e_crlc    : %08x\n",tou.e_crlc);
    printf("e_cparhdr : %08x\n",tou.e_cparhdr);
    printf("e_minalloc: %08x\n",tou.e_minalloc);
    printf("e_maxalloc: %08x\n",tou.e_maxalloc);
    printf("e_ss      : %08x\n",tou.e_ss);
    printf("e_sp      : %08x\n",tou.e_sp);
    printf("e_csum    : %08x\n",tou.e_csum);
    printf("e_ip      : %08x\n",tou.e_ip);
    printf("e_cs      : %08x\n",tou.e_cs);
    printf("e_lfarlc  : %08x\n",tou.e_lfarlc);
    printf("e_ovno    : %08x\n",tou.e_ovno);
    printf("e_res[4]  : %08x\n",tou.e_res[4]);
    printf("e_oemid   : %08x\n",tou.e_oemid);
    printf("e_oeminfo : %08x\n",tou.e_oeminfo);
    printf("e_res2[10]: %08x\n",tou.e_res2[10]);
    printf("e_lfanew  : %08x\n",tou.e_lfanew);


    if((tou.e_magic ==IMAGE_DOS_SIGNATURE) &&
        (biaozhi == IMAGE_NT_SIGNATURE))
        printf("PE文件\n");
    else
        printf("不是PE文件\n");
    return 0;
}

上面代码很简单,就是打开一个文件,将它的IMAGE_DOS_HEADER结构输出,
并且判断其中2个位置是否符合PE文件规范,如果是,就可认为是PE文件。
IMAGE_DOS_HEADER结构在windows.h有声明,直接可以用。
建议安装VAX 即VC助手。很方便。

新建一个win32控制台项目,拷贝上面代码 生成EXE。
将任一文件比如 .txt  .bmp  .jpg .exe等等改名为 bccn.exe 和生成的EXE放同一文件夹里,然后开始--程序--附件--命令提示符 进入控制台窗口  CD命令 进入EXE目录,运行之,就会有信息输出了。

这个主要看代码
DOS头部分很简单,主要就是偏移0X00和0X3C处的值。

因为这贴写的比较匆忙。但是应该不影响理解。 下贴写详细点。

学习这个东东刚开始的时候会比较头晕,习惯就好了。
有兴趣的朋友可以自己找资料详学。






搜索更多相关主题的帖子: 关键字 谷歌百度 
2011-02-09 00:32
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
如果你是用的windows,这个就是你电脑里的所有的EXE文件的前3C字节的内容所描述的
意思

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-02-09 00:48
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
以下是引用BlueGuy在2011-2-9 15:52:53的发言:

楼主啊, 我劝你远离 是非之地~~
这些东东既不酷又不炫,
属于在win环境下编程的内功,
偶也完全是C盲,
只是因为这方面的知识忘了,想重新复习复习,以前用汇编,现在顺带着
学习学习C语言。
像偶这样的人 是不会“伟大”到专门发贴“帮助人指导人”的层次的。
发贴主要是自己记录 自己学习,如果有朋友看了 觉得感兴趣 或者是由此
贴知道了某些名词某些概念 偶就认为是莫大的意外之功了。

此处略去一万字

你懂的



===========================================================
直接编辑 接主贴:

趁手的工具是必不可少的,Stud_PE 就是一款学习PE结构的好工具,有
兴趣的朋友可以百度这个关键字 自己下载。

下载好后,运行Stud_PE,文件--打开,打开主贴里生成的EXE,然后菜单拦
打开 DOS 选项卡,这就是DOS头的信息了,然后点开 在十六进制编辑器中查看 ,
就可以很方便查看PE文件头了。

图片附件: 游客没有浏览图片的权限,请 登录注册


如上图,点开DOS文件头,就可以查看主贴里所说的IMAGE_DOS_HEADER结构,
并可以查看EXE在磁盘中的对应的部分。




[ 本帖最后由 你们都要疼我哦 于 2011-2-9 18:35 编辑 ]

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-02-09 18:06
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
刚开始忘了占楼了,到最后再编辑吧。

图片附件: 游客没有浏览图片的权限,请 登录注册



这是从书里偷来的一个PE结构的总的图示。
希望对PE格式感兴趣想学习的朋友 能把这个图记住。节名就不用记了。

前面有段代码:
if((tou.e_magic == IMAGE_DOS_SIGNATURE) &&
        (biaozhi == IMAGE_NT_SIGNATURE))
        printf("PE文件\n");

IMAGE_DOS_HEADER结构对我们来说有2个重要字段
偏移0x000处的 e_magic
和偏移0x03c处的 e_lfanew
上面的代码就是根据这2个字段的内容来判断该文件是否是PE格式的文件。
它们的值都被头文件define成常量了,可以在VC里直接查看之。

DOS stub 结构基本没什么用,现在一般就是作为DOS时代的残留 在DOS方式下作
为可执行部分负责显示一些提示信息。当然,也可以加以利用,这不属我们的学
习范围。

+0x03c e_lfanew         : Int4B
DOS头结构的最后一个字段偏移为3c,这个字段大小为 Int4B,那么我们可知
DOS stub开始偏移为0x040,而e_lfanew字段内容就是一个4字节的指针,它指向
了PE文件真正的开始地址,这个真正的开始地址以一个双字结构为标志,
内容是50 45,即上面代码里的被预定义过的IMAGE_NT_SIGNATURE。


小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-02-14 00:57
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
程序代码:
IMAGE_NT_HEADERS STRUCT
  Signature       DWORD    ?
  FileHeader      IMAGE_FILE_HEADER   <>
  OptionalHeader  IMAGE_OPTIONAL_HEADER32  <>
IMAGE_NT_HEADERS ENDS

这个就是重点内容了 IMAGE_NT_HEADERS 结构

它又分为3个子结构
PE头标志
映像文件头
映像可选头。

===================================
为方便起见,当需要写C代码的时候,一般都是写关键语句,到帖子最后,
会完整的附出代码。
===================================
程序代码:
lkd> dt _IMAGE_NT_HEADERS
nt!_IMAGE_NT_HEADERS
   +0x000 Signature        : Uint4B
   +0x004 FileHeader       : _IMAGE_FILE_HEADER
   +0x018 OptionalHeader   : _IMAGE_OPTIONAL_HEADER

上面就是在我电脑上用windbg显示的IMAGE_NT_HEADERS结构及内部偏移。




[ 本帖最后由 你们都要疼我哦 于 2011-2-14 16:18 编辑 ]

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-02-14 01:50
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
映像文件头 IMAGE_FILE_HEADER结构如下:
程序代码:
lkd> dt _IMAGE_FILE_HEADER
nt!_IMAGE_FILE_HEADER
   +0x000 Machine          : Uint2B
   +0x002 NumberOfSections : Uint2B
   +0x004 TimeDateStamp    : Uint4B
   +0x008 PointerToSymbolTable : Uint4B
   +0x00c NumberOfSymbols  : Uint4B
   +0x010 SizeOfOptionalHeader : Uint2B
   +0x012 Characteristics  : Uint2B
它又有七个子结构。
Machine          : Uint2B  指定本文件运行平台信息
NumberOfSections : Uint2B  指出本文件存在的节的数量
TimeDateStamp    : Uint4B  编译器创建此文件的时间
PointerToSymbolTable : Uint4B  指向符号表的指针
NumberOfSymbols  : Uint4B      符号表数量
SizeOfOptionalHeader : Uint2B  下一个结构IMAGE_OPTIONAL_HEADER32的长度
Characteristics  : Uint2B  文件属性字段 这是一个2字节16位字段,每一位都表示一个属性,比如第13位为0表示本文件是一般的可执行文件,为1表示是DLL文件。..

========================================================

pe文件结构 既称为结构 重点就是了解其结构布局,基本上没有任何困难,
无非就是一些固定的结构 然后再嵌套几个子结构 或者再嵌套 等等。
无论学到哪个部分 只要记住总的结构 就能达到提纲挈领的效果。

以上是PE结构中很简单的一部分,下面就是重点中的重点了 映像可选头 IMAGE_OPTIONAL_HEADER32 结构。



小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2011-02-14 16:57
快速回复:关键字:基础 EXE PE C 复习 一
数据加载中...
 
   



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

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