1. 程式人生 > >PE檔案中對DOS存根的一些想法

PE檔案中對DOS存根的一些想法

首先先了解一下PE檔案:

PE(Protable Executable),即可移植的執行體。在Windows作業系統平臺下,所有的可執行檔案如EXE檔案、DLL檔案、SYS檔案、OCX檔案、COM檔案等均使用PE結構。

PE檔案結構包含的結構體有DOS頭、PE標識、檔案頭、可選頭、目錄結構、節表等。

這篇文章主要是對DOS頭的一些想法,DOS頭主要分為兩部分即“MZ頭部”和“DOS存根”。MZ頭部是真正的DOS頭,而DOS存根則是一段簡單的DOS程式,主要用來輸出類似“This program cannot be run in DOS mode.”的提示語句,由於DOS存根裡的內容無關緊要,所以可以把這部分用來儲存其他資料而不改變程式原本的功能。

下面是筆者對DOS存根寫入資料的想法:

首先,寫一個簡單的看起來似乎沒有什麼用處的小程式:

找到編譯後生成的exe檔案後,用C32Asm開啟該exe檔案:

這裡選擇16進位制模式開啟,在開始處我們可以看到MZ頭:

向下溯源,發現PE頭的首地址,即00 00 00 0F(這裡的十六進位制地址是以小尾方式儲存的):

通過PE頭的首地址,我們找到PE頭的具體位置,這裡也看得到PE頭:

找到PE頭得位置後,那麼PE頭與MZ頭之間的那一部分就是我們需要找的DOS存根部分了:

在DOS存根部分,我們也能夠看到“This program cannot be run in DOS mode”的提示字串,接下來需要做的就是通過修改DOS存根的內容來將自己想加入的東西寫入程式,而不影響程式的正常使用。筆者在這裡用到的內容是:“這是我的部落格:

https://blog.csdn.net/song_10,歡迎關注!”,不過我並不想別人用反彙編工具載入這個exe檔案就可以看到我修改的資訊,所以在這裡用base64對這一字串進行簡單的加密,得到:“6L+Z5piv5oiR55qE5Y2a5a6i77yaaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NvbmdfMTDvvIzmrKLov47lhbPms6jvvIE=”,下面進入C32Asm來將我的資訊寫入到DOS存根當中:

修改後儲存程式,然後開啟EXE檔案,發現可以成功開啟,但程式並沒有顯示之前所新增的資訊:

接著將修改的程式重新載入C32Asm中,能夠在DOS存根的部分看到自己加入的資訊:

說明已經成功將我們想加入的內容寫入一個EXE的可執行檔案當中了,這時又想誤導一下別人這個exe可以執行檔案損壞不能開啟,進而對自己加入的資訊進一步“加密”,那麼我們就可以對PE頭動一些手腳。

首先需要了解一下PE頭的作用:用來裝載PE檔案。

如果對PE頭進行修改,那麼系統就不能正常裝載PE文檔案,進而就營造處該檔案已損壞的假象,達到目的。

同樣是在C32Asm中,對PE頭隨意修改一個字元(修改太多的話不容易恢復,那就真正成了損壞的PE檔案了):

這裡,筆者將E修改為e,儲存後,找到EXE檔案雙擊開啟,出現以下提示,說明目的達到:

如果想要程式正常開啟,那麼只需將修改PE頭的內容改回原來的內容就可以了。