文件装载过程.pdf_第1页
文件装载过程.pdf_第2页
文件装载过程.pdf_第3页
文件装载过程.pdf_第4页
文件装载过程.pdf_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Exe 文件装载过程 一 程序段前缀 PSP 1 二 程序加载及实现 4 三 重定位过程 4 四 在 DOS 下 重定位指的是重新定位在你的程序中所引用的段值 4 五 exe 文件结构 5 一 程序段前缀 PSP PSP Program segment prefix 称为程序段前缀 是 DOS 在加载外部命令 或应用程序 EXE 或 COM 文件 时 在加载的程序段前面设置的一个固定长度的信息 区 共 100H 字节 PSP 包括以下四个组成部分 l供进程调用的 DOS 入口 PSP 0 2 5 50H 和 2CH 字段 l供进程使用的传递参数 PSP 5CH 6CH 和 80H 字段 l为 DOS 保存的中断向量 PSP 0AH 0EH 和 12H 字段 l由 DOS 专用的保留区域 PSP 16H 2BH 和 2EH 37H 字段 PSP 的某些关键字段涉及到系统内部管理 所以使用者不得更改 偏移字节数说 明 000002中断20H 000202 以节计算的内存大小 利用这个可看出是否感染引导型 病毒 000401保留 000505至 DOS 的长调用 000A02INT 22H 入口 IP 000C02INT 22H 入口 CS 000E02INT 23H 入口 IP 001002INT 23H 入口 CS 001202INT 24H 入口 IP 001402INT 24H 入口 CS 001602父进程的 PSP 段值 可测知是否被跟踪 001814存放20个 SOFT 号 002C02环境块段地址 从中可获知执行的程序名 002E04存放用户栈地址指针 00321E保留 005003DOS 调用 INT 21H RETF 005302保留 005507扩展的 FCB 头 005C10格式化的 FCB1 006C10格式化的 FCB2 007C04保留 008080 命令行参数长度 不包含总为最后的0D 及参数 也是程序运行期间缺省的 DTA 一个操作示例 D Masm615 dir jch 显示计算阶乘的程序 Volume in drive D has no label Volume Serial Number is 18F0 186B Directory of D Masm615 JCHOBJ37104 10 03 20 58JCH obj JCHASM3 63704 03 03 20 46jch asm JCHCOM12 48604 10 0320 58 J 3 file s 16 494 bytes 0 dir s 915 632 128 bytes free D Masm615 jch 7 计算7的阶乘 5040 D Masm615 debug 7 用 DEBUG 查看命令行参数情况 d80 L10 可看出命令行参数长度为02 参数是 2037 0D 128D 0080 02 20 37 0D 68 2E 63 6F 6D 20 37 0D 00 00 00 00 7 D0 7F 显示 PSP数据 128D 0000 CD 20 00 9D 00 9A F0 FE 1D F0 4F 03 F2 0B 8A03 128D 0010 F2 0B 17 03 F2 0B E1 0B 01 01 01 00 02 FF FF FF 父进程的 PSP 128D 0020 FF FF FF FF FF FF FF FF FF FF FF FF 7E 12 4C 01 环境块段地址 128D 0030 F9 0F 14 00 18 00 8D 12 FF FF FF FF 00 00 00 00 128D 0040 07 0A00 00 00 00 00 00 00 00 00 00 00 00 00 00 128D 0050 CD 21 CB 00 00 00 00 00 00 00 00 00 00 37 20 20 128D 0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 128D 0070 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 D127E 0 显示环境块的内容 在 DOS 提示符下可用 SET 命 令查看环境信息 127E 0000 54 4D 50 3D 43 3A 5C 57 49 4E 44 4F 57 53 5C 54 TMP C WINDOWS T 127E 0010 45 4D 50 00 54 45 4D 50 3D 43 3A5C 57 49 4E 44 EMP TEMP C WIND 127E 0020 4F 57 53 5C 54 45 4D 50 00 50 52 4F 4D 50 54 3D OWS TEMP PROMPT 127E 0030 24 70 24 67 00 77 69 6E 62 6F 6F 74 64 69 72 3D p g winbootdir 127E 0040 43 3A 5C 57 49 4E 44 4F 57 53 00 50 41 54 48 3D C WINDOWS PATH 127E 0050 43 3A5C 57 49 4E 44 4F 57 53 3B 43 3A 5C 57 49 C WINDOWS C WI 127E 0060 4E 44 4F 57 53 5C 43 4F 4D 4D 41 4E 44 00 43 4F NDOWS COMMAND CO 127E 0070 4D 53 50 45 43 3D 43 3A 5C 57 49 4E 44 4F 57 53 MSPEC C WINDOWS 127E 0080 5C 43 4F 4D 4D 41 4E 44 2E 43 4F 4D 00 77 69 6E COMMAND COM win 127E 0090 64 69 72 3D 43 3A5C 57 49 4E 44 4F 57 53 00 42 dir C WINDOWS B 127E 00A0 4C 41 53 54 45 52 3D 41 32 32 30 20 49 35 20 44 LASTER A220 I5 D 127E 00B0 31 20 54 34 20 50 33 30 30 00 43 4D 44 4C 49 4E 1 T4 P300 CMDLIN 127E 00C0 45 3D 64 65 62 75 67 20 6A 63 68 2E 63 6F 6D 20 E debug 127E 00D0 37 00 00 01 00 4A43 48 2E 43 4F 4D 00 FF 1E 8E 7 JCH COM 环境块中可找到当前执行的程序名 d be1 0 显示父进程的 PSP 利用父进程 PSP 可测知程序是否被 其他程序加载跟踪 0BE1 0000 CD 20 00 A0 00 9A F0 FE 1D F0 14 03 0F 0A6D 01 m 0BE1 0010 0F 0A 78 01 0F 0A 0F 0A 01 01 01 00 02 FF FF FF x 0BE1 0020 FF FF FF FF FF FF FF FF FF FF FF FF CF 0B 2E 3E 0BE1 0030 EF 0B 14 00 18 00 DE 0B FF FF FF FF 00 00 00 00 0BE1 0040 07 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0BE1 0050 CD 21 CB 00 00 00 00 00 00 00 00 00 00 4A 43 48 JCH 0BE1 0060 20 20 20 20 20 43 4F 4D 00 00 00 00 00 37 20 20 COM 7 0BE1 0070 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 0BE1 0080 0A20 6A63 68 2E 63 6F 6D 20 37 0D 00 00 00 00 7 父进程中的命令行参数 另外 保存 INT 22 INT 23 INT 24H 的值使得用户在程序中可修改这些中断的值 病毒就曾利用这种技术防止不能传染时引起出错信息 在程序退出时根据PSP中保存的值 恢复各中断的值 当可执行文件加载后 根据其不同的类型 系统会采用相应的方式进行处理 若用户程序是 COM 文件 则加载后把程序装入程序段偏移量为 100H 处 并把所有的段 寄存器指向 PSP 实际上 由于 COM 文件是以长度小于 64K 为要求设计的 所有的程 序 数据包括 PSP 都在同一段内 对于 EXE 文件 加载后把程序的 DS 和 ES 指向 PSP 段 若要使用 PSP 例如 要利用输入参数 可在程序的开始利用 DS 或 ES 实现 获取 当然 获取 PSP 的段址也可以利用以下介绍的系统调用实现 对编程者而言 在 PSP 中较为有用的是参数区 参数是通过在程序执行开始 时 利用空格与之分隔的字符串 用回车表示结束 具体的说 就是程序和参数在同一行输 入 当程序加载时 系统将参数及参数长度填入 PSP 80H 开始的参数区 其中 80H 处 是参数长度 参数由 81H 开始存放 二 程序加载及实现 所谓 加载 就是在 DOS 环境下 PC 机从磁盘上将可执行文件 即 DOS 下 的 EXE 文件和 COM 文件 装入到内存的过程 加载的过程包括程序装入内存的分配方 案 加载是否成功 装入后 CPU 各寄存器内容及包括的信息等 对编程者而言 掌握一 般的加载后信息分配 在某些应用场合中 了解和掌握如何在自己的程序中加载新的程序并 使之运行的方法是非常有用的 我们知道 DOS 下允许用户键入的命令有 DOS 内部命令 DOS 外部命令 可执行的应用程序及批处理文件 对同名的可执行文件按 COM 到 EXE 的优先顺序处 理 具体的说 DOS 加载可执行文件是通过 EXEC 子功能实现的 即 INT 21H 的 AH 4BH 由于 COM 和 EXE 文件的结构不同 它们在加载的实际过程及装入内存方 式是不同的 所以 对待不同的文件应有不同的处理方式 加载 EXE 文件后 各寄存器的初值设置 1 DS 和 ES 指向 PSP 的段地址 2 CS 指向代码段的绝对段址 3 SS 指向堆栈段的绝对段址 4 IP 指向代码段入口时第一条指令的偏移地址 5 SP 指向堆栈段如口时深度 此值由文件头位移 10H 的字域决定 6 BX CX 是加载程序的字节长度 加载 COM 文件后 各寄存器的初值设置 1 CS DS ES 和 SS 指向 PSP 的段地址 2 IP 固定为 100H 3 SP 位 FFFEH 并在栈顶出压入一全 0 字 4 BX CX 是 COM 文件的字节长度 A DOS 下 EXEC 子功能的应用 B 加载程序的设计和实现 三 重定位过程 假如说在生成的 exe 文件头里的重定位表中有一项是0000 0030 0000H 是高字段 0030H 是低字段 用高字段加上起始段值 也就是 exe 文件加载到内存里的起始地址段 假 如是1000H 则结果为1000H 再加上低字段作为偏移量 则结果为10030H 这个20位的地 址指向内存地址为10030H 的单元 把指向的这个地址里的字取出来 假设是0010H 加上 起始段值 再放回去 这就完成了一次重定位 即10030H 里存放的是1010H 四 在 DOS 下 重定位指的是重新定位在你的程序中所引用的段值 例如 在你的程序 LargeMode 中 有一处需要调用 C 的库函数 你的程序编译 后可能是下面的样子 0000 00009A78563412callfar1234 5678 其中 下划线的段值部分 就是需要在程序加载时重新定位的 程序加载器所作的重定位工作 就是将程序中需要重定位的地方 都加上程序的加载地址 还是上面的例子 假如这个程序被加载到了内存中的1111段处 那么完成重定位后 代码应该是这样 1111 00009A78564523callfar2345 5678 OK DOS 下的重定位就是这么简单 那么 程序加载器如何找到重定位项呢 这就 需要 EXE 文件头中的 重定位表的帮助 重定位表是一个非常简单的4字节结构数组 typedefstructtagRTABLE WORDwOffset WORDwSegment RELOCATIONTABLE PRELOCATIONTABLE 编译器 或自己手工 先计算程序中需要重定位的地方在文件中的偏移量 将此偏移量 减去文件头的大小 然后换算为Segment Offset的形式 填入 EXE 文件头中的重定位表 就完成了一 个重定位项的建立 还是上面的例子 这个重定项在重定位表中应该是这个样子 0003 0000 五 exe 文件结构 Dosexefilestructure offsetsizedescription 00word mz linkfile exesignature markzbikowski 02wordlengthofimagemod512 04wordsizeoffilein512bytepages 06wordnumberofrelocationitemsfollowingheader 08wordsizeofheaderin16byteparagraphs usedto locate thebeginningoftheloadmodule 0awordmin ofparagraphsneededtorunprogram 0cwordmax ofparagraphstheprogramwouldlike 0ewordoffsetinloadmoduleofstacksegment in paras 10wordinitialspvaluetobeloaded 12wordnegativechecksumofpgmusedwhilebyexec loadspgm 14wordprogramentrypoint initialipvalue 16wordoffsetinloadmoduleofthecodesegment in paras 18wordoffsetin exefileoffirstrelocationitem 1awordoverlaynumber 0forrootprogram relocationtableandtheprogramloadmodulefollowthe header relocationentriesare32bitvaluesrepresentingthe offset intotheloadmoduleneedingpatched oncetherelocatableitemisfound thecsregisteris addedto thevaluefoundatthecalculatedoffset registersatloadtimeoftheexefileareas follows ax containsnumberofcharactersincommandtail or0 bx cx32bitvalueindicatingtheloadmodulememory size dxzero ss spsettostacksegmentifdefinedelse ss csand sp ffffhortopofmemory dssettosegmentaddressofexeheader essettosegmentaddressofexeheader cs ipfaraddressofprogramentrypoint labelon end statementofprogram EXE 文件包含一个文件头和一个可重定位程序映象 文件头包含 MS DOS 用于加载程序的信息 例如程序的大小和寄存器的初始值 文件头还指向一个 重定位表 该表包含指向程序映象中可重定位段地址的指针链表 文件头的形 式与 EXEHEADER 结构对应 EXEHEADERSTRUC exSignaturedw5A4Dh EXE标志 exExraBytesdw 最后 部分 页中的字节数 exPagesdw 文件中的全部和部分页数 exRelocItemsdw 重定位表中的指针数 exHeaderSizedw 以字节为单位的文件头大小 exMinAllocdw 最小分配大小 exMaxAllocdw 最大分配大小 exInitSSdw 初始 SS 值 exInitSPdw 初始 SP 值 exChechSumdw 补码校验值 exInitIPdw 初始 IP 值 exInitCSdw 初始 CS值 exRelocTabledw 重定位表的字节偏移量 exOverlaydw 覆盖号 EXEHEADERENDS 程序映象 包含处理器代码和程序的初始数据 紧接在文件头之后 它的 大小 以字节为单位 等于 EXE 文件的大小减去文件头的大小 也等于 exHeaderSize 的域的值乘以16 MS DOS 通过把该映象直接从文件拷贝到内存加载 EXE 程序 然后调整定位表中说明的可重定位段地址 定位表是一个重定位指针数组 每个指向程序映象中的可重定位段地址

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论