1、用编辑程序把编制的源程序按照一定的书写格式送到计算机中,编辑程序会根据使用人员的意图对源程序进行增、删或修改。把送入的源程序翻译成机器语言,即用编译程序对源程序进行语法检查并将符合语法规则的源程序语句翻译成计算机能识别的“语言”。如果经编译程序检查,发现有语法错误,那就必须用编辑程序来修改源程序中的语法错误,然后再编译,直至没有语法错误为止。
2、使用计算机中的连接程序,把翻译好的计算机语言程序连接起来,并扶植成一个计算机能真正运行的程序。在连接过程中,一般不会出现连接错误,如果出现了连接错误,雀歼说明源程序中存在子程序的调用混乱或参数传递错误等问题。这时亩铅又要用编辑程序对源程序进行修改,再进行编译和连接,如此反复进行,直至没有连接错误为止。
3、将修改后的程序进行试算,这时可以假设几顷耐冲个模拟数据去试运行,并把输出结果与手工处理的正确结果相比较。如有差异,就表明计算机的程序存在有逻辑错误。如果程序不大,可以用人工方法去模拟计算机对源程序的这几个数据进行修改处理;如果程序比较大,人工模拟显然行不通,这时只能将计算机设置成单步执行的方式,一步步跟踪程序的运行。一旦找到问题所在,仍然要用编辑程序来修改源程序,接着仍要编译、连接和执行,直至无逻辑错误为止。也可以在完成后再进行编译。
下面的是运行程序的格式文档,有兴趣的就看一下。一、PE文件格式的概要
1.1、DOS MZ Header:
所有 PE文件(甚至32位的 DLLs)必须以一个简单的 DOS MZ Header 开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随 MZ Header 之后的 DOS Stub。
1.2、DOS Stub:
DOS Stub(存根)实际上是个有效的 MS-DOS .EXE 或者.COM 程序(如果文件格式不对会报错),在不支持 PE文件格式的 *** 作系统中,它将通过简单调用中断21h服务9来显示字符串"This program cannot run in DOS mode"或者根据程序员自己的意图实现完整的 DOS 代码。它的大小一般不能确定。利用链接器(linker)的 /STUB:filename 选项毁芹猜可以替换这个程首伏序。
1.3、PE Header:
紧接着 DOS Stub 的是 PE Header。PE Header 是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。执行体在支持PE文件结构的 *** 作系统中执行时,PE装载器将从 DOS MZ Header (IMAGE_DOS_HEADER)中找到 PE Header 的起始偏移量。因而跳过了DOS Stub 直接定位到真正的文件头PE Header。
1.4、Section Table:
PE Header 接下来的数组结构 Section Table (节表)。如果PE文件里有5个节,那么此 Section Table 结构数组内就有5个成员,每个成员包含对应节的属性、文件偏移量、虚拟偏移量等。
1.5、Sections:
PE文件的真正内容被划分成块,称之为Section(节)。每个标准节的名字均以圆点开头。Sections 是以其起始位址来排列,而不是以其字母次序来排列。下面是常见的节名及作用:
节名 作用
.arch 最初的构建信息(Alpha Architecture Information)
.bss 未经初始化的数据
.CRT C运行期只读数据
.data 已经初始化的数据
.debug 调试信息
.didata 延迟输入文件名表
.edata 导出文件名表
.idata 导入文件名表
.pdata 异常信息(Exception Information)
.rdata 只读的初始化数据
.reloc 重定位表信息
.rsrc 资源
.text .exe或.dll文件的可执行代码
.tls 线程的本地存储器
.xdata 异常处理表
节的纤型划分是基于各组数据的共同属性,而不是逻辑概念。每节是一块拥有共同属性的数据,比如代码/数据、读/写等。如果PE文件中的数据/代码拥有相同属性,它们就能被归入同一节中。节名称仅仅是个区别不同节的符号而已,类似"data", "code"的命名只为了便于识别,惟有节的属性设置决定了节的特性和功能。
1.6、装载一PE文件的主要步骤:
1.当PE文件被执行,PE装载器检查 DOS MZ Header 里的 PE Header 偏移量。如果找到,则跳转到 PE Header。
2.PE装载器检查 PE Header 的有效性。如果有效,就跳转到PE Header的尾部。
3.紧跟 PE Header 的是节表。PE装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性。
4.PE文件映射入内存后,PE装载器将处理PE文件中类似 Import Table(导入表)逻辑部分。
二、DOS MZ Header 和 PE Header
2.1、DOS MZ Header 定义成结构 IMAGE_DOS_HEADER(64字节) 。结构定义如下:
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE Header
WORD e_magic// Magic number
WORD e_cblp// Bytes on last page of file
WORD e_cp// Pages in file
WORD e_crlc// Relocations
WORD e_cparhdr// Size of Header in paragraphs
WORD e_minalloc// Minimum extra paragraphs needed
WORD e_maxalloc// Maximum extra paragraphs needed
WORD e_ss// Initial (relative) SS value
WORD e_sp// Initial SP value
WORD e_csum// Checksum
WORD e_ip// Initial IP value
WORD e_cs// Initial (relative) CS value
WORD e_lfarlc// File address of relocation table
WORD e_ovno// Overlay number
WORD e_res[4]// Reserved words
WORD e_oemid// OEM identifier (for e_oeminfo)
WORD e_oeminfo// OEM informatione_oemid specific
WORD e_res2[10]// Reserved words
LONG e_lfanew// File address of new exe Header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)