靜态分析:IDA逆向代碼段說明 text、idata、rdata、data
通常IDA對一個PE檔案逆向出來的代碼中,
存在四個最基本的段text、idata、rdata、data,分别為代碼、外部引入、資源包、變量。
四個段為PE檔案的結構中對應的段。
一、text段:
該段位程式代碼段,在該段一開始就可以看到:
.text:00401000 ; Segment type: Pure code
.text:00401000 ; Segment permissions: Read/Execute
這裡的段類型跟權限說明很清楚: 分别為代碼段和可讀可執行。需要注意的是,borland這裡叫做code,而不是text
二、idata、rdata、data段
從命名上可以看出,三個段全為存放特殊資料的段,但IDA根據PE檔案的格式将資料段中不同類型的資料區分開來。
VC開發工具将INC,LIB,RES放在資料段,DELPHI也類似,同時由于Delphi的窗體檔案*.dfm在源代碼中使用編譯指令{$R *dfm}作為res資源放在資料段中,是以像delphi的反彙編工具dede就根據這些窗體資源資料,分析出相當清晰的源代碼與窗體事件的對應位址,當然實作代碼還是彙編代碼。
1) idata段:
該段在一開始一般有類似下面的說明:
.idata:0049B000 ; Section 2. (virtual address 0009B000)
.idata:0049B000 ; Virtual size : 0001717E ( 94590.)
.idata:0049B000 ; Section size in file : 00018000 ( 98304.)
.idata:0049B000 ; Offset to raw data for section: 0009B000
.idata:0049B000 ; Flags 40000040: Data Readable
.idata:0049B000 ; Alignment : default
.idata:0049B000 ;
.idata:0049B000 ; Imports from ADVAPI32.dll
.idata:0049B000 ;
.idata:0049B000 ; ===========================================================================
.idata:0049B000
.idata:0049B000 ; Segment type: Externs
.idata:0049B000 ; _idata
明顯是一個Imports函數的代碼段,這裡集中所有外部函數位址,代碼中會先跳到該位址後再執行,PE檔案加載器在開始會擷取真實的函數位址來修補idata段中的函數位址。
與之對應的exports是edata,
表面上看PE檔案對該段的定位是特殊資料段。
2)rdata段
名字上看就是資源資料段,程式用到什麼資源資料都在這裡,資源包括你自己封包的,也包括開發工具自動封包的。
3)data段
這個段存放程式的全局資料、全局常量等。