DOS中EXE结构分析问题,发现网上教程都不总一?按照以下教程,还有有部分问题?
使用工具UltraEdit debug.exe xp计算器
DOS病毒编制的关键技术-EXE文件:
00h-01h EXE文件标记
02h-03h 文件长度除512的余数
04h-05h 文件长度除512的商
06h-07h 重定位项的个数
08h-09h 文件头除16的商
0ah-0bh 程序运行所需最小段数
0ch-0dh 程序运行所需最大段数
0eh-0fh 堆栈段的段值(SS)
10h-11h 堆栈段的段值(SP)
12h-13h 文件校验和
14h-15h 装入模块入口时的IP值
16h-17h 装入模块代码段相对段值
18h-19h 重定位表,开始位置,以位移地址指示
1ah-1bh 覆盖号(程序驻留为0)
1ch- 重定位表,起点由偏移18h-19h给出,项数由06h-07h标明
softbug:
┌━━━━━━━━━┐
┃ 1-1 EXE 档的档头 ┃
└━━━━━━━━━┘
一般的 EXE 档有个档头 ,约占用 512 Bytes 或更多 ,它的各位元代表
的意义如下∶ (请用pctools看EXE档的档头)
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
01 0 0 ⒈ ⒈ ⒉ ⒉ ⒊ ⒊ ⒋ ⒋ ⒌ ⒌ ⒍ ⒍ ⒎ ⒎
02 ⒏ ⒏ ⒐ ⒐ A A B B C C X X X X X X
03 X X X....
0.档头一开始都是 4D 5A
⒈.总档案大小除以512後所得馀数
⒉.总档案大小除以512後所得商数加 1
⒊.档案重定位数目
⒋.此数*10 = 档头大小 ,例如 20h=512bytes
⒌.程式所须最小记忆体量(一般为0000)
⒍.程式所须最大记忆体量(一般为FFFF)
⒎.程式载入後的 SS-DS-10h
⒏.程式载入後的 SP 值
⒐.字组查验和 (一般无作用)
A.程式载入後的 IP
B.程式载入後的 CS-DS-10h
C.第一个重定位表距离档头的位置
X.重定位表 (每4Bytes一组)
算出 (CS-BX)*10h = 资料长度 ,本例为2618*10h=26180h ,将末4位放到CX ,其它放
到BX ,本例 BX=2 ,CX=6180 ,然後取名为 DATA.$$$
某位台湾前辈:
step 8:
算檔案長度:公式==> (SS - DS - 10H) * 10H + SP
這公式是我改編的,但結果是一樣的,因為手算較方便。
※ 10H 是16進位的 10
用手算也是很快,但要記得加減時是16才進1,借位是借16不是10
乘只要直接後面加個0,和10進位一樣!
step 9:
若算出來是 2B6F1 的話,把它分二組(四位一組)==> 2 和 B6F1
若只有一組就只要輸入下面的 -rcx
-rbx
BX 2300 <--- 電腦自己顯示的,不用管它!
:2 <--- 填第一組數字
-rcx
CX 0000 <--- 電腦自己顯示的,不用管它!
:B6F1 <--- 填第二組數字
step 10:
-n pass1 <--- 第一個檔案名字我把它取為 pass1,隨便你改!
-w ds:100 <-- 存檔,照打不要改。
會出現它寫成功和檔案長度
-q <--- 跳出debug
台 灣 威 力 病 毒 組 織:
EXE 檔頭資訊 (參考)
0000h dw ? ;db 'MZ' 表是為 EXE 檔,如果一個延伸檔名是 EXE ,而開頭並沒
;MZ 這兩字,則 DOS 就認為 COM 檔的格式
0002h dw ? ;EXE 檔案長度除以 512 的餘數
0004h dw ? ;EXE 檔案長度除以 512 的商數,如餘數為 0 則不加 1
0006h dw ? ;重定位表的數目
0008h dw ? ;檔頭的 para 數 (para=16 bytes)
000ah dw ? ;程式所需最少的記憶体
000ch dw ? ;程式所需最大的記憶体
000eh dw ? ;初始化 SS 值,程式載入時的起始段位址在加上此值,就是程式執行
;時的 SS 值
0010h dw ? ;SP
0012h dw ? ;Checksum
0014h dw ? ;IP
0016h dw ? ;初始化 CS 值,程式載入時的起始段位址在加上此值,就是程式執行
;時的 CS 值
0018h dw ? ;重定位表的的起始值 (相對於檔頭的偏移)
winxp debug:
MS Link/ExePack v3.69
0 1 2 3 4 5 6 7 8 9 a b c b e f
00000000h: 4D 5A 9A 00 29 00 00 00 20 00 C5 00 FF FF A7 05 ; MZ?)... .??
00000010h: 80 00 00 00 10 00 CF 04 1E 00 00 00 01 00 00 00 ; €.....?........
00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
F:\CRACKT~1\DOSCS\TOOLS\dasm\dasm>debug debug.bak
-r
AX=0000 BX=0000 CX=509A DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B55 ES=0B55 SS=0B55 CS=0B55 IP=0100 NV UP EI PL NZ NA PO NC
0B55:0100 4D DEC BP
dir 计算总长度
20,634 bytes
debug 计算总长度
BX=0000 CX=509A
509Ah=20634 bytes
刚好相等,不过有时dir出来的长度比debug计算的长度大了512bytes!
4D 5A 00h-01h EXE文件标记
9A 00 02h-03h 文件长度除512的余数 20634/512=154=9Ah
29 00 04h-05h 文件长度除512的商 (不能整除要加上1) 20634/512=40.30078125=40.30078125+1=41.30078125=29h
00 00 06h-07h 重定位项的个数 重定位项的个数,如何得来?
20 00 08h-09h 文件头除16的商 文件头长度有公式吗?或是否固定啊?
C5 00 0ah-0bh 程序运行所需最小段数 (一般为0000)
FF FF 0ch-0dh 程序运行所需最大段数 (一般为FFFF)
A7 05 0eh-0fh 堆栈段的段值(SS) SS=0B55
80 00 10h-11h 堆栈段的段值(SP) SP=FFEE
00 00 12h-13h 文件校验和 (0)
10 00 14h-15h 装入模块入口时的IP值 IP=0100
CF 04 16h-17h 装入模块代码段相对段值 公式是什么?
00 00 18h-19h 重定位表,开始位置,以位移地址指示 公式?
01 00 1ah-1bh 覆盖号(程序驻留为0)
00 00 1ch- 重定位表,起点由偏移18h-19h给出,项数由06h-07h标明
winxp secedit.exe:
Microsoft Visual C++ 6.0 - 8.0 *
0 1 2 3 4 5 6 7 8 9 a b c b e f
00000000h: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 ; MZ?..........
00000010h: B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ; ?......@.......
F:\CRACKT~1\DOSCS\TOOLS\dasm\dasm>debug secedit.exe
-r
AX=0000 BX=0000 CX=5200 DX=0000 SP=00B8 BP=0000 SI=0000 DI=0000
DS=0BD3 ES=0BD3 SS=0BE3 CS=0BE3 IP=0000 NV UP EI PL NZ NA PO NC
0BE3:0000 0E PUSH CS
-
dir 计算总长度
21,504 bytes
debug 计算总长度
BX=0000 CX=5200
5200h=20992 bytes
21504-20992=512 bytes
4D 5A 00h-01h EXE文件标记
90 00 02h-03h 文件长度除512的余数 20992/512=0
03 00 04h-05h 文件长度除512的商 (不能整除要加上1) 20992/512=0
00 00 06h-07h 重定位项的个数 重定位项的个数,如何得来?
04 00 08h-09h 文件头除16的商 文件头长度有公式吗?或是否固定啊?
00 00 0ah-0bh 程序运行所需最小段数 (一般为0000)
FF FF 0ch-0dh 程序运行所需最大段数 (一般为FFFF)
00 00 0eh-0fh 堆栈段的段值(SS) SS=0BE3
B8 00 10h-11h 堆栈段的段值(SP) SP=00B8
00 00 12h-13h 文件校验和 (0)
00 00 14h-15h 装入模块入口时的IP值 IP=0000
40 00 16h-17h 装入模块代码段相对段值 公式是什么?
00 00 18h-19h 重定位表,开始位置,以位移地址指示 公式?
00 00 1ah-1bh 覆盖号(程序驻留为0)
00 00 1ch- 重定位表,起点由偏移18h-19h给出,项数由06h-07h标明
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课