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

2021-10-05 20:53:12 字數 1015 閱讀 8981

因為在初學pe檔案格式的時候吃了很多的苦,這裡想用一種通俗易懂的方式來講解這麼個東西。

而這第一篇,準備先不或瑣碎或系統性地講一講知識性的東西;我們來談一談pe檔案結構的本質

pe檔案的全稱是portable executable file– 可移植的可執行檔案。最常見的就比如我們的exe檔案,還有如dll,sys,com檔案。

乙個檔案之所以能被稱之為是pe檔案,又或者是影象檔案,是因為其的檔案格式能夠遵循某種檔案的格式的規範。又或者說,該檔案在hex視角下的資料排列,能夠符合某種檔案的資料排列標準。如下圖:

而且也從資料排列上看的出來,檔案的組成是有一定的特點的。那麼這個特點就是我們能對pe檔案進行解析,或者說解釋的關鍵。

而這個特點也就像我們前面所不停提到的 –檔案的資料排列具有一種很特別的格式,這種格式是這種檔案所獨有的

那麼這種格式怎麼為我們所用呢?這裡我們可以想一想,資料排列的格式和特點是什麼。

首先,排列就要有順序,不同的元素的位置肯定是固定,或者是相對固定的。其次,資料的寬度也應該是固定的。就比如我們的乙個陣列或者結構體,資料的寬度要是不匹配的話會很頭疼的。並且,不同資料肯定是對應不同的資訊,而不同的資訊所佔的寬度也應該是不同的。那麼這裡就不能用上面的陣列來解釋了對不對,因為陣列元素的寬度都是固定的。因此,那麼,這種資料的排列實際上可以就用乙個特別的結構體完美地來代表。也就是檔案的結構實際上也就是一種結構體。

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

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

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

可能在上篇文章中,有讀者會有疑問,可不可以用file檔案指標來進行操作呢?這麼簡單直接 理論上是可以的,但是需要知道的一點是,file其實是一種結構體,它包含了描述檔案的一些資訊。因此通過file來進行檔案操作其實會多出一些轉換。但這一點其實還好,比較重要的是,因為使用的指標是檔案指標,所以中間可能...

用rust寫乙個玩具直譯器0

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