電腦病毒的通用清除技術

來源:互聯網
上載者:User

電腦病毒的通用清除技術
http://www.williamlong.info/archives/456.html

    這篇文章是我十年前寫的第二篇在雜誌上發表的文章。發表在微電腦世界1997年的第三期上。

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

  那的確也是很古老的時代,我們用的作業系統是DOS 3.31,學的是TRUE BASIC。那時的電腦病毒也很有意思,比如小球病毒,就是一個活蹦亂跳的小圓點,不停地運動,當碰到螢幕邊沿就立刻反彈。雨點病毒則是一些下落的雨點或字元。64/Bloody病毒則是在螢幕上顯示血紅的Bloody文字。

  那時候的大學老師們對病毒其實也高度興趣,記得一個老師曾經指著小球病毒的彙編代碼跟我們說:整個中國會編這個病毒的人不超過10個。

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

  大學畢業後的幾年,我逐漸對這些失去了興趣,主要因為一些電腦業的害群之馬影響了我的心情,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錯誤,但這將使子進程產生一些不可的後果.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.