找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1290|回复: 20

抄袭一些数据,仅供123参考

[复制链接]
发表于 2007-6-30 17:26:26 | 显示全部楼层 |阅读模式
PE文件结构
  PE文件格式被组织为一个线性的数据流,它由一个MS-DOS头部开始,接着是一个是模式的程序残余以及一个PE文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。
MZ头部/实模式头部
  PE文件格式的第一个组成部分是MS-DOS头部。在PE文件格式中,它并非一个新概念,因为它与MS-DOS 2.0以来就已有的MS-DOS头部是完全一样的。保留这个相同结构的最主要原因是,当你尝试在Windows或MS-DOS 2.0以上的系统下装载一个文件的时候,操作系统能够读取这个文件并明白它是和当前系统不相兼容的。换句话说,当你在MS-DOS 6.0下运行一个Windows NT可执行文件时,你会得到这样一条消息:“This program cannot be run in DOS mode.”如果MS-DOS头部不是作为PE文件格式的第一部分的话,操作系统装载文件的时候就会失败,并提供一些完全没用的信息,例如:“The name specified is not recognized as an internal or external command, operable program or batch file.”
   MZ头部占据了PE文件的头64个字节,描述它内容的结构如下:
WINNT.H
typedef struct _MZ_DOS_HEADER { // MZ的.EXE头部
USHORT e_magic; // MZ格式标志,该值为0x5A4D
USHORT e_cblp; // 文件最后页的字节数
USHORT e_cp; // 文件页数
USHORT e_crlc; // 重定义元素个数
USHORT e_cparhdr; // 头部尺寸,以段落为单位
USHORT e_minalloc; // 所需的最小附加段
USHORT e_maxalloc; // 所需的最大附加段
USHORT e_ss; // 初始的SS值(相对偏移量)
USHORT e_sp; // 初始的SP值
USHORT e_csum; // 校验和
USHORT e_ip; // 初始的IP值
USHORT e_cs; // 初始的CS值(相对偏移量)
USHORT e_lfarlc; // 重分配表文件地址
USHORT e_ovno; // 覆盖号
USHORT e_res[4]; // 保留字
USHORT e_oemid; // OEM标识符(相对e_oeminfo)
USHORT e_oeminfo; // OEM信息
USHORT e_res2[10]; // 保留字
LONG e_lfanew; // PE的exe头部的文件地址
} MZ_DOS_HEADER, *MZ_DOS_HEADER;
   第一个域 e_magic ,被称为魔术数字,它被用于表示一个MS-DOS兼容的文件类型。所有MS-DOS兼容的可执行文件都将这个值设为0x5A4D,表示ASCII字符MZ。MS-DOS头部之所以有的时候被称为MZ头部,就是这个缘故。还有许多其它的域对于MS-DOS操作系统来说都有用,但是对于Windows NT来说,这个结构中只有一个有用的域——最后一个域 e_lfnew ,一个4字节的文件偏移量,PE文件头部就是由它定位的。对于Windows NT的PE文件来说,PE文件头部是紧跟在MS-DOS头部和实模式程序残余之后的。
实模式残余程序
  实模式残余程序是一个在装载时能够被MS-DOS运行的实际程序。对于一个MS-DOS的可执行映像文件,应用程序就是从这里执行的。对于Windows、OS/2、Windows NT这些操作系统来说,MS-DOS残余程序就代替了主程序的位置被放在这里。这种残余程序通常什么也不做,而只是输出一行文本,例如:“This program requires Microsoft Windows v3.1 or greater.”当然,用户可以在此放入任何的残余程序,这就意味着你可能经常看到像这样的东西:“You can't run a Windows NT application on OS/2, it's simply not possible.”
   当为windows构建一个应用程序的时候,链接器将向你的可执行文件中链接一个名为WINSTUB.EXE的默认残余程序。你可以用一个基于MS-DOS的有效程序取代WINSTUB,并且用 STUB 模块定义语句指示链接器,这样就能够取代链接器的默认行为。为Windows NT开发的应用程序可以通过使用 -STUB: 链接器选项来实现。
发表于 2007-6-30 17:27:23 | 显示全部楼层
这么专业的东东干吗弄到水区来
回复

使用道具 举报

 楼主| 发表于 2007-6-30 17:28:40 | 显示全部楼层
关键偶也不太懂,不知道该放哪里好:P
回复

使用道具 举报

 楼主| 发表于 2007-6-30 17:43:20 | 显示全部楼层
PE文件结构(简化):

                         -----------------
                         │1,DOS MZ header│
                         -----------------
                         │2,DOS stub     │
                         -----------------
                         │3,PE header    │
                         -----------------
                         │4,Section table│
                         -----------------
                         │5,Section 1    │
                         -----------------
                         │6,Section 2    │
                         -----------------
                         │  Section ...  │
                         -----------------
                         │n,Section n    │
                         -----------------
第二部分就是连接程序连接的WINSTUB.EXE(也就是输出“This program cannot be run in DOS mode.”),你可以用一个基于MS-DOS的有效程序取代WINSTUB,并且用 STUB 模块定义语句指示链接器,这样就能够取代链接器的默认行为,酱紫就可以实现在DOS也可以运行了。
回复

使用道具 举报

 楼主| 发表于 2007-6-30 18:44:00 | 显示全部楼层
奇怪:o 123MM居然还没出现:Q
回复

使用道具 举报

发表于 2007-6-30 18:49:52 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2007-6-30 18:52:15 | 显示全部楼层
原帖由 lintel 于 2007-6-30 18:49 发表
在学习

学完了再教我ing:)
回复

使用道具 举报

发表于 2007-6-30 18:52:42 | 显示全部楼层
橘皮猫是在哪找的
回复

使用道具 举报

发表于 2007-6-30 18:59:43 | 显示全部楼层
不错 学习一下!!!!!!!
回复

使用道具 举报

 楼主| 发表于 2007-6-30 19:00:11 | 显示全部楼层
google,好久没编过程了,正准备用asm32(咱只懂得tc和masm的一点皮毛:L )做个例子,努力ing...
回复

使用道具 举报

 楼主| 发表于 2007-6-30 19:50:12 | 显示全部楼层
先顶上去再说......:P
回复

使用道具 举报

发表于 2007-6-30 20:12:01 | 显示全部楼层
楼主不如说在VC++里的编译参数加上/stub:exefile.exe算了(其中exefile.exe是16位程序),废话那么多
回复

使用道具 举报

发表于 2007-6-30 20:15:48 | 显示全部楼层
原帖由 123 于 2007-6-30 08:12 PM 发表
楼主不如说在VC++里的编译参数加上/stub:exefile.exe算了(其中exefile.exe是16位程序),废话那么多

这个不错
回复

使用道具 举报

 楼主| 发表于 2007-6-30 20:23:10 | 显示全部楼层
原帖由 123 于 2007-6-30 20:12 发表
楼主不如说在VC++里的编译参数加上/stub:exefile.exe算了(其中exefile.exe是16位程序),废话那么多

我只会asm和tc,不会C++:L
回复

使用道具 举报

发表于 2007-6-30 20:25:06 | 显示全部楼层
原帖由 netwinxp 于 2007-6-30 20:23 发表

我只会asm和tc,不会C++:L

asm和tc生成的本来就可以在DOS里运行
回复

使用道具 举报

 楼主| 发表于 2007-6-30 20:26:19 | 显示全部楼层
asm也可以生成win32的程序(现在通常带windows库的称asm32)
回复

使用道具 举报

发表于 2007-6-30 21:21:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-6-30 22:06:26 | 显示全部楼层
走错门了。。。。。。
回复

使用道具 举报

发表于 2007-6-30 22:09:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-6-30 22:13:17 | 显示全部楼层
原帖由 123 于 2007-6-30 08:12 PM 发表
楼主不如说在VC++里的编译参数加上/stub:exefile.exe算了(其中exefile.exe是16位程序),废话那么多

我喜欢你这种说话方式了
虽然我对你所述一窍不通。
回复

使用道具 举报

发表于 2007-6-30 22:25:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-9-18 01:12

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表