題:
DOS程序段前綴和已加載的可執行文件的基址之間是否存在任何關聯?
ScumCoder
2014-08-10 17:16:13 UTC
view on stackexchange narkive permalink

我正在使用IDA拆卸 Test Drive III。這是1990年的DOS遊戲。 * .EXE具有MZ格式。

遊戲使用了許多防反轉功能,例如將其代碼複製到段(PSPseg + 2be7)中,其中 PSPseg ES (即PSP所在的段)的初始值。據我所知, COM可執行文件總是在 程序段前綴(PSP)結束之後立即加載,因此PSP和exe適合一個細分市場。 MZ可執行文件呢?應用程序的PSP是否相對於應用程序本身有固定的位置?

換句話說, base-PSPseg 偏移量是否始終相同?在我的 DOSBox上,程序執行開始時, CS 總是 0x22CF ES = DS = 0x01FE , CS0 是 0x20C1 ,產生 base-PSPseg 偏移量 0x0010 (16個段,256個字節-恰好是PSP的大小。)

如果此偏移量不是固定的,並且PSP和應用程序都只是隨機加載到足夠大的內存位置中,那麼至少有關於它們地址的保證嗎?像該PSP地址始終低於該應用程序的基址嗎?

四 答案:
Guntram Blohm supports Monica
2014-08-11 12:18:16 UTC
view on stackexchange narkive permalink

DOS沒有一個概念可以同時運行多個應用程序,而每個應用程序都可以分配內存。終止後仍駐留的程序無法在其他程序運行時分配更多的內存。因此,內存中沒有碎片,也沒有“足夠大的內存位置”。

從0x00000開始的內存被中斷向量表和各種bios變量佔用,DOS加載在它們後面。 DOS使用的內存塊的末尾取決於許多因素,但是,每當加載程序時,都會在盡可能最低的位置創建PSP,然後直接在其後面加載程序。因此,是的,您可以使用PSP後面的內存來依賴程序,也可以依賴段寄存器與PSP之間的差值是恆定的。

PSP段本身無法預測程序員-諸如ansi.sys控制台驅動程序,外部鍵盤驅動程序,Cdrom驅動程序以及各種駐留程序(有人還記得sidekick嗎?)之類的東西可能會增加“ dos塊”的大小,從而導致加載的程序的PSP地址增加(並且可用內存減少)。但是,只要您不更改DOSBOX的配置,您就應該能夠依賴PSP-和段寄存器-程序的每次運行都相同。

Igor Skochinsky
2014-08-11 00:49:47 UTC
view on stackexchange narkive permalink

MZ格式的可執行文件還具有從文件加載數據之前的CS-0x10 strike strike>。

引用技術幫助!,可能是最好的DOS編程參考:

EXE格式的程序定義了多個程序段,包括代碼,數據和堆棧段。從PSP:0100開始加載EXE文件。

應該說“ DS-0x10”。 MZ CS可能離PSP很遠。
感謝Peter,但DS應該指向PSP。我希望我的編輯現在更好。
Geoff Chappell
2014-08-29 19:37:25 UTC
view on stackexchange narkive permalink

通常,DOS會在PSP之後立即加載 .EXE 程序,這在您的術語中表示基礎- PSP == 0x0010 。但這並不一定是正確的,如果您正在編寫此(或任何)DOS可執行文件,則可能會更好地了解這一點。但是,這不是您。相反,在這裡,您是一名逆向工程師-或至少嘗試著成為一名工程師。因此,最重要的不是在所有情況下都適用於DOS,而是對於您正在研究的特定可執行文件,程序員認為是對是錯是什麼。

如果該程序通過將我認為是硬編碼的 0x2BE7 的代碼添加到 PSPseg ,將其一些代碼重定位到它計算的段上, code>,那麼程序員很有可能會依賴其程序的基址為 PSPseg + 0x0010 。當然,更精確地了解 0x2BE7 的來源可能表明程序員更加謹慎。並不是很長一段時間以來我就對任何DOS代碼進行了反向工程,但我記得映射程序的分段(包括其對未初始化數據,堆和堆棧的餘量)通常是一個有用的準備。

由於具有通用性……無論“可能是最好的DOS編程參考”中所說的是什麼,DOS程序員都不應該依賴在PSP之後立即加載的程序材料。儘管實際上在絕大多數情況下都是如此,但存在一個例外情況:首先,記錄在案,如果晦澀;其次,並非完全在程序員的控制範圍內。

IMAGE_DOS_HEADER e_maxalloc 成員為零時,就會出現這種情況。可以在鏈接時進行設置,也可以稍後通過 EXEHDR 之類的工具進行設置。 DOS將此成員解釋為零,以此指示以異常方式將程序安排在DOS找到的用於加載程序的任何內存塊中。 PSP像往常一樣位於底部,但程序材料應放在程序段中盡可能高的位置。兩者之間的空間未初始化。

alfgaar
2016-01-20 08:12:02 UTC
view on stackexchange narkive permalink

PSP是一個進程表,它包含有關正在運行的進程(應用程序)的信息,由加載程序創建並填充。加載程序使用EXEHDR信息填充PSP的某些字段,否則填充其他字段。創建PSP後,加載程序將抓取應用程序代碼(無論EXEHDR之後到文件末尾,然後在PSP之後立即加載。

PSP佔據應用程序的開頭(COM和EXE)。已分配的內存;段中的PSP偏移量始終為0000H-100H。當您的應用程序啟動時,DS和ES段指向PSP,您必須先將它們調整為應用程序數據段。

段是不是固定的,它們是基於可用內存空間定義的,但是段內的偏移量始終是相同的,否則您的應用程序將中斷,所有數據和代碼都是基於段開頭的偏移量來定義(計算)的。 / p>

CS在分配內存並加載程序後由加載器填充,IP也由加載器填充,此信息是從EXEHDR中提取的(應用程序入口點的偏移量(由彙編程序計算) / compiler構建目標代碼時),但其由彙編程序中的程序員,它是在masm中由指令END設置的標籤,或者是由編譯器設置的,在c中是主要函數offset)。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...