9.1 装载器
DOS 装载器是一个名叫 exec 的操作系统程序。Exec 检查有没有足够的可用内存来装入程序,分配一个内存块,在其开头建立 PSP,把程序读入到所分配的内存块中 PSP 之后,设置段寄存器和堆栈,而且把控制转移给该程序 [Dun88a]。
因为反编译器需要对程序有控制,所以不使用 exec 程序,而是编写一个装载程序执行相似的任务。对于.exe 程序,从程序头部获得关于所需要的内存量和重定位表的位置的信息,根据映像大小所需字节数动态分配内存,然后把该程序装入内存而且重定位。对于.com 程序,所需要的内存量就是文件大小,动态分配内存并且把程序按照原样装入内存。在附录 C 给出这些文件的格式。
在 dcc 中,内存用一个字节数组表示;只要确定程序的映像大小之后,即可动态分配一个足够大的数组。由于历史原因,.com 程序被装入在偏移 0100h。该装载器也把与该程序有关的信息储存在一个 PROG 记录中,见图 9-3 定义。这个记录不仅储存在二进制文件上的信息,而且也有关于内存映像图和该程序的装入地址(段、偏移量)(这个地址是固定的,但依赖于二进制程序的类型)。
typedef struct { int16 initCS; /* Initial CS register value */ int16 initIP; /* Initial IP register value */ int16 initSS; /* Initial SS register value */ int16 initSP; /* Initial SP register value */ boolT fCOM; /* Flag set if COM program (else EXE) */ Int cReloc; /* # of relocation table entries */ dword *relocTable; /* Pointer to relocation table */ Int cProcs; /* Number of subroutines */ Int offMain; /* The offset of the main() proc */ word segMain; /* The segment of the main() proc */ boolT libSigs; /* True if library signatures loaded */ Int cbImage; /* Length of image in bytes */ byte *Image; /* Entire program image */ byte *map; /* Memory bitmap pointer */ } PROG; |
图 9-3: 程序信息记录
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论