欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
計算機病毒的通用清除技術(shù)

這篇文章是我十年前寫(xiě)的第二篇在雜志上發(fā)表的文章。發(fā)表在微電腦世界1997年的第三期上。

  那個(gè)年代我對計算機病毒也非常感興趣。在九二年我剛上大學(xué)時(shí)候,對計算機病毒其實(shí)一點(diǎn)概念也沒(méi)有,只是感覺(jué)計算機病毒是很神秘很高深的東西。對于病毒程序能夠在不同電腦之間傳播,那時(shí)感覺(jué)很不可思議。

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

  計算機系的大學(xué)老師們對病毒其實(shí)也很感興趣,記得一個(gè)老師曾經(jīng)指著(zhù)小球病毒的匯編代碼跟我們說(shuō):整個(gè)中國會(huì )編這個(gè)病毒的人不超過(guò)10個(gè)。

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

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

  下面是我寫(xiě)的論文,其目前已經(jīng)沒(méi)有實(shí)際意義,因為外部環(huán)境發(fā)生了巨大變化,我寫(xiě)那篇論文的前提是“計算機病毒大部分不是惡性病毒”的基礎上,甚至執行病毒代碼來(lái)還原恢復原始程序,現在的環(huán)境下這已經(jīng)不可能了,現在是什么世道?誰(shuí)敢運行病毒??!

 

計算機病毒的通用清除技術(shù)

 

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

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

 

第一章  引言

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

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

第二章 計算機病毒的機理

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

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

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

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

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

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

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

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

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

   計算機病毒一般都有一個(gè)觸發(fā)條件:或者觸發(fā)其傳染,或者在一定條件下激活計算機病毒的表現部分或破壞部分.觸發(fā)實(shí)質(zhì)上是一種條件控制,一個(gè)病毒程序可以按照設計者的要求,在某個(gè)點(diǎn)上激活并對系統發(fā)起攻擊.

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

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

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

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

   計算機病毒按鏈接方式可分為以下幾類(lèi):

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

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

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

   外殼型病毒具有以下特點(diǎn):

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

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

第三章 COM病毒的清除

一  實(shí)現原理

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

                表1:  COM文件的裝入執行

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

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

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

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

二  實(shí)現方案

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

目前有一種比較方便的替代方法,即DOS的EXEC(INT21H的功能4BH,加載執行)功能,此功能有一個(gè)有趣的現象,即執行完加載程序后,它會(huì )將所有寄存器恢復到執行前的狀態(tài),并且它不清除內存,此方法易于實(shí)現,操作簡(jiǎn)便,但對所處理的文件有一定的要求及限制.

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

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

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

   更簡(jiǎn)單的方法是用DEBUG來(lái)實(shí)現,先用L命令裝入一個(gè)文件,再用G命令運行,EXEC功能結束后,返回寄存器與運行前完全一樣,此時(shí)用W命令存盤(pán),這時(shí)病毒便被清除了.(全過(guò)程只用了三條命令)

 

第四章 EXE病毒的清除

一  實(shí)現原理

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

                表2:  EXE文件的裝入執行

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

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

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

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

問(wèn)題在于如何找到EXE文件的正確入口.判斷EXE文件的真正入口是十分復雜的,但對于基于DOS系統的病毒來(lái)說(shuō),其編寫(xiě)語(yǔ)種基本上是匯編語(yǔ)言,因此便具有一些獨特的特點(diǎn).經(jīng)過(guò)大量分析看出,一般情況下,當EXE病毒執行到真正的文件開(kāi)頭時(shí),其CS和DS均要改變,并且DS內容必定是PSP段地址,SS:SP指針被初始化,對于不修改重定位表的病毒來(lái)說(shuō),CS:IP指針應處于重定位區域內.

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

二  實(shí)現方案

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

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

   由于問(wèn)題的關(guān)鍵在于如何找到原程序的第一條指令,也就是說(shuō)在執行到原程序的第一條指令時(shí)發(fā)生中斷,因此我們可以人為地將第一條指令改為中斷指令.為了完成這種功能,只需用4B01功能來(lái)仿真4B00功能.

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

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

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

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

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

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

 

第五章 結論

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

 

參考文獻

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

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

   Ray Dancan  Advanced MS-DOS Programing   Microsoft Press  1988

3 . Ray Dancan   <<MS DOS百科全書(shū)>>     電子工業(yè)出版社  1990

   Ray Duncan  the MS-DOS Encyclopedia    Microsoft Press  1990

  附錄:MS-DOS EXEC功能詳解

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

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

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

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

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

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

  EXEC是怎樣工作的

  當EXEC功能接到一個(gè)執行程序的請求時(shí),它首先試圖打開(kāi)并定位指定的程序文件.如果文件沒(méi)有找到,EXEC立刻失敗并返回調用者一個(gè)錯誤碼.

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

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

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

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

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

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

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

  使用EXEC裝入程序

  當一個(gè)程序裝入并執行另一個(gè)程序時(shí),它必須執行以下幾步:

  1.確認有足夠的空閑內存來(lái)裝入子進(jìn)程的代碼,數據和堆棧.

  2.建立EXEC和子進(jìn)程所需要的信息.

  3.調用MSDOS的EXEC功能運行子進(jìn)程.

  4.恢復并測試子進(jìn)程的結束及返回碼.

  分配內存

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

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

  準備EXEC的參數

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

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

  2.參數塊地址.

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

  程序名

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

  參數塊

  參數塊包括四個(gè)數據項地址:

  1. 環(huán)境塊

  2. 命令行

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

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

  環(huán)境塊

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

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

  如果在參數塊中的環(huán)境塊指針提供給一個(gè)EXEC的調用包含0,那么子進(jìn)程只需簡(jiǎn)單地拷貝父進(jìn)程的環(huán)境塊.父進(jìn)程能夠提供一個(gè)不同或是增長(cháng)一組字符串的段指針.另一方面,在MSDOS 3.0

  以后的版本里,EXEC使子程序的環(huán)境塊具有完整的路徑名.環(huán)境塊最大為32字節.通過(guò)這種途徑,這么大的信息也可被程序識別.

最初的(或主控的)系統環(huán)境塊屬于系統接通或重新啟動(dòng)后的命令處理程序(通常是COMMAND.COM)所裝入的.COMMAND.COM將字符串PATH,SHELL,PROMPT和SET命令的結果寫(xiě)入系統的主環(huán)境塊.前兩個(gè)通常使用的是默認值.例如,一個(gè)MSDOS3.2版的系統從C驅啟動(dòng),在A(yíng)UTOEXEC.BAT文件中無(wú)PATH命令,CONFIG.SYS文件中也無(wú)SHELL命令,則主環(huán)境塊將下面兩行字符串寫(xiě)入:

  PATH =

  COMSPEC = C: \COMMAND.COM

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

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

  命令行

命令行是傳給子進(jìn)程的,它包括一字節指明余下命令行的長(cháng)度,緊接著(zhù)的ASCII字符串是以ASCII碼回車(chē)(0DH)為結束的.回車(chē)碼并不包含在長(cháng)度值里.命令行可包括子進(jìn)程可以檢查到的所有開(kāi)關(guān),文件名,以及其它參數,用以影響程序的操作.命令行被拷貝到子進(jìn)程PSP偏移80H處.

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

  確省的文件控制塊

  EXEC參數塊的二個(gè)確省的FCBs指向拷貝到子進(jìn)程PSP的偏移5CH和6CH.

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

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

  運行子進(jìn)程

  當父進(jìn)程構造完所必要的參數后,它就可以通過(guò)中斷21H來(lái)調用EXEC,各寄存器設置如下:

  AH = 4BH

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

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

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

  從以上軟件中斷返回后,父進(jìn)程必須要測試一下進(jìn)位標志,以此來(lái)檢測子進(jìn)程是否實(shí)際運行過(guò).如果進(jìn)位清楚,則成功裝入并控制了子進(jìn)程.如果進(jìn)位置位,則EXEC功能失敗,錯誤碼返回在A(yíng)X中,可檢測原因.通常的原因是:

  指定文件沒(méi)有找到

  文件找到,但沒(méi)有足夠的內存裝入

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

  總的來(lái)說(shuō),提供給EXEC參數塊一個(gè)無(wú)效地址或參數塊本身地址無(wú)效并不會(huì )引起EXEC錯誤,但這將使子進(jìn)程產(chǎn)生一些不可的后果.

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
計算機病毒及防治
病毒和木馬的區別
計算機病毒比較法診斷的原理
病毒啊病毒
計算機病毒
計算機病毒及預防......~張童原創(chuàng )~
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久