注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

Win32汇编PE编程中两个重要的函数  

2012-03-18 17:25:22|  分类: Win32汇编学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 将 RVA 转换成实际的数据位置
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_RVAToOffset  proc  _lpFileHead,_dwRVA                  ;这个函数带两个参数,一个是映射头,还有一个就是RVA的值
    local  @dwReturn

    pushad
    mov  esi,_lpFileHead
    assume  esi:ptr IMAGE_DOS_HEADER          
    add  esi,[esi].e_lfanew                  
    assume  esi:ptr IMAGE_NT_HEADERS
    mov  edi,_dwRVA
    mov  edx,esi
    add  edx,sizeof IMAGE_NT_HEADERS              ;PE文件头加上PE文件头的大小,得到区块的首地址
    assume  edx:ptr IMAGE_SECTION_HEADER             ;定义EDX为区块
    movzx  ecx,[esi].FileHeader.NumberOfSections    ;以PE文件的区块个数作为循环条件,进行循环
;********************************************************************
; 扫描每个节区并判断 RVA 是否位于这个节区内
;********************************************************************
    .repeat                               
      mov  eax,[edx].VirtualAddress         ;VirtualAddress是区块的RVA地址,即表示这个区块的开头位置
      add  eax,[edx].SizeOfRawData     ;SizeofRawData是在文件对齐后的尺寸,即表示这个区块的结尾位置
      .if  (edi >= [edx].VirtualAddress) && (edi < eax)
        mov  eax,[edx].VirtualAddress ;VirtualAddress是区块的RVA地址,即表示这个区块的开头位置
        sub  edi,eax       ;EDI中存放的是这个RVA在内存中相对于起始RVA的偏移量
        mov  eax,[edx].PointerToRawData ;PointerToRawData表示文件中的偏移起始地址
        add  eax,edi       ;EAX存放的是RVA转换成的File Offset的值
        jmp  @F                       ;结束循环
      .endif
      add  edx,sizeof IMAGE_SECTION_HEADER  ;EDX指向下一个区块
    .untilcxz                                
    assume  edx:nothing                              
    assume  esi:nothing
    mov  eax,-1                                   ;如果不在区块之类,则返回-1
@@:
    mov  @dwReturn,eax                            ;将返回值传到@dwReturn中保存
    popad
    mov  eax,@dwReturn
    ret

_RVAToOffset  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 查找 RVA 所在的节区
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetRVASection  proc  _lpFileHead,_dwRVA          ;这个函数带两个参数,一个是映射文件头,一个是RVA的值
    local  @dwReturn

    pushad
    mov  esi,_lpFileHead               
    assume  esi:ptr IMAGE_DOS_HEADER
    add  esi,[esi].e_lfanew
    assume  esi:ptr IMAGE_NT_HEADERS
    mov  edi,_dwRVA
    mov  edx,esi
    add  edx,sizeof IMAGE_NT_HEADERS              ;PE文件头加上PE文件头的大小,得到区块的首地址
    assume  edx:ptr IMAGE_SECTION_HEADER             ;定义EDX为区块
    movzx  ecx,[esi].FileHeader.NumberOfSections    ;以PE文件的区块个数作为循环条件,进行循环
;********************************************************************
; 扫描每个节区并判断 RVA 是否位于这个节区内
;********************************************************************
    .repeat
      mov  eax,[edx].VirtualAddress         ;VirtualAddress是区块的RVA地址,即表示这个区块的开头位置
      add  eax,[edx].SizeOfRawData     ;SizeofRawData是在文件对齐后的尺寸,即表示这个区块的结尾位置
      .if  (edi >= [edx].VirtualAddress) && (edi < eax)
        mov  eax,edx       ;EAX存储的区块的名字
        jmp  @F
      .endif
      add  edx,sizeof IMAGE_SECTION_HEADER  ;指向下一个区块
    .untilcxz
    assume  edx:nothing
    assume  esi:nothing
    mov  eax,offset szNotFound
@@:
    mov  @dwReturn,eax                            ;将区块的名字传给@dwReturn
    popad
    mov  eax,@dwReturn
    ret

_GetRVASection  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  评论这张
 
阅读(59)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017