線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8291
推到 Plurk!
推到 Facebook!

DOS 的 DEBUG, 載入大於 64K 的資料, 64k 以後的資料放到甚麼位置呢

答題得分者是:aftcast
xiaolaba
一般會員


發表:10
回覆:17
積分:5
註冊:2010-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-01-26 17:54:51 IP:111.240.xxx.xxx 訂閱
相信這個問題很冷門 (在2013年)

其實是這樣的, 俺需要用 DOS 的 DEBUG 去執行一段 SCRIPT.
因為DOS 的限制, 處理的檔案必須是 64K以下, 所以超過64k 的資料, 在記憶體內怎樣放置是個迷
至少俺還沒看到有相關的資料

原來以為是會順延到下一個 CS 1:0000, 但是沒有把握. 做了以下試驗,

創建了3個檔案, 分別是
xiao.1 64K, 0000 寫入 "xiaolaba.1", FFF0-FFFF 寫入 16個 1, 例如, '1111111111111111'
xiao.2 64K, 0000 寫入 "xiaolaba.2", FFF0-FFFF 寫入 16個 2, 例如, '2222222222222222'
xiao.3 10 bytes, 0000 寫入 'xiaolaba.3'

然後用 copy /b xiao.1 xiao.2 xiao.3 xiao.bin
這樣就得到了檔案大小為 0x2000a 的檔案
接著用 debug xiao.bin, 再來 L 0
的確看到 debug 載入 0x2000a bytes, 因為 bx=0003, cx=000a
在 CS:0000 也看到第一個 'xiaolaba.1', CS:fff0-ffff 也正確顯示 16個 '1'
但是後面的資料並沒有在 順延的 CS 1:0000 或是 DS 1:0000 出現
所以, 這個順延的假設並不成立

但是, 俺把這個載入的資料存檔到新的檔案, 例如,
n xiao.4
w 0

得到的檔案卻是和 xiao.bin 完全相同, 所以, 還是回到原點, 到底DOS 的 DEBUG, 載入大於 64K 的資料, 64k 以後的資料放到甚麼位置呢..

請問有人有相關的經驗嗎.

謝謝

------
http://xiaolaba.wordpress.com
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-01-27 22:29:28 IP:114.42.xxx.xxx 訂閱
是想寫病毒程式嗎?  

應該是CS 1000h:0000
吧?!

===================引 用 xiaolaba 文 章===================
相信這個問題很冷門 (在2013年)

其實是這樣的, 俺需要用 DOS 的 DEBUG 去執行一段 SCRIPT.
因為DOS 的限制, 處理的檔案必須是 64K以下, 所以超過64k 的資料, 在記憶體內怎樣放置是個迷
至少俺還沒看到有相關的資料

原來以為是會順延到下一個 CS 1:0000, 但是沒有把握. 做了以下試驗,

創建了3個檔案, 分別是
xiao.1 64K, 0000 寫入 "xiaolaba.1", FFF0-FFFF 寫入 16個 1, 例如, '1111111111111111'
xiao.2 64K, 0000 寫入 "xiaolaba.2", FFF0-FFFF 寫入 16個 2, 例如, '2222222222222222'
xiao.3 10 bytes, 0000 寫入 'xiaolaba.3'

然後用 copy /b xiao.1 xiao.2 xiao.3 xiao.bin
這樣就得到了檔案大小為 0x2000a 的檔案
接著用 debug xiao.bin, 再來 L 0
的確看到 debug 載入 0x2000a bytes, 因為 bx=0003, cx=000a
在 CS:0000 也看到第一個 'xiaolaba.1', CS:fff0-ffff 也正確顯示 16個 '1'
但是後面的資料並沒有在 順延的 CS 1:0000 或是 DS 1:0000 出現
所以, 這個順延的假設並不成立

但是, 俺把這個載入的資料存檔到新的檔案, 例如,
n xiao.4
w 0

得到的檔案卻是和 xiao.bin 完全相同, 所以, 還是回到原點, 到底DOS 的 DEBUG, 載入大於 64K 的資料, 64k 以後的資料放到甚麼位置呢..

請問有人有相關的經驗嗎.

謝謝

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
xiaolaba
一般會員


發表:10
回覆:17
積分:5
註冊:2010-05-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-01-29 10:13:30 IP:220.134.xxx.xxx 訂閱
感謝這位大大的資料, 看了之後馬上驗證了一下這個方法, 的確就是你所描述的一樣, 雖然不明白為什麼這樣, 但是暫時按圖索驥就好.

其實俺並不是要花時間寫病毒, 害人又傷神的事沒必要做嘛. 主要是因為有一些年代久遠的機器, 它們的 PC 和控制很多都是在 DOS 3.3的年代寫的, 換了 P5 的 PC後, 就無法執行了, 因原為來的程序是 TURBO PASCAL 或是其他語言寫的, 相信那個年代有很多 COMPILER 有大概是千年蟲類似的問題, PC速度提升, 軟件延時或是計時通訊的部分就會出問題. 所以最近還要做 PATCH, 必要在 LOADED IN MEMORY 時才能進行, 但是有些程序用了一些 PACKER 之類打包過, 沒法在靜態時做 PATCH.

實際上單用電腦已經了解了成因, 也驗證了可以恢復運行, 但是實際裝到機器上時, 沒有 386/486PC 備料, 也不準備再採購了, 唯有換PC, 但總不能要求每個操作員能用 DEBUG 去修改, 然後再起動機器, 因此希望寫個 DOS 地下的 COM, 能夠簡單解決問題.

類似的延時造成的問題, 這是其中一個經驗,
http://wp.me/ph3BR-dE

俺是看完這兩篇, 還是不明白其中原委, 才想到找個華人的版區問問看, 果然就解決這個疑問.
http://thestarman.pcministry.com/asm/debug/Segments.html
http://thestarman.pcministry.com/asm/debug/debug.htm



謝謝你的提示. 如果能夠進一步提示為何是這樣就更好了, 因為俺不是這方面的專業, 對 PC 的硬件和原理不懂, 只是碰到實際問題要解決, 但是求助無門, 必須 DIY.





===================引 用 aftcast 文 章===================
是想寫病毒程式嗎?

應該是CS 1000h:0000
吧?!

===================引 用 xiaolaba 文 章===================
相信這個問題很冷門 (在2013年)

其實是這樣的, 俺需要用 DOS 的 DEBUG 去執行一段 SCRIPT.
因為DOS 的限制, 處理的檔案必須是 64K以下, 所以超過64k 的資料, 在記憶體內怎樣放置是個迷
至少俺還沒看到有相關的資料

原來以為是會順延到下一個 CS 1:0000, 但是沒有把握. 做了以下試驗,

創建了3個檔案, 分別是
xiao.1 64K, 0000 寫入 "xiaolaba.1", FFF0-FFFF 寫入 16個 1, 例如, '1111111111111111'
xiao.2 64K, 0000 寫入 "xiaolaba.2", FFF0-FFFF 寫入 16個 2, 例如, '2222222222222222'
xiao.3 10 bytes, 0000 寫入 'xiaolaba.3'

然後用 copy /b xiao.1 xiao.2 xiao.3 xiao.bin
這樣就得到了檔案大小為 0x2000a 的檔案
接著用 debug xiao.bin, 再來 L 0
的確看到 debug 載入 0x2000a bytes, 因為 bx=0003, cx=000a
在 CS:0000 也看到第一個 'xiaolaba.1', CS:fff0-ffff 也正確顯示 16個 '1'
但是後面的資料並沒有在 順延的 CS 1:0000 或是 DS 1:0000 出現
所以, 這個順延的假設並不成立

但是, 俺把這個載入的資料存檔到新的檔案, 例如,
n xiao.4
w 0

得到的檔案卻是和 xiao.bin 完全相同, 所以, 還是回到原點, 到底DOS 的 DEBUG, 載入大於 64K 的資料, 64k 以後的資料放到甚麼位置呢..

請問有人有相關的經驗嗎.

謝謝

------
http://xiaolaba.wordpress.com
編輯記錄
xiaolaba 重新編輯於 2013-01-28 19:15:24, 註解 無‧
xiaolaba 重新編輯於 2013-01-28 19:16:37, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-01-29 19:47:57 IP:114.44.xxx.xxx 訂閱
嗯,了解你想處理的事了,不過那種處理模式就如同病毒嵌入的原理一樣呢!  所以我才會那樣問 ^^

你貼的第一個網址其實已經講的很詳細了,只不過那是很"教課書式"的教學與說明,很容易霧裡看花!

我想我用另類的說法一下好了:

dos時代的機器(80286以前),他的記憶體位址線僅有20條,所以RAM的存取硬體只能靠20條線路來存取,於是就有2的20次方的「記憶體空間」,即一般的1MB的大小。然而,cpu裡的管理位址的暫存器(segament registers)的bi數是16bit。於是問題來了,16bit如何處理20個bit的需求? 若僅用一個segment的暫處器來指向記憶體位址,很明顯的就是「一次」無法存取到任何想讀寫的地方,是吧!? 就是這個原因,才有了所謂的segmentation式的記憶體管理:

用二個16bit的值(合計32bits)來存取20bit的門牌。
segment register (16bit) : offset (16bit)
用上述的表示法就足夠指向任何想讀寫的地方了! 讚!

可是…又有一個問題,32bit的值可能會指到根本沒有ram的地方(32最高可指到4gb的地方),那麼不就可能會當機@@ ?

所以,就有了下面的logcial與physcal的mapping方式,即把logical的32bit值永遠指在1mb裡面的physical位址上,做法如下:
用例子來說比較容易,比如你的 cs register是1234h,offest是5678h (注意,h寫在後表示16進位的表示,說明比較容易)
也就是
1234 : 5678 的logical型式會被mapping到絕對的ram位址到 179b8h的地方。

1234
5678
--------------
179b8

從上面的錯開4個bit的方式,讓計算出來的結果都落在20bit的數值上。

(額外說明: 請思考一下,根據上面的mapping的計算方式,是否可以了解到179b8的位址其實可對應到1個以上的logical format,也就是非一對一的數學,等一下會說明)

開始回答你的問題:
debug戴入的file是可以超過64k的(為何是64k? 因為64k就是2的16次方,也就是先天上節暫存器的限制)。但因為上明說明的dos記憶體管理方式,ment 暫存器不變的情形下,光靠offset一值往上加就可以超過64k以外的地方 (可再次的看上面的數學mapping就知道)」

然而,你的問題是,那超過64K以外的地址,是要怎麼指向啊? 最簡單的方式就是改變 SEG的值啊,但你說,你認為是 SEG 1 : 0000,讓我們來計算一下好了,假設你開始的CS值是1234h,那麼 CS 1:0000是mapping到ram的哪裡?

1235
0000
------------------
12350
答案是 12350h的地方。回過頭來看,當cs是1234h的情形下,它能指的極限是指到哪? 即 cs=1234h,offset=ffffh

1234
FFFF
---------------
2233F
(重點來了,2233Fh是不是比12350h大?? 是吧! 所以你猜的 CS 1:0000根本還是指在64K的內部,沒有超界!!! 疑?? 不是把SEGMENT的值變大了??? 是! 這時候就是我最上面講的一個要注意的地方,一個絕對位址(RAM的位址),是可以被一個以上的LOGICAL值來mapping到。以上面的12350h的絕對地址,其實除了 CS 1:0000的mapping外,也可以是CS:0010 ,試算如下:

1234
0010
--------------
12350

以上有了解了嗎? 沒有的話請多思考,並計算一下。

那為何是 CS 1000h:0000就正確? 因為… 1000h就等於64k大,所以當seg 1000h時,ram的地址就從原來的起始點,跳出64k的地方了!

希望上述對dos記憶體管理有興趣的人也可以了解!

:-) 請記得結案喔,方便未來的人可以了解到此問題有解了! 感謝!


===================引 用 xiaolaba 文 章===================
感謝這位大大的資料, 看了之後馬上驗證了一下這個方法, 的確就是你所描述的一樣, 雖然不明白為什麼這樣, 但是暫時按圖索驥就好.

其實俺並不是要花時間寫病毒, 害人又傷神的事沒必要做嘛. 主要是因為有一些年代久遠的機器, 它們的 PC 和控制很多都是在 DOS 3.3的年代寫的, 換了 P5 的 PC後, 就無法執行了, 因原為來的程序是 TURBO PASCAL 或是其他語言寫的, 相信那個年代有很多 COMPILER 有大概是千年蟲類似的問題, PC速度提升, 軟件延時或是計時通訊的部分就會出問題. 所以最近還要做 PATCH, 必要在 LOADED IN MEMORY 時才能進行, 但是有些程序用了一些 PACKER 之類打包過, 沒法在靜態時做 PATCH.

實際上單用電腦已經了解了成因, 也驗證了可以恢復運行, 但是實際裝到機器上時, 沒有 386/486PC 備料, 也不準備再採購了, 唯有換PC, 但總不能要求每個操作員能用 DEBUG 去修改, 然後再起動機器, 因此希望寫個 DOS 地下的 COM, 能夠簡單解決問題.

類似的延時造成的問題, 這是其中一個經驗,
http://wp.me/ph3BR-dE

俺是看完這兩篇, 還是不明白其中原委, 才想到找個華人的版區問問看, 果然就解決這個疑問.
http://thestarman.pcministry.com/asm/debug/Segments.html
http://thestarman.pcministry.com/asm/debug/debug.htm



謝謝你的提示. 如果能夠進一步提示為何是這樣就更好了, 因為俺不是這方面的專業, 對 PC 的硬件和原理不懂, 只是碰到實際問題要解決, 但是求助無門, 必須 DIY.



------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2013-01-29 04:49:37, 註解 無‧
aftcast 重新編輯於 2013-01-29 04:51:28, 註解 無‧
aftcast 重新編輯於 2013-01-29 04:58:18, 註解 無‧
aftcast 重新編輯於 2013-01-29 04:58:52, 註解 無‧
xiaolaba
一般會員


發表:10
回覆:17
積分:5
註冊:2010-05-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-01-29 21:34:09 IP:111.240.xxx.xxx 訂閱
謝謝你的詳細解說, 俺做好筆記了, 也學到了新招.
------
http://xiaolaba.wordpress.com
系統時間:2024-11-21 16:37:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!