關於部落格
月光的BLOG
  • 67079

    累積人氣

  • 0

    今日人氣

    0

    追蹤人氣

計算機病毒的通用清除技術

  那個年代我對計算機病毒也非常感興趣。在九二年我剛上大學時候,對計算機病毒其實一點概唸也沒有,衹是感覺計算機病毒是很神秘很高深的東西。對于病毒程序能夠在不同電腦之間傳播,那時感覺很不可思議。

  那的確是個很古老的時代,我們用的操作系統是DOS 3.31,學的是TRUE BASIC,電腦是33M主頻的PC/AT,286是當時最先進的機器。那時候的電腦病毒也很有意思,比如小球病毒,就是一個活蹦亂跳的小圓點,不停地運動,當碰到屏幕邊沿就立刻反彈。雨點病毒則是一些下落的雨點或字符。64/Bloody病毒則是在屏幕上顯示血紅的Bloody文字。

  計算機系的大學老師們對病毒其實也很感興趣,記得一個老師曾經指著小球病毒的匯編代碼跟我們說:整個中國會編這個病毒的人不超過10個。

  最開始的病毒破壞力都很小,在現在看來,甚至有些可愛。我估計都是一些高手在編寫病毒,寫病毒的目的大概是為了炫耀自己的編程能力。DOS病毒幾乎全是用匯編寫的代碼,匯編語言其實和二進制機器語言差不多,用那個東西寫程序可真是一場噩夢啊,我曾經寫過一個八百多行的匯編程序,寫的我頭暈腦漲,我知道,用匯編來寫一個病毒的確不是一件容易的事情,特別是一些病毒甚至還有自身加密、變種的功能,因此,那些人也的確值得炫耀一下的。不過現在,匯編語言我都快忘光了,原因很簡單,用機器代碼寫程序的可維護性很差,自然用的人也肯定會越來越少。

  大學畢業後的幾年,我逐漸對這些失去了興趣,主要因為一些計算機業的害群之馬影響了我的心情,CIH病毒開了一個惡劣的開頭,對電腦用戶的資料信息甚至硬件進行惡性破壞,而後的病毒似乎在比誰更不要臉,現在互聯網的普及,以及一些腳本語言的流行,編寫木馬病毒門檻非常低了,菜鳥都可以寫木馬病毒了,而現在的木馬病毒清一色全是惡性病毒,不是偷密碼、彈廣告就是改IE,甚至還出了HAO123這樣依靠木馬病毒發家的“成功案例”,但這些病毒的編寫目的都令我感到惡心,對于那些低劣的病毒編寫者,我衹覺得他們可憐,讓他們繼續為了他們那低劣的理想和願望而編寫病毒吧,我還有更重要的事情要做呢。

  下面是我寫的論文,其目前已經沒有實際意義,因為外部環境發生了巨大變化,我寫那篇論文的前提是“計算機病毒大部分不是惡性病毒”的基礎上,甚至執行病毒代碼來還原恢復原始程序,現在的環境下這已經不可能了,現在是什麽世道?誰敢運行病毒啊!

 

計算機病毒的通用清除技術

 

摘要   本文就當前流行的文件型病毒出發,分析介紹了從文件結構特性入手清除計算機病毒的一種技術.

關鍵字   病毒  傳染  加載執行(EXEC)  文件前綴段(PSP)  進程

 

第一章  引言

   計算機病毒的發展歷史悠久,從80年代中後期廣泛傳播開來.時至今日,據統計世界上已存在的計算機病毒有5000餘種,並且每月以平均幾十種的速度增加.計算機病毒的發展一定程度上影響了反病毒產品的發展,原有的反病毒技術在新型病毒面前顯得陳舊而無能為力.病毒檢測產品是以病毒的特征碼為基礎的針對具體病毒的判斷技術,因此,病毒的變種以及未知病毒給檢測軟件帶來較大的困難.病毒的清除是建立在病毒檢測的基礎上,目前病毒的清除實際上是針對已知病毒.這種被動式的方法使反病毒技術總是落後于病毒技術,雖然這類反病毒產品對病毒的抑制是不容忽視的,但它所暴露出來的漏洞卻越來越多.新一代的開放式反病毒技術應運而生,這種開放式反病毒技術將病毒的結構用一個統一的數據結構加以描述,用戶可以根據自身對病毒進行分析,並具有更加靈活的升級優勢,對于新一代具有反跟蹤,加密技術的多維變异病毒,這種方法顯示出其靈活及高效的特色,這種廣譜型的查毒殺毒系統將逐漸成為反病毒產品的發展趨勢.

   下面,本文將介紹一種基于可執行文件結構特性的通用殺毒技術.

第二章 計算機病毒的機理

   首先,我們先了解一下計算機病毒的結構特點以及其工作原理.

   計算機病毒的結構決定了計算機病毒的特點,大致歸納如下:

   (1) 計算機病毒是一段可執行的程序

   計算機病毒和其它合法程序一樣,是一種可存儲可執行的非法程序,它可以直接或間接地運行,可以隱蔽在可執行程序和數據文件中而不易被人們察覺和發現.在病毒程序運行時,其與合法程序爭奪系統的控制權.

   (2) 計算機病毒的廣泛傳染性

   由于病毒一詞來源于“生物學”,傳染也相應成為計算機病毒的一個重要特性.傳染性是衡量一種程序是否為病毒的首要條件.計算機病毒的傳染性是計算機病毒的再生機制,病毒程序一旦進入系統與系統中的程序接在一起,它就會在運行這一被傳染的程序之後開始傳染其它程序.這樣一來,病毒就會很快地傳染到整個計算機系統.

   (3) 計算機病毒的潛伏性

   計算機病毒的潛伏性是具有依附于其它媒體而寄生的能力.一個編制巧妙的計算機病毒程序,可以在幾周或者幾個月甚至幾年內隱藏在合法文件之中,對其它系統進行傳染,而不被人們發現.計算機病毒的潛伏性于傳染性相輔相成,潛伏性越好,其在系統中存在的時間就會越長,病毒的傳染範圍也就會越大.

   (4) 計算機病毒的可觸發性

   計算機病毒一般都有一個觸發條件:或者觸發其傳染,或者在一定條件下激活計算機病毒的表現部分或破壞部分.觸發實質上是一種條件控制,一個病毒程序可以按照設計者的要求,在某個點上激活並對系統發起攻擊.

   (5) 計算機病毒的針對性

   現在世界上出現的計算機病毒,並不是對所有計算機系統都進行傳染的.例如,有針對IBM PC及其兼容機的,有針對APPLE公司的Macintosh的以及針對Unix操作系統的.現在流行的絕大多數計算機病毒都是針對基于MS DOS系統的IBM PC及其兼容機的.

   (6) 計算機病毒的衍生性

   由于計算機病毒本身是一段計算機系統可執行的文件(程序),所以這種程序反映了設計者的一種設計思想.同時,又由于計算機病毒本身也是由幾部分組成的,如安裝部分,傳染部分和破壞部分等,因此這些模塊很容易被病毒本身或其它模仿者所修改,使之成為一種不同于原病毒的計算機病毒.[1]

   計算機病毒按鏈接方式可分為以下幾類:

   (1)源碼型病毒 (Source Code Virus) (2)入侵型病毒 (Intrusive Virus) (3)操作系統病毒 (Operating System Virus)  (4)外殼型病毒 (Shell Virus).

   (1)(2)攻擊的是高級語言編寫的源文件及目標文件,在微機上很少見, (3)即引導區病毒,主要攻擊計算機的Boot區,其診治方法較為簡單,一般用DEBUG或NU等工具就能方便地清除.本文所提的病毒專指目前在PC在機上流行最廣的攻擊可執行文件的外殼型病毒.

   計算機外殼型病毒是將其自己包圍在主程序的四周,對原來的程序不作修改.外殼型病毒易于編寫,也較為常見,但診治卻較為麻煩.

   外殼型病毒具有以下特點:

   自身復制在目標文件外圍(即文件尾部);不修改原來正常文件[2];運行時病毒搶先進入內存.病毒執行完後,轉回原文件入口運行(隱蔽性).

   在基于DOS操作系統PC機上,外殼型病毒主要攻擊的目標是兩類可執行文件:COM文件與EXE文件.COM文件結構比較簡單,解毒比較容易.而廣泛流行的EXE文件相對復雜,但操作卻更靈活,適合于超過64K的程序,更易與將來的操作系統兼容,因此得到廣泛的使用.

第叁章 COM病毒的清除

一  實現原理

   COM文件是DOS的一種二進制代碼的可執行文件,COM文件結構比較簡單,加載過程十分迅速.整個程序衹有一個段.因此全部代碼長度必須小于64K,其入口代碼地址是CS:100H. DOS裝入COM文件時,先在內存建立一個長度為100H的程序前綴段(PSP,由DOS建立,是DOS用戶程序和命令行之間的接口),然後將整個文件裝載于PSP上端,不進行重定位操作,接著將四個段地址寄存器DS(Data Segment),CS(Code Segment),SS(Stack Segment),ES(Extra Segment)初始化為程序前綴段(PSP)的段地址,最後將程序的控制權交于CS:100H處.如表1所示.

                表1:  COM文件的裝入執行

地址 內容  
XXXX:0000 PSP ← CS,DS,ES,SS
XXXX:0100 程序代碼 ← IP
  數據  
  堆棧 ← SP

   寄生于COM文件的病毒,大部分是采用保存文件頭若幹字節,並將第一條指令改為”JMP 病毒入口”,以確保病毒最先執行,也有部分病毒附加在文件首部,病毒執行完後恢復寄生程序原先的狀態,並用JMP FAR等指令使程序再次回到CS:100H處,以確保寄生程序與PSP的一致.

   可見,病毒執行完後,必將會恢復並運行原文件,以便傳播,當其將原文件參數全部恢復後,會將控制權交于CS:100H處.因此,判別COM文件的真正入口的標準是:最後一次在CS:100H處執行的程序段(CS=當前PSP段地址,IP=100H).

   于是,可以設想出這樣一種跟蹤器,每執行一條指令,便判斷上述條件是否滿足,如果滿足,則此時CS:100H處的代碼便是原文件的影像,由于COM文件衹有一個段,因此此時內存的影像既是磁盤文件的內容.將CS:100H處的代碼寫回原文件,此病毒即被消除了,如果知道病毒的長度,還可將文件尾的無用代碼去掉,這樣病毒就物理上消除了.

二  實現方案

   設想的跟蹤器的實現是核心問題,也是主要的難點.事實上單步陷阱中斷(INT 1)完全符合跟蹤器的條件,但由于目前的計算機病毒廣泛采取破壞單步斷點的技術,因此這種跟蹤器在具體實現上還有一定難度.

   目前有一種比較方便的替代方法,即DOS的EXEC(INT 21H的功能4BH,加載執行)功能,此功能有一個有趣的現象,即執行完加載程序後,它會將所有寄存器恢復到執行前的狀態,並且它不清除內存,此方法易于實現,操作簡便,但對所處理的文件有一定的要求及限制.

   具體實現是,先保存中斷向量表,然後在分配一塊內存,調用DOS的EXEC功能執行被感染的COM文件.執行結束後,重寫中斷向量表以清除內存中的病毒,然後將內存偏移100H上的代碼寫入文件,文件長度為原文件長度,最後,在知曉病毒長度的情況下去掉文件尾的病毒代碼,清除工作結束.

   這種技術可以對付任何一種文件型病毒,但對于COM文件卻有一定的要求:即文件在執行過程中不可以修改代碼段的內容,未被加密或壓縮的文件一般均可滿足此條件.

四  使用調試器DEBUG.COM的EXEC功能

   更簡單的方法是用DEBUG來實現,先用L命令裝入一個文件,再用G命令運行,EXEC功能結束後,返回寄存器與運行前完全一樣,此時用W命令存盤,這時病毒便被清除了.(全過程衹用了叁條命令)

 

第四章 EXE病毒的清除

一  實現原理

   EXE文件是DOS系統最為常見且靈活的可執行文件,其應用十分廣泛.但EXE文件的結構要比COM文件復雜得多.EXE文件由文件頭(Header)和裝入模塊(Load Module)兩大部分組成.文件頭由格式化區(Format Area)和重定位表(Relocation Table)組成.裝入模塊為程序代碼部分,從位移量100H字節開始.DOS系統在調用EXE文件時,先在內存塊底部建立一個程序前綴段(PSP),再將裝入模塊讀入內存指定區域(PSP上方),DS和ES初始化為PSP段地址,CS,IP,SS,SP由文件頭格式化區確定,並通過重定位參數調整.然後根據重定位項修改代碼數據,最後將程序的控制權由CS:IP傳遞給目標程序. (如表2所示)

                表2:  EXE文件的裝入執行

地址 內容  
XXXX:0000 PSP ← DS,ES
XXXX:0100 數據  
  程序代碼 ← CS:IP
  堆棧 ← SS:SP

   對于EXE文件而言,計算機病毒主要是附著于宿主文件的尾部,由于它必須首先獲得程序的控制權,因此它必須對文件頭進行修改.一般來說,衹要恢復了正確的文件頭,便可達到殺毒的目的.

   EXE文件被加載時,系統根據EXE文件頭的CS:IP參數確定第一條執行語句,因此病毒衹需將CS:IP地址指針修改,便可首先執行,事實上,大多數病毒僅僅衹修改了文件頭,而未修改原文件內容.這便為完整地恢復原程序代碼提供了條件.

   從上面的分析可知,感染病毒的EXE文件尾部形成明顯的層次,CS:IP指向病毒體,不管病毒采取什麽樣的措施,它最終必定會在內存中恢復宿主程序所有的真實參數,並且用一條長跳轉指令返回原程序.這時,我們便可直接提取出正確的CS:IP和SS:SP參數指針,用它修改文件頭後,再將外層病毒代碼去掉,這便徹底地恢復了原EXE文件.

   問題在于如何找到EXE文件的正確入口.判斷EXE文件的真正入口是十分復雜的,但對于基于DOS系統的病毒來說,其編寫語種基本上是匯編語言,因此便具有一些獨特的特點.經過大量分析看出,一般情況下,當EXE病毒執行到真正的文件開頭時,其CS和DS均要改變,並且DS內容必定是PSP段地址,SS:SP指針被初始化,對于不修改重定位表的病毒來說,CS:IP指針應處于重定位區域內.

   于是,可以再設想出這樣一種跟蹤器,每執行一條指令,便判斷上述條件是否滿足,如果滿足,則此時CS:IP處的代碼便是原文件的影像,根據CPU各個寄存器的內容便可正確地恢復EXE文件頭,以達到殺毒的目的.

二  實現方案

   同COM文件殺毒一樣,這種理論上的跟蹤器實際上是很難奏效的.因此,我們又要求助于我們的老朋友--EXEX功能.

   MS DOS的功能4B有兩個重要的子功能:4B00為裝入並執行,4B01為裝入不執行(未公開的文檔功能),4B00用于執行所有的可執行程序,4B01則用于DEBUG調試器中的裝入功能.(關于4B01功能的具體參數見附錄1).

   由于問題的關鍵在于如何找到原程序的第一條指令,也就是說在執行到原程序的第一條指令時發生中斷,因此我們可以人為地將第一條指令改為中斷指令.為了完成這種功能,衹需用4B01功能來仿真4B00功能.

   具體是這樣做的,當系統調用加載執行功能4B00時,先用功能4B01加載,並初試化所有參數,這時內存的影像應如表3所示.

               表3:  EXE 染毒程序內存影像

地址 內容
  原程序代碼區
  CS:IP→ 病毒代碼區

   假定病毒的第一條指令處于病毒代碼的最前端,原程序的內存影像應為PSP:100~CS:IP(病毒的第一條指令),將這部分區域全部用ASCII碼CD填充.這樣,原程序的每一條指令都變成了中斷指令INT CD(不用INT 3斷點中斷是因為大部分病毒都具有破壞單步斷點中斷的功能),也就是說,無論從原程序的任何地址開始運行,所執行的第一條指令都是INT CD.這樣,一旦病毒代碼執行完畢,打算用長跳轉指令返回原程序執行時,都會觸發軟中斷INT CD,而通過INT CD的中斷服務程序便可取得EXE文件頭真正的初始化CS:IP和SS:SP指針.

   另外值得注意的是,修改後的INT 21必須是可遞歸的,因為有些病毒(如新世紀病毒)是通過第二次加載原程序來返回的,因此,內存填充要進行兩次.4B01也被調用了兩次.

   此方法的效率和準確度要遠遠高于用DEBUG等工具逐步跟蹤分析的手工殺毒法.可以為各種染上已知或未知病毒的文件去除病毒外殼.與RCOPY等去殼程序不同的是,這種方法對EXE程序的恢復是全真的恢復,它並不改變原EXE文件的任何內容.它所恢復的EXE程序代碼應與原EXE程序代碼完全一樣.另外,此法由于采用了剝殼還原法,因此還可以用來清除交叉感染的病毒,方法是從外到內逐層脫殼,最後徹底恢復最內層的宿主文件.

 

第五章 結論

   本文所論述的這種清除病毒的方法的實現原理是非常獨特的.當然,文中所給出的實現方案並不能清除所有的計算機病毒,但它卻給出了一種思想,即拋棄以前那種一個殺毒算法衹能殺一個病毒,而是一個算法可以殺一類病毒.根據這種思想,筆者已用C語言和匯編語言編寫出這個通用殺病毒程序,並且用大量的病毒對它進行了測試,效果良好.當然,病毒是五花八門的,因此一個統一的病毒對抗軟件應接受廣泛的考驗.其具體的功效還需要多方面的驗證,筆者也僅僅希望這種思想能夠在反病毒領域發揮出積極的作用.

 

參考文獻

1.  李向宇 著   <<計算機病毒概論>>      IDG國際數據集團  1990

2.  Ray Dancan  <<高水平MS DOS程序設計>>   電子工業出版社  1988

   Ray Dancan  Advanced MS-DOS Programing   Microsoft Press  1988

3 . Ray Dancan   <<MS DOS百科全書>>     電子工業出版社  1990

   Ray Duncan  the MS-DOS Encyclopedia    Microsoft Press  1990

  附錄:MS-DOS EXEC功能詳解

  翻譯人:William Long 于1996年 譯自:MS DOS百科全書(Ray Duncan: the MS-DOS Encyclopedia)

  MS-DOS系統的加載,即把磁盤上的COM及EXE文件裝入內存並執行,可以被任何程序使用MS-DOS功能(功能4BH,加載執行)產生.DOS的命令解釋程序COMMAND.COM使用EXEC裝入它的外部命令,如CHKDSK,或其它應用程序.許多流行的商業軟件,例如數據庫和字處理,都使用EXEC執行輔助程序(例如拼寫檢查),或是裝入COMMAND.COM的另一個副本,這就允許用戶在不失去當前工作上下文時運行一個輔助程序或打入MS-DOS命令.

  當EXEC被一個程序(父進程)調用並加載另一個程序(子進程),父進程可以通過一串字符即環境塊,命令行及兩個文件控制塊,來傳輸一定的信息給子進程.子進程同樣繼承了父進程的MSDOS標準設備及其它父進程打開的設備的句柄(除非打開的操作有"非繼承性"的選擇).任何操作都可被子進程的繼承句柄執行,例如定位或文件輸入輸出,而且還影響著與父進程句柄聯系著的文件指針.子進程也可裝入另一程序,如此循環直至系統內存溢出.

  因為MSDOS並非一個多任務的操作系統,子進程直到運行結束才交出系統控制權,父進程此時被挂起,這種進程操作有時也叫做同步執行.當子進程中止,父進程得到控制權並可用另一個系統功能調用(INT 21H功能4DH)取回子進程的返回碼並檢查子進程的中止是否正常,或是一個重大的硬件錯誤,比如用戶按了Ctrl-C.

  除了裝入子進程外,EXEC還可以被用來裝入由于用匯編或高級語言寫成而不能包含在其庫文件中的子程序或應用程序的覆蓋文件,這種類型的覆蓋文件不能單獨運行,多數需要主程序的段內的"幫助"工作或數據.

  EXEC功能僅存在MSDOS 2.0版以上,在MSDOS 1.X版中,父進程可以用INT 21H的功能26H建立一個子進程的程序前綴段,但必須自己完成裝載,重定位,執行代碼的過程,而不是依靠操作系統的幫助.

  EXEC是怎樣工作的

  當EXEC功能接到一個執行程序的請求時,它首先試圖打開並定位指定的程序文件.如果文件沒有找到,EXEC立刻失敗並返回調用者一個錯誤碼.

  如果文件存在,EXEC打開此文件,確定它的大小,並檢查文件的首塊.如果塊的頭兩個字節是ASCII碼MZ,文件便設定為一個EXE裝入模式.程序代碼段,數據段,堆棧段的大小可以從文件頭獲得.否則,整個文件便設定為一個決對裝入影像(COM程序).實際的文件名後綴(COM或EXE)在這個測試中被忽略.

  此時,內存所需要裝入程序的大小是知道的,假如有足夠的空間裝入程序,EXEC便在內存分配兩個塊:一個包括新程序的環境塊,另一個包括程序的代碼段,數據段和堆棧段.不同類型的程序實際分配的大小不同.COM程序得到系統中全部的空餘內存(除非內存空間過早形成碎塊),而分配給EXE程序的空間大小是由文件頭的兩個字段控制,MINALLOC和MAXALLOC,它是由LINK設置的.

  EXEC接著將父進程的環境塊拷入子進程的環境塊,在子進程內存塊的底部建立一個程序前綴段(PSP).並將命令行及缺省文件控制塊拷入PSP.以前的終止地址(INT 22H),Ctrl-C(INT 23H)

  及嚴重錯誤(INT 24H)中斷向量的目錄存入新的PSP,終止地址向量被更新,以便子進程終止或失敗時控制能夠返回到父進程.

  接著子進程的實際代碼和部分數據便由磁盤文件讀到新PSP結構上方的程序內存塊.如果子程序是一個EXE文件,文件頭的重定位表常用于在程序裏定位參考段以便反映出它實際的裝入地址.

  最後,EXEC功能建立為程序的CPU寄存器和堆棧並將控制傳給程序.COM文件的入口指針常是程序內存塊中偏移100H(PSP後第一個字節).而EXE文件的入口地址由文件頭指定,可以在程序中任何位置.

  當EXEC用于裝入並執行一個覆蓋文件而不是子程序時,它的操作會比上述更為簡單.對于覆蓋文件,EXEC並不試圖分配內存或建立PSP及環境塊,它衹簡單地將文件的內容裝入調用文件所指定的地址,並執行一些必要的重定位(如果覆蓋文件有一個EXE文件頭).使用的段值也是由調用者提供.EXEX接著並不是將控制傳給最新裝入文件的代碼,而是返回所產生的程序,請求程序負責在適當的位置調用覆蓋.

  使用EXEC裝入程序

  當一個程序裝入並執行另一個程序時,它必須執行以下幾步:

  1.確認有足夠的空閑內存來裝入子進程的代碼,數據和堆棧.

  2.建立EXEC和子進程所需要的信息.

  3.調用MSDOS的EXEC功能運行子進程.

  4.恢復並測試子進程的結束及返回碼.

  分配內存

  MSDOS典型地分配給被加載的COM或EXE文件所有可用的內存.一個不常見的例外是當一個由/CPARMAXALLOC開關聯接或被EXEMOD修改的EXE程序會由它先前駐留的數據或代碼分裂一個短小的程序塊.所以,當一個程序要裝入另一個程序之前,它必須釋放所有它本身代碼數據堆棧所不用的內存.

  釋放多餘的內存是調用MSDOS的重分配內存塊功能(INT 21H,功能4AH).此時,ES寄存器置父進程的PSP段地址,BX寄存器置程序自身必須使用的內存塊數,如預期的父進程是COM程序,且它減少它的內存分配數低于64K時,它必須移動它的堆棧到一個安全的空間.

  準備EXEC的參數

  當使用裝入和執行一程序時,必須提供EXEC功能兩條參數:

  1.子程序路徑名的地址.

  2.參數塊地址.

  參數塊依次包括子程序所需信息的地址.

  程序名

  子程序的路徑名必需是明確的,零結尾(ASCIIZ),規定文件名(沒有非識別字符).如果沒有包含路徑,便在當前目錄下尋找程序,如果無驅動器名,則使用默認驅動器.

  參數塊

  參數塊包括四個數據項地址:

  1. 環境塊

  2. 命令行

  3. 二個缺省文件控制塊(FCBs)

  在參數塊中為環境塊指針準備的空間衹有兩個字節,包括一個段地址.這是因為環境塊總是排在段落上(它的地址總可以被16整除).值0000H表示子進程的環境應被毫不改變地繼承.餘下的叁個地址全是雙字節地址,是標準的Intel格式,一個低字的段偏移,一個高字的段地址.

  環境塊

  一個環境塊總是從一個邊界段開始,包含一系列的以0結尾的字符串(ASCIIZ),形式如下:

  name = variable   全部字符串的結尾以一個附加的0表示.

  如果在參數塊中的環境塊指針提供給一個EXEC的調用包含0,那麽子進程衹需簡單地拷貝父進程的環境塊.父進程能夠提供一個不同或是增長一組字符串的段指針.另一方面,在MSDOS 3.0

  以後的版本裏,EXEC使子程序的環境塊具有完整的路徑名.環境塊最大為32字節.通過這種途徑,這麽大的信息也可被程序識別.

  最初的(或主控的)系統環境塊屬于系統接通或重新啟動後的命令處理程序(通常是COMMAND.COM)所裝入的.COMMAND.COM將字符串PATH,SHELL,PROMPT和SET命令的結果寫入系統的主環境塊.前兩個通常使用的是默認值.例如,一個MSDOS 3.2版的系統從C驅啟動,在AUTOEXEC.BAT文件中無PATH命令,CONFIG.SYS文件中也無SHELL命令,則主環境塊將下面兩行字符串寫入:

  PATH =

  COMSPEC = C: COMMAND.COM

  COMMAND.COM為運行"外部"命令而尋找這些說明清單,同時也為了找到自身在磁盤上的可執行文件以便它能在必要的時候重新裝入它的暫態部分.當PROMPT字串存在時(先前的PROMPT或SET PROMPT命令產生的結果),COMMAND.COM它來修訂用戶的提示顯示.

  環境塊中的其它字符串僅僅為了特殊程序提供信息,它不影響操作系統的操作.例如,Microsoft C 編譯器和 Microsoft Object 連接器在環境塊中尋找INCLUDE,LIB和TMP字符串,以確定頭文件,庫文件,臨時文件的指定位置.圖2給出了一個典型的環境塊的十六進制顯示圖.

  命令行

  命令行是傳給子進程的,它包括一字節指明餘下命令行的長度,緊接著的ASCII字符串是以ASCII碼回車(0DH)為結束的.回車碼並不包含在長度值裏.命令行可包括子進程可以檢查到的所有開關,文件名,以及其它參數,用以影響程序的操作.命令行被拷貝到子進程PSP偏移80H處.

  當COMMAND.COM使用EXEC運行一個程序時,它的命令行包括除程序名或重定向參數外所有用戶打下的命令.I/O的重定向是在COMMAND.COM內部處理的,它表明子進程繼承了標準設備句柄的活動.其它程序使用EXEC來運行子進程必須自己做一些必要的重定向而且必須提供一個合適的命令行,以便子進程表現得如同被COMMAND.COM裝入一樣.

  確省的文件控制塊

  EXEC參數塊的二個確省的FCBs指向拷貝到子進程PSP的偏移5CH和6CH.

  當前衹有極少數應用程序使用FCB作為文件和記錄的I/O.這是因為FCBs不支持目錄樹結構.但有些程序檢查確省的文件控制塊作為分離前二個開關或其它命令行參數的快速的方法.然而,使它自己本身對子進程透明,父進程應該仿效COMMAND.COM那樣把命令行前二個參數裝入確省的文件控制塊.這能使MSDOS的分析文件名功能(INT 21H,功能29H)能方便地使用.

  如果子進程不需要這二個確省的文件控制塊,應用程序內存中的參數塊中正確的地址會初始化指向二個空FCBs,這些空FCBs是由1字節0和11字節ASCII碼空格(20H)組成.

  運行子進程

  當父進程構造完所必要的參數後,它就可以通過中斷21H來調用EXEC,各寄存器設置如下:

  AH = 4BH

  AL = 00H (EXEC子功能,裝入並執行程序)

  DS:DX = 程序路徑名的段地址:偏移址

  ES:BX = 參數塊的段地址:偏移址

  從以上軟件中斷返回後,父進程必須要測試一下進位標誌,以此來檢測子進程是否實際運行過.如果進位清楚,則成功裝入並控制了子進程.如果進位置位,則EXEC功能失敗,錯誤碼返回在AX中,可檢測原因.通常的原因是:

  指定文件沒有找到

  文件找到,但沒有足夠的內存裝入

  其它不常見的服務錯誤可以從整個系統感到其特征(如磁盤文件或內存中的MSDOS被損壞),使用MSDOS 3.0以後的版本,可以通過調用INT 21H功能59(取擴展錯誤信息)來獲得EXEC更詳細的失敗原因.

  總的來說,提供給EXEC參數塊一個無效地址或參數塊本身地址無效並不會引起EXEC錯誤,但這將使子進程產生一些不可的後果.

相簿設定
標籤設定
相簿狀態