可能在上篇文章中,有讀者會有疑問,」可不可以用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世紀...