#2
tigerdown2021-05-29 17:14
|
当PE文件从硬盘加载到內存的时候,由于文件和内存的对齐粒度不同,而产生了节(模块)的位置偏移。 为了能定位和访问文件中的数据,我们就要对这偏移量进行换算。
在换算之前,我们弄清几个概念:
(*这里的节和模块是一回事)
在硬盘上的文件:
Raw的尺寸(SizeOfRawData)一节(模块)的空间大小
Raw的偏移(PointToRawData)一节(模块)在文件中的位置
文件偏移地址(FOA,FileOffsetAddress)一指节内某点离文件开头位置的偏移量
在內存里:
节区大小(Virtual Size)一节区大小
虚拟地址(Virtail Address)一节和节内点在内存中的偏移位置,这是一个相对映像基址的地址
相对虚拟地址(RNA,Relative Virtual Address)一节中的某位置相对节的基址的地址,请注意,RNA在硬盘和内存里的偏移量是一样的,这是我们进行换算成FOA的一个重要数据
下面我用图1给大家展示一下:
只有本站会员才能查看附件,请 登录
现在我例举HelloWorld这程序,用各种工具来追踪一下它的导入函数MessageBox的入口地址位置。
>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szCaption db 'A MessageBox !',0
szText db 'Hello, World !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end star