PE文件中, RVA和文件偏移的转换

最近在学习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

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值