日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MS-DOS头部

發布時間:2024/4/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MS-DOS头部 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每個PE文件都是以一個Dos程序開始的,有了它,一旦程序在Dos下執行,Dos就能識別出這是有效的執行體,然后運行緊隨MZ header之后的Dos stub(Dos塊). Dos stub實際上是一個有效的EXE,在不支持PE文件格式的操作系統中,它將簡單的顯示一個錯誤提示,This program must be run under Win32。Dos stub一般都是由編譯器自動生成的。Dos MZ頭與Dos stub合稱為Dos文件頭。

?

MS-DOS頭部占據了PE文件的頭64個字節,描述它內容的結構如下:

?

//WINNT.H

typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE頭部
? USHORT e_magic; // 魔術數字
? 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; // 新exe頭部的文件地址
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

?

?

??? 第一個域e_magic,被稱為魔術數字,它被用于表示一個MS-DOS兼容的文件類型。所有MS-DOS兼容的可執行文件都將這個值設為0x5A4D,表示ASCII字符MZ。MS-DOS頭部之所以有的時候被稱為MZ頭部,就是這個緣故。還有許多其它的域對于MS-DOS操作系統來說都有用,但是對于Windows NT來說,這個結構中只有一個有用的域——最后一個域e_lfnew,一個4字節的文件偏移量,PE文件頭部就是由它定位的。

?

??? 用十六進制打開一個EXE程序,如下:

?

00000000h: 4D 5A 50 00 02 00 00 00 04 00 0F 00 FF FF 00 00 ; MZP...........
00000010h: B8 00 00 00 00 00 00 00 40 00 1A 00 00 00 00 00 ; ?......@.......
00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 ; ................
00000040h: BA 10 00 0E 1F B4 09 CD 21 B8 01 4C CD 21 90 90 ; ?...???L?悙
00000050h: 54 68 69 73 20 70 72 6F 67 72 61 6D 20 6D 75 73 ; This program mus
00000060h: 74 20 62 65 20 72 75 6E 20 75 6E 64 65 72 20 57 ; t be run under W
00000070h: 69 6E 33 32 0D 0A 24 37 00 00 00 00 00 00 00 00 ; in32..$7........
00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000100h: 50 45 00 00 4C 01 08 00 19 5E 42 2A 00 00 00 00 ; PE..L....^B*....
00000110h: 00 00 00 00 E0 00 8E 81 0B 01 02 19 00 7C 05 00 ; ....?巵.....|..

?

?

第一個字符是"MZ"就是e_magic字段,偏移3Ch就是e_lfanew的值,顯示為00 01 00 00 ,Intel CPU在字符串儲存時低位在前,

高位在后,e_lfanew的值就為00000100h,這個地址就是PE文件頭偏移量。

?

好了,咱們認識了Dos頭之后,下次我們來認識一下PE文件頭。

總結

以上是生活随笔為你收集整理的MS-DOS头部的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。