看雪安全论坛

 

 

 

 


返回   看雪安全论坛 > 初学者园地 > 『求助问答』 > 『资料导航』
忘记密码?

发表新主题 回复
己收入精华集  
主题工具 显示模式
本站声明:看雪论坛文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者信息及本声明!
xhK
级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时

普通会员
普通会员

资 料:
注册日期: Nov 2008
帖子: 101 xhK 品行端正
精华: 3
现金: 91 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
1 旧 2008-11-27 09:41:20 默认 【共享】自己动手用汇编写PE文件头信息查看工具
xhK 当前离线

标 题: 【共享】自己动手用汇编写PE文件头信息查看工具
作 者: xhK
时 间: 2008-11-27,09:41:20
链 接: http://bbs.pediy.com/showthread.php?t=77544

编程语言:MASAM32 汇编
编程环境:MASM32
所需知识:汇编语言,PE文件结构(http://bbs.pediy.com/showthread.php?s=&threadid=22892这里有)

首先是写有界面的程序,需要定义资源文件
不定义资源文件,若在编程过程中生成控件,则是相当麻烦的
程序最终界面如下
名称:  2.JPG
查看次数: 566
文件大小:  11.7 KB    名称:  3.JPG
查看次数: 567
文件大小:  39.4 KB
所以定义如下资源,贴出代码
#include    <resource.h>

#define  ICO_MAIN  2000
#define  DLG_MAIN  2000
#define  IDC_INFO  2001
#define  IDM_MAIN  4000
#define  IDM_OPEN  4001
#define  IDM_EXIT  4002

ICO_MAIN  ICON  "Main.ico"

DLG_MAIN  DIALOG  100,100,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
{
  popup  "文件(&F)"
  BEGIN
    menuitem  "打开文件(&O)...",  IDM_OPEN
    menuitem  separator
    menuitem  "退出(&X)",    IDM_EXIT
  END
}

将这些代码放进peinfo.rc文件中,用rc.exe进行编译生成peinfo.res文件

下来写主程序文件,也贴出代码,必要的地方有注释
      .386
      .model  flat,stdcall
      option casemap:none

include    windows.inc
include    user32.inc
include    kernel32.inc
include    comdlg32.inc
includelib  user32.lib
includelib  kernel32.lib
includelib  comdlg32.lib

ICO_MAIN  equ    2000
DLG_MAIN  equ    2000
IDC_INFO  equ    2001
IDM_MAIN  equ    4000
IDM_OPEN  equ    4001
IDM_EXIT  equ    4002

      .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

szMsg    db    '文件名:%s',0dh,0ah
      db    '--------------------------------------------',0dh,0ah
      db    '运行平台:                   0x%04X',0dh,0ah
      db    '节区数量:                   %d',0dh,0ah
      db    '文件标记:                   0x%04X',0dh,0ah
      db    '建议装入地址:               0x%08X',0dh,0ah,0
szMsgSection  db    '---------------------------------------------',0dh,0ah
        db    '节区名称   节区大小 虚拟地址 Raw_尺寸  Raw_偏移  节区属性',0dh,0ah
        db    '----------------------------------------------',0dh,0ah
szFmtSection  db    '%s  %08X  %08X  %08X  %08X  %08X',0dh,0ah,0,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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_ProcessPeFile  proc  _lpFile,_lpPeHead,_dwSize
        local  @szBuffer[1024]:byte,@szSectionName[16]:byte

        pushad
        mov    edi,_lpPeHead
        assume  edi:ptr IMAGE_NT_HEADERS

        movzx  ecx,[edi].FileHeader.Machine
        movzx  edx,[edi].FileHeader.NumberOfSections
        movzx  ebx,[edi].FileHeader.Characteristics
        invoke  wsprintf,addr @szBuffer,addr szMsg,\
            addr szFileName,ecx,edx,ebx,[edi].OptionalHeader.ImageBase
        invoke  SetWindowText,hWinEdit,addr @szBuffer
        ;----------------------------------------------
        ;循环显示每个节区的信息
        ;----------------------------------------------
        invoke  _AppendInfo,addr szMsgSection
        movzx  ecx,[edi].FileHeader.NumberOfSections
        add    edi,sizeof  IMAGE_NT_HEADERS
        assume  edi:ptr  IMAGE_SECTION_HEADER
        .repeat
            push  ecx
        ;-----------------------------------------------------------------
        ;获取节的名称,由于节名名称不一定是以0结尾的,所以要进行处理
        ;-----------------------------------------------------------------
            invoke  RtlZeroMemory,addr @szSectionName,sizeof @szSectionName
            push  esi
            push  edi
            mov    ecx,8
            mov    esi,edi
            lea    edi,@szSectionName
            cld
            @@:
            lodsb
            .if    !al
                mov  al,' '
            .endif
            stosb
            loop  @B
            pop    edi
            pop    esi
        ;---------------------------------------------------------------------
            invoke  wsprintf,addr @szBuffer,addr szFmtSection,\
                addr @szSectionName,[edi].Misc.VirtualSize,\
                [edi].VirtualAddress,[edi].SizeOfRawData,\
                [edi].PointerToRawData,[edi].Characteristics
            invoke  _AppendInfo,addr @szBuffer
            add    edi,sizeof IMAGE_SECTION_HEADER
            pop    ecx
            .untilcxz
            assume  edi:nothing
            popad
            ret

_ProcessPeFile  endp
;/////////////////////////////////////////////////////////////////////////////////
_Init    proc  
      local  @stCf:CHARFORMAT

      invoke  GetDlgItem,hWinMain,IDC_INFO
      mov    hWinEdit,eax
      invoke  LoadIcon,hInstance,ICO_MAIN
      invoke  SendMessage,hWinMain,WM_SETICON,ICON_BIG,eax
      invoke  SendMessage,hWinEdit,EM_SETTEXTMODE,TM_PLAINTEXT,0
      invoke  RtlZeroMemory,addr @stCf,sizeof @stCf
      mov    @stCf.cbSize,sizeof  @stCf
      mov    @stCf.yHeight,9 * 20
      mov    @stCf.dwMask,CFM_FACE or CFM_SIZE or CFM_BOLD
      invoke  lstrcpy,addr @stCf.szFaceName,addr szFont
      invoke  SendMessage,hWinEdit,EM_SETCHARFORMAT,0,addr @stCf
      invoke  SendMessage,hWinEdit,EM_EXLIMITTEXT,0,-1
      ret
_Init    endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Handler  proc  C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
      pushad
      mov    esi,_lpExceptionRecord
      mov    edi,_lpContext
      assume  esi:ptr  EXCEPTION_RECORD,edi:ptr CONTEXT
      mov    eax,_lpSEH
      push  [eax + 0ch]
      pop    [edi].regEbp
      push  [eax + 8]
      pop    [edi].regEip
      push  eax
      pop    [edi].regEsp
      assume  esi:nothing,edi:nothing
      popad
      mov    eax,ExceptionContinueExecution
      ret
_Handler  endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_OpenFile  proc
      local  @stOF:OPENFILENAME
      local  @hFile,@dwFileSize,@hMapFile,@lpMemory
      invoke  RtlZeroMemory,addr @stOF,sizeof @stOF
      mov    @stOF.lStructSize,sizeof @stOF
      push  hWinMain
      pop    @stOF.hwndOwner
      mov    @stOF.lpstrFilter,offset szExtPe
      mov    @stOF.lpstrFile,offset szFileName
      mov    @stOF.nMaxFile,MAX_PATH
      mov    @stOF.Flags,OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
      invoke  GetOpenFileName,addr @stOF
      .if    !eax
          jmp    @F
      .endif
;----------------------------------------------------------
;打开文件并建立Mapping
;----------------------------------------------------------
      invoke  CreateFile,addr szFileName,GENERIC_READ,\
          FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
          OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
      .if    eax != INVALID_HANDLE_VALUE
          mov    @hFile,eax
          invoke  GetFileSize,eax,NULL
          mov    @dwFileSize,eax
          .if    eax
              invoke  CreateFileMapping,@hFile,\
                  NULL,PAGE_READONLY,0,0,NULL
              .if    eax
                  mov    @hMapFile,eax
                  invoke  MapViewOfFile,eax,\
                      FILE_MAP_READ,0,0,0
                  .if    eax
                      mov  @lpMemory,eax
                    ;-------------------------------------
                    ;创建用于错误处理的SEH结构
                    ;-------------------------------------
                      assume  fs:nothing
                      push  ebp
                      push  offset _ErrFormat
                      push  offset _Handler
                      push  fs:[0]
                      mov    fs:[0],esp
                      ;-------------------------
                      ;检测PE文件是否有效
                      ;-------------------------
                      mov    esi,@lpMemory
                      assume  esi:ptr  IMAGE_DOS_HEADER
                      .if    [esi].e_magic != IMAGE_DOS_SIGNATURE
                          jmp    _ErrFormat
                      .endif
                      add    esi,[esi].e_lfanew
                      assume  esi:ptr IMAGE_NT_HEADERS
                      .if    [esi].Signature != IMAGE_NT_SIGNATURE
                          jmp _ErrFormat
                      .endif
                      invoke  _ProcessPeFile,@lpMemory,esi,@dwFileSize
                      jmp    _ErrorExit
                  _ErrFormat:  invoke  MessageBox,hWinMain,addr szErrFormat,NULL,MB_OK
                  _ErrorExit:
                        pop    fs:[0]
                        add    esp,0ch
                        invoke  UnmapViewOfFile,@lpMemory
                  .endif
                  invoke  CloseHandle,@hMapFile
              .endif
              invoke  CloseHandle,@hMapFile
            .endif
        .endif
@@:
        ret
_OpenFile  endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_ProcDlgMain  proc  uses ebx edi esi hWnd,wMsg,wParam,lParam
        mov    eax,wMsg
        .if    eax == WM_CLOSE
            invoke  EndDialog,hWnd,NULL
        .elseif  eax == WM_INITDIALOG
            push  hWnd
            pop    hWinMain
            call  _Init
        .elseif  eax == WM_COMMAND
            mov    eax,wParam
            .if    ax == IDM_OPEN
                call  _OpenFile
                ;invoke  MessageBox,NULL,NULL,NULL,NULL
            .elseif  ax == IDM_EXIT
                invoke  EndDialog,hWnd,NULL
            .endif
        .else
            mov    eax,FALSE
            ret
        .endif
        mov    eax,TRUE
        ret
_ProcDlgMain  endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
    invoke  LoadLibrary,offset szDllEdit
    mov    hRichEdit,eax
    invoke  GetModuleHandle,NULL
    mov    hInstance,eax
    invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
    invoke  FreeLibrary,hRichEdit
    invoke  ExitProcess,NULL
    end    start
代码在这里这里显示的确够乱的,我会打包上去,供大家下载的
把peinfo.asm编译成peinfo.obj,再与peinfo.res连接,就大功告成了,一个查看pe文件头信息的工具就出来了
上传的附件
文件类型: rar PEinfo.rar (12.2 KB, 132 次下载)
此帖于 2008-11-27 16:52:20 被 xhK 最后编辑 原因: 修改错字
回复时引用此帖 返回顶端
小菜鸟一
级别:28 | 在线时长:931小时 | 升级还需:26小时级别:28 | 在线时长:931小时 | 升级还需:26小时级别:28 | 在线时长:931小时 | 升级还需:26小时级别:28 | 在线时长:931小时 | 升级还需:26小时

小菜鸟一 的头像

初级会员
初级会员

资 料:
注册日期: Apr 2008
帖子: 513 小菜鸟一 品行端正
精华: 0
现金: 209 Kx
致谢数: 23
获感谢文章数:5
获会员感谢数:5
2 旧 2008-11-27, 12:42:23 默认
小菜鸟一 当前离线

楼主强大    
回复时引用此帖 返回顶端
arsionkx
级别:8 | 在线时长:111小时 | 升级还需:6小时级别:8 | 在线时长:111小时 | 升级还需:6小时

初级会员
初级会员

资 料:
注册日期: May 2007
帖子: 4 arsionkx 品行端正
精华: 0
现金: 223 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
3 旧 2008-11-27, 15:13:44 默认
arsionkx 当前离线

我晕,这也是原创?和罗的书上的代码界面基本一样,我还以为不同的界面在程序里有,原来是其它软件改过来的
回复时引用此帖 返回顶端
xhK
级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时

普通会员
普通会员

资 料:
注册日期: Nov 2008
帖子: 101 xhK 品行端正
精华: 3
现金: 91 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
4 旧 2008-11-27, 17:05:10 默认
xhK 当前离线

引用:
最初由 arsionkx发布 查看帖子
我还以为不同的界面在程序里有,原来是其它软件改过来的
看来你真的是晕了,界面是系统的,因为用的系统的东西
回复时引用此帖 返回顶端
newjueqi
级别:13 | 在线时长:238小时 | 升级还需:14小时级别:13 | 在线时长:238小时 | 升级还需:14小时级别:13 | 在线时长:238小时 | 升级还需:14小时级别:13 | 在线时长:238小时 | 升级还需:14小时

中级会员
中级会员

资 料:
注册日期: Jul 2008
帖子: 381 newjueqi 品行端正
精华: 7
现金: 200 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
5 旧 2008-11-27, 21:06:06 默认
newjueqi 当前离线

谢谢楼主分享,挺好的编程资料
回复时引用此帖 返回顶端
陈埃
级别:9 | 在线时长:135小时 | 升级还需:5小时级别:9 | 在线时长:135小时 | 升级还需:5小时级别:9 | 在线时长:135小时 | 升级还需:5小时

初级会员
初级会员

资 料:
注册日期: Jan 2006
帖子: 81 陈埃 品行端正
精华: 0
现金: 205 Kx
致谢数: 1
获感谢文章数:0
获会员感谢数:0
6 旧 2008-12-01, 00:03:34 默认
陈埃 当前离线

 下载一个收藏。感谢原创分享!
回复时引用此帖 返回顶端
adsljz
级别:0 | 在线时长:4小时 | 升级还需:1小时

违规
违规

资 料:
注册日期: Jul 2008
帖子: 7 adsljz 普普通通
精华: 0
现金: 0 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
7 旧 2008-12-01, 05:29:04 默认
adsljz 当前离线

这个是干嘛的?
回复时引用此帖 返回顶端
yanguu
级别:3 | 在线时长:27小时 | 升级还需:5小时级别:3 | 在线时长:27小时 | 升级还需:5小时级别:3 | 在线时长:27小时 | 升级还需:5小时

初级会员
初级会员

资 料:
注册日期: Oct 2008
帖子: 51 yanguu 品行端正
精华: 0
现金: 200 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
8 旧 2008-12-01, 08:41:12 默认
yanguu 当前离线

收藏收藏,路过路过。。。。
回复时引用此帖 返回顶端
北极狐狸
级别:20 | 在线时长:504小时 | 升级还需:21小时级别:20 | 在线时长:504小时 | 升级还需:21小时

北极狐狸 的头像

荣誉版主
荣誉版主

资 料:
注册日期: Nov 2007
帖子: 1,281 北极狐狸 品行端正
精华: 7
现金: 2011 Kx
致谢数: 1
获感谢文章数:7
获会员感谢数:14
9 旧 2008-12-01, 09:40:26 默认
北极狐狸 当前离线

学习手记,值得赞扬....
回复时引用此帖 返回顶端
毫子
级别:1 | 在线时长:8小时 | 升级还需:4小时

初级会员
初级会员

资 料:
注册日期: Nov 2008
帖子: 10 毫子 品行端正
精华: 0
现金: 200 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
10 旧 2008-12-02, 23:26:38 默认
毫子 当前离线

 dddddddddddddddddd
回复时引用此帖 返回顶端
panti
级别:16 | 在线时长:339小时 | 升级还需:18小时

初级会员
初级会员

资 料:
注册日期: Jun 2008
帖子: 229 panti 品行端正
精华: 0
现金: 153 Kx
致谢数: 5
获感谢文章数:0
获会员感谢数:0
11 旧 2008-12-03, 05:43:04 默认
panti 当前离线

强大,ASM的,难为了
回复时引用此帖 返回顶端
okyzx
级别:10 | 在线时长:162小时 | 升级还需:3小时级别:10 | 在线时长:162小时 | 升级还需:3小时级别:10 | 在线时长:162小时 | 升级还需:3小时级别:10 | 在线时长:162小时 | 升级还需:3小时

初级会员
初级会员

资 料:
注册日期: Jul 2006
帖子: 59 okyzx 品行端正
精华: 0
现金: 223 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
12 旧 2008-12-19, 15:43:49 默认
okyzx 当前离线

好东西定~~~
此帖于 2008-12-19 15:50:52 被 okyzx 最后编辑
回复时引用此帖 返回顶端
AsmBrat
级别:13 | 在线时长:232小时 | 升级还需:20小时级别:13 | 在线时长:232小时 | 升级还需:20小时级别:13 | 在线时长:232小时 | 升级还需:20小时级别:13 | 在线时长:232小时 | 升级还需:20小时

初级会员
初级会员

资 料:
注册日期: May 2008
帖子: 95 AsmBrat 品行端正
精华: 0
现金: 4 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
13 旧 2009-02-09, 02:52:50 默认
AsmBrat 当前离线

跟罗云彬书上的一模一样我汗。
回复时引用此帖 返回顶端
cswuyg
级别:9 | 在线时长:119小时 | 升级还需:21小时级别:9 | 在线时长:119小时 | 升级还需:21小时级别:9 | 在线时长:119小时 | 升级还需:21小时

初级会员
初级会员

资 料:
注册日期: Dec 2009
帖子: 22 cswuyg 品行端正
精华: 0
现金: 83 Kx
致谢数: 0
获感谢文章数:1
获会员感谢数:1
14 旧 2010-04-12, 22:48:35 默认
cswuyg 当前离线

⊙﹏⊙b汗,我搜'RichEd20.dll'无意中跑来这里,竟然发现这个例子跟书上的差不多。⊙﹏⊙b汗
不过也不是完全一样,把“_ProcessPeFile.asm”文件的函数放到Main.asm里面了。。
还有,下面的第三行复制漏了个‘0’,所以显示的时候中间多了一行东西。
szMsgSection  db    '---------------------------------------------',0dh,0ah
        db    '节区名称   节区大小 虚拟地址 Raw_尺寸  Raw_偏移  节区属性',0dh,0ah
        db    '----------------------------------------------',0dh,0ah
回复时引用此帖 返回顶端
hackjack
级别:7 | 在线时长:78小时 | 升级还需:18小时级别:7 | 在线时长:78小时 | 升级还需:18小时级别:7 | 在线时长:78小时 | 升级还需:18小时级别:7 | 在线时长:78小时 | 升级还需:18小时

hackjack 的头像

初级会员
初级会员

资 料:
注册日期: Mar 2010
帖子: 84 hackjack 品行端正
精华: 0
现金: 55 Kx
致谢数: 0
获感谢文章数:0
获会员感谢数:0
15 旧 2010-04-19, 14:09:59 默认
hackjack 当前离线

我自己写了一个PE文件头的查看程序。不过是自己把PE文件信息打印到控制台啦。
回复时引用此帖 返回顶端
发表新主题 回复

添加到书签

主题工具
显示模式

发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛论坛启用 vB 代码
论坛启用 表情图标


所有时间均为北京时间, 现在的时间是 06:11:35.


  ©2000-2014 看雪学院(PEdiy.com) |关于我们 | 京ICP备10040895号-8 | 知道创宇提供带宽资源 | 微信公众帐号:ikanxue   手机客户端: