論用C語言寫乙個PE直譯器(3)

2021-10-06 04:16:34 字數 1883 閱讀 9508

可能在上篇文章中,有讀者會有疑問,」可不可以用file檔案指標來進行操作呢?這麼簡單直接「。理論上是可以的,但是需要知道的一點是,file其實是一種結構體,它包含了描述檔案的一些資訊。因此通過file來進行檔案操作其實會多出一些轉換。但這一點其實還好,比較重要的是,因為使用的指標是檔案指標,所以中間可能還會需要用到大量的feek()或者setfilepoiter(),這樣會大大增加**量和檢查成本。不過也可以通過很多方法規避掉這一點,這裡因為習慣用控制代碼就不用檔案指標了。

用控制代碼的方法就是上文所說的記憶體對映通過將檔案對映到記憶體中,獲取其在記憶體中的位址,再把這個位址以對應的結構體的形式傳遞給建立好的結構體,比如以下**:

int

createpefile

(char

* filename)

pimage_dos_header pdh =

(pimage_dos_header)base;

return1;

}

那麼在這裡,我們的dos頭 pdh就指向了base指向的的位置,也就是我們檔案的開頭。那麼此時只要我們的檔案是乙個結構正確的pe檔案,我們只要使用結構體元素呼叫的通常方法,就能進行檔案解釋了

判斷檔案是否是pe檔案的**:

int

ispe()

全**:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

dword base;

//基位址

char filepath[

100]

;class

fileoperate

return1;

}public

:int

ispe()

public

: pimage_file_header getfileheader

(dword based)

//pe頭

public

:pimage_optional_header getoptionalheader

(dword based)

//可選頭

public

:void

showfileheader()

public

:void

showoptionalheader()

};class

interactivemod

public

:void

showcommand()

public

:int

commandgetandjudge()

return1;

}public

:void

errorreport

(int a)

if(a ==2)

if(a ==3)

}public

:void

commandin()

};intmain()

cout <<

">>>>>>> .\n>>>>>>> .\n>>>>>>> success access to the file.\n>>>>>>> .\n>>>>>>> .\n>>>>>>> . ";if

(!file.

ispe()

) im.

showcommand()

;while(1

)}

論用C語言寫乙個PE檔案直譯器(1)

因為在初學pe檔案格式的時候吃了很多的苦,這裡想用一種通俗易懂的方式來講解這麼個東西。而這第一篇,準備先不或瑣碎或系統性地講一講知識性的東西 我們來談一談pe檔案結構的本質 pe檔案的全稱是portable executable file 可移植的可執行檔案。最常見的就比如我們的exe檔案,還有如d...

論用C語言寫乙個PE檔案直譯器(2)

這裡我們不系統性地做知識的講解,預設大家至少已經了解了基本的pe檔案結構。那麼乙個pe檔案直譯器其實就是能夠提取檔案結構裡的各個元素,並按照其應有的意義和格式顯示出來。比如我們常用的studype就是pe檔案直譯器的一種。而檔案解釋的流程可以簡單地分為如下幾步 1 讀取檔案資料 2 顯示pe檔案頭的...

用rust寫乙個玩具直譯器0

假期閒來無事,看了thorsten ball的writing an interpreter in go,他還有一本寫編譯器的暫時沒看,跟著書上的 寫了一遍,想著用rust重寫一遍,現在正在寫eval部分.writing an interpreter in go 我對go的感覺如它宣傳的一般,21世紀...