PE文件中, RVA和文件偏移的转换
2009-12-04 13:30
246 查看
最近在学习PE文件, 被RVA和文件偏移搞的非常郁闷, 非常之纠结… 不过还好… 总算整明白了, 现整理下… 理下思路…. 就从罗云彬的教材中的例子说起吧…
.const
szNotFound db ‘无法查找’, 0
.code
;>>>>>>>>>>>>>>>>>
;将RVA转换为文件偏移
;>>>>>>>>>>>>>>>>>
_RVAToOffset proc _lpFileHead, _dwRVA
Local @dwReturn
Pushad
Mov esi, _lpFileHead
Assume esi : ptr IMAGE_DOS_HEADER ; esi指向DOS MZ文件头
Add esi, [esi].e_lfanew ;esi指向IMAGE_NT_HEADERS结构
;***************************************
;得到PE文件头的位置, 这个位置加上文件头长度就是节表的位置
;***************************************
Assume esi: ptr IMAGE_NT_HEADERS
Mov edi, _dwRVA ; edi中存在数据在内存中的RVA
Mov edx, esi
Add edx, sizeof IMAGE_NT_HEADERS
;ebx指向IMAGE_SECTION_HEADER结构
Assume edx: ptr IMAGE_SECTION_HEADER
Mozx ecx, [esi].FileHeader.NumberOfSections ;ecx存放节的数量
;************************************************
;扫描每个节并判断RVA是否存在于这个节内
;********************************************************
.repeat
Mov eax, [edx].VirtualAddress
;每个节的数据的起始位置相对于节的起始位置是不变的, 不管节是在文件中还是在文件中
Add [ebx].SizeOfRawData ; 节的大小
.if (edi >= [ebx].VirtualAddress) && (edi < eax) ;数据在该节内
Mov eax, [ebx].VirtualAddress
Sub edi, eax ;数据相对于节的起始地址的偏移地址RVA’
Mov eax, [ebx].PointerToRawData
Add eax, edi ;数据在文件中的偏移地址
Jmp @F
.endif
Add edx, sizeof IMAGE_SECTION_HEADER
.untilcxz
Assume edx:nothing
Assume esi: nothing
Mov eax, -1
@@:
Mov @dwReturn, eax
Popad
Mov eax, @dwReturn
Ret
_RVATOffset endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const
szNotFound db ‘无法查找’, 0
.code
;>>>>>>>>>>>>>>>>>
;将RVA转换为文件偏移
;>>>>>>>>>>>>>>>>>
_RVAToOffset proc _lpFileHead, _dwRVA
Local @dwReturn
Pushad
Mov esi, _lpFileHead
Assume esi : ptr IMAGE_DOS_HEADER ; esi指向DOS MZ文件头
Add esi, [esi].e_lfanew ;esi指向IMAGE_NT_HEADERS结构
;***************************************
;得到PE文件头的位置, 这个位置加上文件头长度就是节表的位置
;***************************************
Assume esi: ptr IMAGE_NT_HEADERS
Mov edi, _dwRVA ; edi中存在数据在内存中的RVA
Mov edx, esi
Add edx, sizeof IMAGE_NT_HEADERS
;ebx指向IMAGE_SECTION_HEADER结构
Assume edx: ptr IMAGE_SECTION_HEADER
Mozx ecx, [esi].FileHeader.NumberOfSections ;ecx存放节的数量
;************************************************
;扫描每个节并判断RVA是否存在于这个节内
;********************************************************
.repeat
Mov eax, [edx].VirtualAddress
;每个节的数据的起始位置相对于节的起始位置是不变的, 不管节是在文件中还是在文件中
Add [ebx].SizeOfRawData ; 节的大小
.if (edi >= [ebx].VirtualAddress) && (edi < eax) ;数据在该节内
Mov eax, [ebx].VirtualAddress
Sub edi, eax ;数据相对于节的起始地址的偏移地址RVA’
Mov eax, [ebx].PointerToRawData
Add eax, edi ;数据在文件中的偏移地址
Jmp @F
.endif
Add edx, sizeof IMAGE_SECTION_HEADER
.untilcxz
Assume edx:nothing
Assume esi: nothing
Mov eax, -1
@@:
Mov @dwReturn, eax
Popad
Mov eax, @dwReturn
Ret
_RVATOffset endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
相关文章推荐
- [PE结构分析] 7.相对虚拟地址(RVA)和文件偏移间的转换
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
- PE文件结构(二) 区块,文件偏移与RVA转换
- :PE文件中RVA和RAW是如何互相转换的?"(看雪)
- [PE文件结构学习]1.相对虚拟地址(RVA)与物理地址的转换
- Windows Pe 第三章 PE头文件-EX-相关编程-2(RVA_FOA转换)
- RVA和文件偏移的转换
- 理解PE文件相对虚拟地址(RVA)到文件偏移的转换
- RVA和文件偏移的转换
- PE文件的相对虚拟地址(RVA)和文件偏移地址(FOA)的转换
- PE文件中RVA和Offset的转换
- PE文件格式偏移参考
- PE文件详解(三)--区块描述、对齐值以及RVA
- PE文件格式的RVA概念
- PE文件的基本结构-3 节表和RVA换算
- 流水账笔记:PE文件格式(RVA & FOA)
- PE文件详解四:PE详解之区块描述、对齐值以及RVA详解
- PE文件RV转FOA及FOA转RVA
- 我自己的PE文件RVA-VA-Offset心得
- PE内存偏移与文件偏移相互转换