![]() |
#2
onepc2009-10-16 09:46
![]() ;边理解PE结构边自己写查看的程序 ;看别人的程序,还是要自己动手写一下才深刻一点的。 ;简单的查看。未完成 ;by onepc 153785587 .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc ;include gdi32.inc ;图形 includelib user32.lib includelib kernel32.lib ;includelib gde32.lib include comdlg32.inc includelib comdlg32.lib include macro.asm ;ctxt("") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IDD_TEST_DIALOG equ 102 IDR_MAINFRAME equ 128 IDD_DIALOG1 equ 129 IDC_BUTTON1 equ 1000 IDC_BUTTON2 equ 1001 IDC_EDIT1 equ 1003 IDC_EDIT7 equ 1004 IDC_EDIT2 equ 1005 IDC_EDIT3 equ 1006 IDC_EDIT4 equ 1007 IDC_EDIT5 equ 1008 IDC_EDIT6 equ 1009 IDC_BUTTON3 equ 1010 IDC_LIST2 equ 1012 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IMAGE_DOS_SIGNATURE equ 5A4Dh ;MZ IMAGE_NT_SIGNATURE equ 4550h ;PE .data szFilter db 'Text Files(*.exe)',0,'*.exe',0,'Dll Files(*.dll)',0,'*.dll',0,0 szFmatTxt db '%08X',0 .data? hInstance dd ? ;模块句柄 hMain dd ? ;对话框句柄 hFile dd ? ;CreateFile 返回文件句柄 hMapFile dd ? ;CreateFileMapping 返回内存映射文件句柄 lPMemory dd ? ;MapViewOfFile 返回文件映射到内存的第一个字节的指针 szPath db MAX_PATH dup(?) ;文件路径缓冲区 szTemBuffer db MAX_PATH dup (?) .code ;***********************打开文件*********************** _OpenFile proc local @stFile:OPENFILENAME invoke RtlZeroMemory,addr @stFile,sizeof @stFile ;填零 mov @stFile.lStructSize,sizeof @stFile push hMain pop @stFile.hwndOwner ;mov @stFile.hwndOwner,hMin mov @stFile.lpstrFilter,offset szFilter mov @stFile.lpstrFile,offset szPath mov @stFile.nMaxFile,MAX_PATH mov @stFile.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST invoke GetOpenFileName,addr @stFile .if eax ;getopenfilename打开成功的话返回非0值 ;invoke MessageBox,NULL,addr szPath,addr szPath,MB_OK invoke SetDlgItemText,hMain,IDC_EDIT7,addr szPath invoke GetDlgItem,hMain,IDC_BUTTON1 invoke EnableWindow,eax,TRUE invoke GetDlgItem,hMain,IDC_BUTTON2 invoke EnableWindow,eax,TRUE ;.else ; invoke MessageBox,NULL,CTXT("aa"),CTXT("aa"),0 .endif ret _OpenFile endp ;***********************打开文件*********************** ;***********************映射文件*********************** _CreateFileMap proc invoke CreateFile,addr szPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL .if eax==INVALID_HANDLE_VALUE invoke MessageBox,NULL,CTXT("打开文件出错!"),CTXT("Erorr"),NULL ret .endif mov hFile,eax invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL .if !eax invoke CloseHandle,hFile invoke MessageBox,NULL,CTXT("映射文件出错!"),CTXT("Erorr"),NULL ret .endif mov hMapFile,eax invoke MapViewOfFile,hMapFile,FILE_MAP_READ,NULL,NULL,NULL .if !eax invoke CloseHandle,hMapFile invoke CloseHandle,hFile invoke MessageBox,NULL,CTXT("映射到内存出错!"),CTXT("Erorr"),NULL ret .endif mov lPMemory,eax ret _CreateFileMap endp ;***********************映射文件*********************** ;***********************PE CHECK*********************** _PeInfo proc uses esi edi ebx mov esi,lPMemory assume esi:ptr IMAGE_DOS_HEADER .if [esi].e_magic==IMAGE_DOS_SIGNATURE add esi,[esi].e_lfanew assume esi:ptr IMAGE_NT_HEADERS .if [esi].Signature==IMAGE_NT_SIGNATURE ;invoke MessageBox,NULL,CTXT("是一个PE文件!"),CTXT("OK"),NULL ; call _ShowPeInfo ;************************************************************************** movzx eax,[esi].FileHeader.NumberOfSections invoke SetDlgItemInt,hMain,IDC_EDIT6,eax,FALSE mov eax,[esi].OptionalHeader.ImageBase invoke wsprintf,addr szTemBuffer,addr szFmatTxt,eax invoke SetDlgItemText,hMain,IDC_EDIT1,addr szTemBuffer ;invoke SetDlgItemInt,hMain,IDC_EDIT1,eax,FALSE mov eax,[esi].OptionalHeader.AddressOfEntryPoint ;invoke SetDlgItemInt,hMain,IDC_EDIT2,eax,FALSE invoke wsprintf,addr szTemBuffer,addr szFmatTxt,eax invoke SetDlgItemText,hMain,IDC_EDIT2,addr szTemBuffer mov eax,[esi].OptionalHeader.FileAlignment ;invoke SetDlgItemInt,hMain,IDC_EDIT3,eax,FALSE invoke wsprintf,addr szTemBuffer,addr szFmatTxt,eax invoke SetDlgItemText,hMain,IDC_EDIT3,addr szTemBuffer mov eax,[esi].OptionalHeader.SectionAlignment ;invoke SetDlgItemInt,hMain,IDC_EDIT4,eax,FALSE invoke wsprintf,addr szTemBuffer,addr szFmatTxt,eax invoke SetDlgItemText,hMain,IDC_EDIT4,addr szTemBuffer mov eax,[esi].OptionalHeader.SizeOfImage ;invoke SetDlgItemInt,hMain,IDC_EDIT4,eax,FALSE invoke wsprintf,addr szTemBuffer,addr szFmatTxt,eax invoke SetDlgItemText,hMain,IDC_EDIT5,addr szTemBuffer ;************************************************************************** ; ret .else invoke MessageBox,NULL,CTXT("不是有效PE文件"),CTXT("ERROR"),0 ;call @F .endif .else invoke MessageBox,NULL,CTXT("不是有效PE文件"),CTXT("ERROR"),0 ;call @F .endif @@: invoke UnmapViewOfFile,lPMemory invoke CloseHandle,hMapFile invoke CloseHandle,hFile ret _PeInfo endp ;***********************PE CHECK*********************** ;***********************PE SHOW*********************** _ShowPeInfo proc ret _ShowPeInfo endp ;***********************PE SHOW*********************** ;;对话框回调过程 _DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam .if uMsg==WM_INITDIALOG ;对话框初始化 push hDlg pop hMain invoke LoadIcon,hInstance,IDR_MAINFRAME invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax ;灰化Button invoke GetDlgItem,hDlg,IDC_BUTTON1 invoke EnableWindow,eax,FALSE invoke GetDlgItem,hDlg,IDC_BUTTON2 invoke EnableWindow,eax,FALSE .elseif uMsg==WM_COMMAND mov eax,wParam .if ax==IDC_BUTTON1 ;ReadFile ;invoke EndDialog,hDlg,TRUE call _CreateFileMap call _PeInfo .elseif ax==IDC_BUTTON2 .elseif ax==IDC_BUTTON3 ;OpenFile call _OpenFile .endif .elseif uMsg==WM_CLOSE invoke EndDialog,hDlg,FALSE .else mov eax,FALSE ret .endif mov eax,TRUE ret _DlgProc endp ;;对话框回调过程 start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,IDD_TEST_DIALOG,NULL,addr _DlgProc,NULL invoke ExitProcess,NULL end start ![]() #include "resource.h" #define IDD_TEST_DIALOG 102 #define IDR_MAINFRAME 128 #define IDD_DIALOG1 129 #define IDC_BUTTON1 1000 #define IDC_BUTTON2 1001 #define IDC_EDIT1 1003 #define IDC_EDIT7 1004 #define IDC_EDIT2 1005 #define IDC_EDIT3 1006 #define IDC_EDIT4 1007 #define IDC_EDIT5 1008 #define IDC_EDIT6 1009 #define IDC_BUTTON3 1010 #define IDC_LIST2 1012 IDR_MAINFRAME ICON DISCARDABLE "test.ico" IDD_TEST_DIALOG DIALOGEX 0, 0, 230, 177 STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "32ASM - PE AND 界面" FONT 9, "宋体" BEGIN PUSHBUTTON "ReadFile",IDC_BUTTON1,47,146,50,17 PUSHBUTTON "ImportTable",IDC_BUTTON2,116,145,54,17 LTEXT "ImageBase:",IDC_STATIC,52,15,45,8 LTEXT "File Alignment:",IDC_STATIC,32,47,65,8 LTEXT "EntryPoint:",IDC_STATIC,48,31,49,8 LTEXT "Sections Alignment:",IDC_STATIC,15,64,81,8 LTEXT "SizeOfImage:",IDC_STATIC,44,79,65,8 LTEXT "Number of sections:",IDC_STATIC,15,94,81,8 EDITTEXT IDC_EDIT1,97,12,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,97,28,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,97,44,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT4,97,61,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT5,97,77,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT6,97,93,105,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT7,17,121,136,14,ES_AUTOHSCROLL PUSHBUTTON "Open File",IDC_BUTTON3,163,119,47,16 END IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 227, 156 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PE" FONT 10, "System" BEGIN END |
http://bbs.
的第二楼

IMAGE_DOS_SIGNATURE equ 5A4Dh ;这个是DOS签名 MZ
IMAGE_OS2_SIGNATURE equ 454Eh
IMAGE_OS2_SIGNATURE_LE equ 454Ch
IMAGE_VXD_SIGNATURE equ 454Ch
IMAGE_NT_SIGNATURE equ 4550h ;NT下的PE头
;DOS MZ header 的结构是 IMAGE_DOS_HEADER
IMAGE_DOS_HEADER STRUCT
e_magic WORD ? ;IMAGE_DOS_SIGNATURE 5a4dh mz
e_cblp WORD ?
e_cp WORD ?
e_crlc WORD ?
e_cparhdr WORD ?
e_minalloc WORD ?
e_maxalloc WORD ?
e_ss WORD ?
e_sp WORD ?
e_csum WORD ?
e_ip WORD ?
e_cs WORD ?
e_lfarlc WORD ?
e_ovno WORD ?
e_res WORD 4 dup(?)
e_oemid WORD ?
e_oeminfo WORD ?
e_res2 WORD 10 dup(?)
e_lfanew DWORD ? ;此DWORD存放的值是PE HEAD对文件的偏移值。即是说从文件开头移到它指定长度的值之后就是PE头的开始。
IMAGE_DOS_HEADER ENDS
e_magic==IMAGE_DOS_SIGNATURE ;这个word型的值是MZ 一般检验一个PE文件都是先验证这个字是否是mz然后再检验PE签名
;一般编程时 先CreateFile打开一个文件,再用CreateFileMapping 建立内存映射文件对象
;调用MapViewOfFile函数把整个文件的一个区域或者整个文件映射到内存中。得到指向映射到内存的第一个字节的指针lpMemory
mov edi, lpMemory ;这里把lpMemory的地址传给edi 这时edi的值就是e_magic这里的第一个字节的位置
assume edi:ptr IMAGE_DOS_HEADER ;把edi指向一个dos头的结构。这时就可以用[edi].e_magic 来判断是否等于MZ的值了。
.if [edi].e_magic==IMAGE_DOS_SIGNATURE ;判断
add edi, [edi].e_lfanew ;这里表示edi的值加上[edi].e_lfanew结构成员中的值。这时edi的值就PE头的位置
assume edi:ptr IMAGE_NT_HEADERS ;就可以用assume指向这个nthead了。
.if [edi].Signature==IMAGE_NT_SIGNATURE ;判断是否是PE这个值。
;PE header 是一个 IMAGE_NT_HEADERS 结构
IMAGE_NT_HEADERS32 STRUCT
Signature DWORD ?
FileHeader IMAGE_FILE_HEADER <>
OptionalHeader IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS32 ENDS
;stPeHead IMAGE_NT_HEADERS32 <?>
;stPeHead.Signature dword型 值为 50h,45h,00h,00h (PE\0\0) 若e_magic的值是mz,这个值又是pe的话则证明是一个PE文件
IMAGE_OS2_SIGNATURE equ 454Eh
IMAGE_OS2_SIGNATURE_LE equ 454Ch
IMAGE_VXD_SIGNATURE equ 454Ch
IMAGE_NT_SIGNATURE equ 4550h ;NT下的PE头
;DOS MZ header 的结构是 IMAGE_DOS_HEADER
IMAGE_DOS_HEADER STRUCT
e_magic WORD ? ;IMAGE_DOS_SIGNATURE 5a4dh mz
e_cblp WORD ?
e_cp WORD ?
e_crlc WORD ?
e_cparhdr WORD ?
e_minalloc WORD ?
e_maxalloc WORD ?
e_ss WORD ?
e_sp WORD ?
e_csum WORD ?
e_ip WORD ?
e_cs WORD ?
e_lfarlc WORD ?
e_ovno WORD ?
e_res WORD 4 dup(?)
e_oemid WORD ?
e_oeminfo WORD ?
e_res2 WORD 10 dup(?)
e_lfanew DWORD ? ;此DWORD存放的值是PE HEAD对文件的偏移值。即是说从文件开头移到它指定长度的值之后就是PE头的开始。
IMAGE_DOS_HEADER ENDS
e_magic==IMAGE_DOS_SIGNATURE ;这个word型的值是MZ 一般检验一个PE文件都是先验证这个字是否是mz然后再检验PE签名
;一般编程时 先CreateFile打开一个文件,再用CreateFileMapping 建立内存映射文件对象
;调用MapViewOfFile函数把整个文件的一个区域或者整个文件映射到内存中。得到指向映射到内存的第一个字节的指针lpMemory
mov edi, lpMemory ;这里把lpMemory的地址传给edi 这时edi的值就是e_magic这里的第一个字节的位置
assume edi:ptr IMAGE_DOS_HEADER ;把edi指向一个dos头的结构。这时就可以用[edi].e_magic 来判断是否等于MZ的值了。
.if [edi].e_magic==IMAGE_DOS_SIGNATURE ;判断
add edi, [edi].e_lfanew ;这里表示edi的值加上[edi].e_lfanew结构成员中的值。这时edi的值就PE头的位置
assume edi:ptr IMAGE_NT_HEADERS ;就可以用assume指向这个nthead了。
.if [edi].Signature==IMAGE_NT_SIGNATURE ;判断是否是PE这个值。
;PE header 是一个 IMAGE_NT_HEADERS 结构
IMAGE_NT_HEADERS32 STRUCT
Signature DWORD ?
FileHeader IMAGE_FILE_HEADER <>
OptionalHeader IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS32 ENDS
;stPeHead IMAGE_NT_HEADERS32 <?>
;stPeHead.Signature dword型 值为 50h,45h,00h,00h (PE\0\0) 若e_magic的值是mz,这个值又是pe的话则证明是一个PE文件
只有本站会员才能查看附件,请 登录
[ 本帖最后由 onepc 于 2009-10-15 09:45 编辑 ]