首页
社区
课程
招聘
[求助]Dos EXE结构问题?
发表于: 2009-4-19 13:30 2576

[求助]Dos EXE结构问题?

2009-4-19 13:30
2576
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直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 335
活跃值: (671)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
ZeNiX 2009-04-20 09:48:37:
00 00 06h-07h 重定位项的个数      重定位项的个数,如何得来?
--> 比較兩次 dump 的不同處, 找出需要重定位的地方共有幾處.

04 00 08h-09h 文件头除16的商      文件头长度有公式吗?或是否固定啊?
--> 最終, 你加要 DUMP 的最前面的這個 EXE 檔的檔頭大小. 一般都用 512 byte.
你也可以自己決定.
ZeNiX 2009-04-20 09:57:34:
CF 04 16h-17h 装入模块代码段相对段值 公式是什么?
---> CS

00 00 18h-19h 重定位表,开始位置,以位移地址指示 公式?
---> 看你要把重定位表放哪裡, 就是那里的地址.
2009-4-20 11:01
0
游客
登录 | 注册 方可回帖
返回