DOS 的 DEBUG, 載入大於 64K 的資料, 64k 以後的資料放到甚麼位置呢 |
答題得分者是:aftcast
|
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
相信這個問題很冷門 (在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 發送簡訊給我 |
是想寫病毒程式嗎?
應該是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 發送簡訊給我 |
感謝這位大大的資料, 看了之後馬上驗證了一下這個方法, 的確就是你所描述的一樣, 雖然不明白為什麼這樣, 但是暫時按圖索驥就好.
其實俺並不是要花時間寫病毒, 害人又傷神的事沒必要做嘛. 主要是因為有一些年代久遠的機器, 它們的 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 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,了解你想處理的事了,不過那種處理模式就如同病毒嵌入的原理一樣呢! 所以我才會那樣問 ^^
你貼的第一個網址其實已經講的很詳細了,只不過那是很"教課書式"的教學與說明,很容易霧裡看花! 我想我用另類的說法一下好了: 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 |
xiaolaba
一般會員 發表:10 回覆:17 積分:5 註冊:2010-05-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |