返回介绍

9.1 装载器

发布于 2025-03-09 23:09:34 字数 1373 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文