WIN32汇编语言教程:第17章 PE文件 · 17.1 PE文件的结构(6)

4. PEInfo例子

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

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

//##################################################################
#include         <resource.h>
//##################################################################
#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.asm

上页:第17章 PE文件 · 17.1 PE文件的结构(5) 下页:第17章 PE文件 · 17.1 PE文件的结构(7)

第17章 PE文件

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号