📄 反汇编的艺术-----逆向引擎网络教程 .txt
字号:
反汇编的艺术-----逆向引擎网络教程
相关的例子:下载>>> 作者:CuteDevi & Pegasus[REN]andBen 翻译 梁然生(yuexidong) 于2008-9-19上传
--------------------------------------------------------------------------------
2003年11月18日
ALPHA RELEASE
翻译 梁然生(yuexidong)
原作 CuteDevi & Pegasus[REN]andBen
3 给框架带来一点活力
3.1 处理我们的菜单源代码
在前面的章节我们定义了框架,但是我们没有写代码处理任何东西。现在,我们开始写菜单处理部分。
我们定义我们的菜单由下面这些组成:
OPEN :打开我们想反汇编的文件,然后我们调用反汇编引擎。
CLOSE:关闭文件
EXIT:离开程序
打开部分是我们需要做的最多的工作包括文件处理和其他部分
3.1.1 处理我们的DlgProc 代码
我们知道当我们按一个菜单工程的时候,它会发送WM_COMMAND消息给我们的程序。我们需要处理这个消息。我们知道每个菜单都有他的句柄,我们可以在wParam中得到。所以我们首先添加菜单工程到Skeleton.in:
IDM_OPEN EQU 10002
IDM_CLOSE EQU 10003
IDM_EXIT EQU 10004
和Skeleton.asm中的DlgProc部分:
.elseif eax==WM_COMMAND
mov eax, wParam
.if ax==IDM_OPEN
; We put our code here
.elseif ax==IDM_CLOSE
; .......
.elseif ax==IDM_EXIT
; .......
.endif
.elseif eax==WM_CLOSE
现在我们为我们的三个菜单工程编写了代码。我们现在可以为每一个编写代码。
3.1.2 打开 菜单
在这里我们真正需要什么?
一个对话框让用户选择文件
打开文件并把它映射到内存。
为了显示打开文件对话框,首先我们需要添加一些数据到Skeleton.inc
ofn OPENFILENAME <>
buffer db 260 dup(0)
StrFilter db "Executable Files",0,"*.exe",0
db "Dynamic Link Libraries",0,"*.dll",0,0
现在你可以看一下随书附带的源代码。
然后,为了使用我们的OPENFILENAME结构,我们需要先初始化它。在DlgProc我们需要添加下面的代码:
.if eax==WM_INITDIALOG
;-------------------------------------- 初始化整个对话框--------
;===========================================
; 预备ListView控件
;===========================================
invoke PrepareListView
;===========================================
; Initialize the OPENFILENAME structure
;===========================================
mov ofn.lStructSize, SIZEOF ofn
push hWnd
pop ofn.hwndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter, OFFSET StrFilter ; ( *.exe & *.dll )
mov ofn.lpstrFile, OFFSET buffer ; ( Store the file name )
mov ofn.nMaxFile, 260
; ( File must exists/ Hide read only files)
mov ofn.Flags, OFN_FILEMUSTEXIST or \
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
这段代码只能初始化我们的结构因此我们将它放在WM_INITDIALOG部分。为了弹出这个对话框并显示它我们需要调用GetOpenFileName.
所以返回WM_COMMAND我们添加代码:
.elseif eax==WM_COMMAND
mov eax, wParam
.if ax==IDM_OPEN
;------------------------------------- 打开文件 -------------------
; 显示打开文件对话框
invoke GetOpenFileName, ADDR ofn
;---------------------------------------------------------------------
最好我们有了一个可以正常工作的打开文件对话框。
图3:带来一点活力的框架
在我们打开这个对话框之后我们需要做一个小的检查看看我们是否真的选择了一个文件或者我们点击了取消按钮或者其他的。
正确的是在 invoke GetOpenFileName, ADDR ofn 之后,我们继续添加:
.if eax==TRUE
invoke CreateFile,ADDR buffer,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile,eax ; Stores the handle of the file
.endif
注意:我们需要在Skeleton.inc中添加代码:
hFile dd ?
这个CreateFile函数返回文件的句柄然后我们保存它到hFile中。然后我们需要映射文件到内存,简单的处理是用CreateFileMapping创建一个文件映射对象然后用MapViewOfFile映射进内存。但是使用最后一个函数我们需要得到文件的大小,所以我们需要使用GetFileSize为我们工作。
所以简而言之我们需要:
使用CreateFile获取文件句柄
使用CreateFileMapping创建文件映射对象
使用GetFileSize获取文件大小
使用MapViewOfFile将文件映射到内存
我们还应该在每次调用函数后进行检查,如果有错误发生我们应该显示一个信息框。为了声明这些错误信息我们还要创建一个新文件Msgs.inc包含我们需要的错误信息。现在我们只需要两个信息:
Please check the sources now, or you will get lost!
然后我们基本上完成了打开文件部分的代码。也许你已经注意到这些代码有些长,为了看起来比较整齐我们将代码移到一个子程序中。我们叫它MnuFileOpen。我们这样定义:
MnuFileOpen proc
......
ret
MnuFileOpen endp
提示;在RadASM中有代码收缩、展开功能,所以代码看起来非常整洁。
经过简单的移动代码到新子程序我们像下面这样改变代码:
.if ax==IDM_OPEN
invoke MnuFileOpen
.elseif ax==IDM_CLOSE
现在让我们继续,在这一章我们完成了打开文件部分,我们再来完成关闭文件部分。
3.1.3 关闭 菜单
我们真的需要做这一部分吗?记住当我们打开一个文件并把它映射到内存,它就在使用内存。所以我们需要在关闭前释放这部分内存。我们使用UnmapViewOfFile关闭映射对象并且我们必须释放掉所有映射的内存。最后我们使用CloseHandle关闭映射的文件映射对象。所以我们需要编写代码来释放这部分内存。
我们增加一个子程序叫MnuFilwClose,像这样调用:
.elseif ax==IDM_CLOSE
invoke MnuFileClose
.elseif ax==IDM_EXIT
在我们的MnuFileClose究竟是什么?它是这样的:
MnuFileClose proc
cmp hFileMapping, 0
jnz @f
ret
@@:
invoke UnmapViewOfFile, FileOffset
invoke CloseHandle, hFile
mov FileOffset, 0
mov hFile, 0
ret
MnuFileClose endp
这个子程序做这样的检查如果一个文件映射到内存,就释放并关闭它。
在这一章的最后,我们编写Exit部分的代码。
开程序。
3.1.4 离开 菜单
这是非常简单的,我们需要关闭文件,(如果它还开着)然后离开程序。
.elseif ax==IDM_EXIT
invoke MnuFileClose
invoke ExitProcess,0
.endif
调用MnuFileClose子程序确保文件在我们关闭程序之前是释放并且关闭的。然后调用ExitProcess离
在这一章关于菜单处理的代码已经完成,你应该注意源代码:
GetMenu:在初始化对话框当中
EnableMenuItem:在(MnuFile/MnuFileOpen)
在工程当中的MsgBox是一个很小的程序,你可以用它测试我们的反汇编器。
3.2 总结
在这一章我们编写代码处理菜单知道如何打开文件并将它映射到内存。看到ListView如何工作。但我决定在独立的一章用详细的例子讲解ListView.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -