⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 017.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
    add   esi,[esi].e_lfanew

;********************************************************************

; 得到PE文件头的位置,这个位置加上文件头长度就是节表的位置

;********************************************************************

    assume  esi:ptr IMAGE_NT_HEADERS

      mov   edi,_dwRVA

      mov   edx,esi

    add   edx,sizeof IMAGE_NT_HEADERS

    assume  edx:ptr IMAGE_SECTION_HEADER

      movzx ecx,[esi].FileHeader.NumberOfSections

;********************************************************************

; 扫描每个节并判断 RVA 是否位于这个节内

;********************************************************************

    .repeat

      mov   eax,[edx].VirtualAddress

    add   eax,[edx].SizeOfRawData

    .if   (edi >= [edx].VirtualAddress) && (edi < eax)

      mov   eax,[edx].VirtualAddress

      sub   edi,eax

    mov   eax,[edx].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

 

_RVAToOffset     endp

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

; 获取 RVA 所在的节的名称

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

_GetRVASection  proc   _lpFileHead,_dwRVA

    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

    assume  edx:ptr IMAGE_SECTION_HEADER

    movzx ecx,[esi].FileHeader.NumberOfSections

;********************************************************************

; 扫描每个节区并判断 RVA 是否位于这个节内

;********************************************************************

    .repeat

    mov eax,[edx].VirtualAddress

      add eax,[edx].SizeOfRawData

      .if (edi >= [edx].VirtualAddress) && (edi < eax)

      mov   eax,edx

    jmp   @F

    .endif

    add   edx,sizeof IMAGE_SECTION_HEADER

      .untilcxz

 



      assume  edx:nothing

    assume  esi:nothing

    mov   eax,offset szNotFound

@@:

    mov   @dwReturn,eax

    popad

    mov   eax,@dwReturn

    ret

 

_GetRVASection  endp

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

4. PEInfo例子

好了,到现在为止,相信读者对PE文件的结构应该有初步的了解了,现在尝试写一个程序来查看PE文件的一些信息,并列出所有节的名称和属性。例子代码在本书所附光盘的Chapter17\PeInfo目录中,其中包括资源文件Main.rc,界面源代码Main.asm和处理分析PE文件的源代码_ProcessPeFile.asm。为了节省篇幅,本章以后的几个例子中都将使用同样的界面文件Main.asm和Main.rc,仅仅是处理PE文件的代码_ProcessPeFile.asm有所不同。

通用的界面资源文件Main.rc定义如下:

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include       

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#define ICO_MAIN   1000

#define DLG_MAIN   1000

#define IDC_INFO   1001

#define IDM_MAIN   2000

#define IDM_OPEN   2001

#define IDM_EXIT   2002

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ICO_MAIN   ICON     "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DLG_MAIN DIALOG 50, 50, 250, 140

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION "PE文件基本信息"

MENU IDM_MAIN

FONT 9, "宋体"

{

 CONTROL "", IDC_INFO, "RichEdit20A", 196 | ES_WANTRETURN | WS_CHILD | ES_READONLY

    | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP, 0, 0, 249, 140

}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

IDM_MAIN   menu     discardable

BEGIN

  popup "文件(&F)"

    BEGIN

  menuitem   "打开文件(&O)...", IDM_OPEN

    menuitem   separator

  menuitem   "退出(&X)",   IDM_EXIT

    END

END

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

文件中定义了一个作为主窗口的对话框,对话框上定义了一个菜单以及用来输出信息的RichEdit控件,实际运行的效果如图17.4所示。



图17.4  PEInfo例子的运行界面

处理界面的汇编源文件Main.asm的内容如下:

    .386

    .model flat, stdcall

    option casemap :none

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

; Include 文件定义

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

include   windows.inc

include     user32.inc

includelib    user32.lib

include     kernel32.inc

includelib    kernel32.lib

include   comdlg32.inc

includelib    comdlg32.lib

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

; Equ 等值定义

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

ICO_MAIN   equ   1000

DLG_MAIN   equ   1000

IDC_INFO   equ   1001

IDM_MAIN   equ   2000

IDM_OPEN   equ   2001

IDM_EXIT   equ   2002

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

; 数据段

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

    .data?

hInstance   dd    ?

hRichEdit   dd    ?

hWinMain   dd    ?

hWinEdit   dd    ?

szFileName    db    MAX_PATH dup (?)

 

    .const

szDllEdit   db    ~RichEd20.dll~,0

szClassEdit   db    ~RichEdit20A~,0

szFont   db   ~宋体~,0

szExtPe     db    ~PE Files~,0,~*.exe;*.dll;*.scr;*.fon;*.drv~,0

    db    ~All Files(*.*)~,0,~*.*~,0,0

szErr db   ~文件格式错误!~,0

szErrFormat db   ~这个文件不是PE格式的文件!~,0

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

; 代码段

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

    .code

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

_AppendInfo   proc     _lpsz

    local @stCR:CHARRANGE

 

    pushad

    invoke  GetWindowTextLength,hWinEdit

    mov   @stCR.cpMin,eax

    mov   @stCR.cpMax,eax

    invoke  SendMessage,hWinEdit,EM_EXSETSEL,0,addr @stCR

    invoke  SendMessage,hWinEdit,EM_REPLACESEL,FALSE,_lpsz

    popad

    ret

 

_AppendInfo   endp

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

include   _ProcessPeFile.

 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -