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

📄 017.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_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

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

_Handler   proc     _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,@hFile

        .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

    .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

源代码中没有任何新的概念:程序首先创建一个对话框,并在初始化的时候将RichEdit控件的字体设置为“宋体”。当用户选择“打开”文件菜单后,则显示一个打开文件通用对话框让用户选择一个文件。

最后,程序用内存映射文件的方法将PE文件映射到内存中以供处理,处理使用的代码就是根据具体的情况编写的_ProcessPeFile.asm文件。

在处理文件之前,程序使用第14章中介绍的SEH来设置一个异常处理回调函数,一旦发生异常的话,则将程序转移到_ErrFormat标号处执行并认为文件的格式存在异常。由于PE文件的分析中涉及到很多指针操作,对任何一个指针都进行检测并判断它们是否已经越出了内存映射文件的范围是很麻烦的,使用SEH可以让这方面的工作开销最少。

当一切准备就绪后,程序要简单地判断一下打开的文件是否是一个合法的PE文件,详见下面的一段代码:

  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

esi一开始被指向文件的头部,程序首先判断DOS文件头中的标识符是否和“MZ”(也就是IMAGE_DOS_SIGNATURE)符合,如果符合的话,那么从003ch处(也就是e_lfanew字段)取出PE文件头的偏移,并比较PE文件头的标识是否为IMAGE_NT_SIGNATURE,这两个步骤都通过的话,那么几乎可以认定这是一个合法的PE文件了,程序就真正开始分析工作——调用_ProcessPeFile.asm 文件中的_ProcessPeFile子程序。

_ProcessPeFile.asm文件的内容如下所示:

    .const

szMsg db   ~文件名:%s~,0dh,0ah

    db    ~-------------------------------------------~,0dh,0ah

  db   ~运行平台:   0x%04X~,0dh,0ah

⌨️ 快捷键说明

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