反汇编的艺术-逆向引擎网络教程
   作者:CuteDevi & Pegasus[REN]andBen 翻译 梁然生(yuexidong) 于2008-8-17上传 

2003年11月18日
ALPHA RELEASE

翻译 梁然生(yuexidong)

原作 CuteDevi & Pegasus[REN]andBen

目 录
1    前言

2    反汇编器的框架
    2.1什么我们需要一个反汇编器
    2.2我们需要什么工具
    2.3构造一个简单的框架
    2.4在代码中的一些改变
        2.4.1 Skeleton.INC
        2.4.2 Skeleton.asm
    2.5总结
    2.6 下一章简介

3    给框架带来一点活力
    3.1 处理我们的菜单源代码
        3.1.1 处理我们的DlgProc 代码
        3.1.2 打开 菜单
        3.1.3 关闭 菜单
        3.1.4 离开 菜单
    3.2 总结
    3.3 下一章简介

4    ListView
    4.1 什么是ListView 控件
    4.2 使用 ListView 控件
    4.3 总结
    4.4 下一章简介

5    PE 旅程
    5.1 什么是PE
    5.2 理解PE
        5.2.1 DOS MZ HEADER (IMAGE_DOS_HEADER)
        5.2.2 DOS STUB
        5.2.3 PE FILE SIGNATURE
        5.2.4 PE HEADER (IMAGE_NT_HEADERS)
    5.3 检查是否是有效PE文件
    5.4 获取PE的块
    5.5 什么是EP
    5.6 获取EP
    5.7 转换 RVA 到Offset
    5.8 什么是引入表
        5.8.1 引入表的意义
        5.8.2 我们如何能找到引入表
        5.8.3 这就是引入表
    5.9 获取PE的引入表
    5.10 总结
    5.11 下一章简介

6    Opcodes的介绍
    6.1 什么是 Opcodes
    6.2 熟悉Opcodes
    6.3 一个Opcode意味着一个助记符号吗
    6.4 更多了解Opcodes
    6.5 Intel 指令格式的介绍
        6.5.1 Prefix (可选)
        6.5.2 Code (必须)
        6.5.3 ModR/M (00:000:000b)
        6.5.4 SIB
        6.5.5 Displacement
        6.5.6 Immediate
    6.6 总结
    6.7 下一章简介

7. 关于 Prefix的一切
    7.1 更多了解 Prefix
    7.2 控制段的 Prefix
    7.3 控制操作数大小的 Prefix
        7.3.1 选择默认操作大小的意义
    7.4控制地址大小的 Prefix
    7.5 控制循环(REP/REPNE)的 Prefix
    7.6 控制总线锁定的 Prefix
    7.7 总结
    7.8下一章简介

8    关于CODE的一切(一)
    8.1 CODE块的基础
    8.2 总结
    8.3 下一章简介

9    关于CODE的一切(二)
      9.1 演示 CODE
      9.2 总结
      9.3 下一章简介

10    关于 ModR/M的一切
      10.0.1 什么时候考虑Code的扩展
      10.0.2 什么时候考虑寄存器
      10.0.3 更多了解 ModR/M
      10.1 演示我们的工具
      10.2 查看关于ModR/M Byte位的例子
      10.3 总结
      10.4 下一章简介

11    关于 SIB的一切
    11.1 SIB 代表什么
    11.2 演示我们的工具
    11.3 总结
    11.4 下一章简介

12    关于 Displacement的一切
    12.1 总结
    12.2 下一章简介

13    关于 Immediate的一切
      13.1 Bit(S):一个新的特别的Bit位
    13.2 总结
    13.3 下一章简介

14    Intel 指令格式的总结
      14.1 ModRM 16-Bit
      14.2 总结
      14.3 下一章简介

15    构造一个解码的引擎框架
      15.1 在开始之前
      15.2 构造一个Byte分析程序
      15.2.1 理解旧的代码
      15.3 一个真正的引擎框架的想法
      15.4 总结
      15.5 下一章简介

1    前 言
欢迎来到反汇编的艺术-一本用纯汇编写反汇编器的免费在线书。你可能注意到这本书没有完成。现在的状态是ALPHA。
请原谅我们。现在提供的14章提供你理解反汇编器如何工作的基本知识。我们努力完成这本书,但是你要给我们时间。
所以在一切完成之前,有问题请不要联系我们。
我们还为每一章提供了一个小代码包,你可以使用这些代码。这本手册主要是CUTEDEVIL写的,检查错误的是PEGASUS[REN]
和BEN。
这本书将一直免费没有意图将它商业化。如果你有任何建议和意见不要客气和我们联系通过逆向代码引擎社区的论坛
HTTP://board.anticrack.de 最后的版本将指向http://aod.anticrack.de为什么我们要做这个工程。我不知道?增长知识,
乐趣,浪费时间。。。为什么你对写一个反汇编器感兴趣。

2    反汇编器的框架

2.1    什么我们需要一个反汇编器

如果你见过任何一个图形界面的反汇编器(IDA,W32DASM,BDASM。。)我们将很快的注意到这些反汇编器结构的主要部分:
    菜单:使用主要的功能(文件句柄,查看,寻找。。。)
    LISTVIEW:主要的查看区,显示(OPCODES,助记符,注释。。)
还有其他的我们需要的组成部分:
工具栏:更方便快捷的使用主要的功能
LISTVIEW:显示重大的事件结果(打开,检查,反汇编以及其他关于目标文件的信息)

2.2    我们需要什么工具

在以前提及,我们将使用RADASM和MASMPLUS 作为我们的IDE和编程语言。

2.3    构造一个简单的框架

OK,现在让我们开始吧。这里是我们要做的事情:
从RadAsm打开工程向导选取新工程
接受默认设置(汇编器为MASM,工程类型为Win32 App)
填写工程名字(Skeleton)
填写工程说明(Simple Skeleton)
选择工程的存放文件夹
选取模板(Dialog application->DialogApp.tpl)
我们按”NEXT”,接受默认选项
现在已经包含了所有需要的文件,让我们编译并运行它。
wpe18.jpg (4707 字节)
图2.1:编译运行后的空白程序

现在,在”Resources”部分,我们打开”Skeleton.dlg”做一些必要的改变。
改变窗口大小为(600x600)
改变窗口名字为IDD_MAIN
禁止最大化(MaxButton)
禁止可变窗体(SizeBorders)
编译、运行
OK,现在对话框比较适合。让我们加一些必须资源,为了达到目的,我们必须一步一步做:
添加菜单,我们添加一个新的菜单到工程(Main.mnu),出现菜单编辑器(MENU EDITOR),
我们编辑它使我们能得到一个菜单目录(File->Open/Close/Exit):
#define IDR_MENU 10000
#define IDM_FILE 10001
#define IDM_OPEN 10002
#define IDM_CLOSE 10003
#define IDM_EXIT 10004
IDR_MENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "Open\tCtrl+O",IDM_OPEN
MENUITEM "Close",IDM_CLOSE
MENUITEM "Exit\tAlt+X",IDM_EXIT
END
END
从“IDD_MAIN”选项卡中选取“Main.mnu”作为默认菜单。
我们在反汇编显示器添加一个LISTVIEW控件
我们在底部添加一个LISTBOX以方便显示所发生的重要事件。
我们再次编译、允许。

wpe19.jpg (6328 字节)

图2:重新调整后的空白程序

虽然我们做的第一部分,它看起来并不是很好,下一次我们再让它更好看一些。

2.4    在代码中的一些改变
2.4.1 Skeleton.INC

.const
IDC_DASM equ 1001
.data?
hDsmList dd ? ListView控件的句柄
hWnd dd ?     主窗口的句柄
IDC_DASM是ListView控件的常量定义。我们需要这个常量当我们需要用GetGlgItem函数获取ListView的句柄时使用。
HDsmList 保存ListView控件的句柄。HWnd保存主窗口的句柄。同样我们需要它们。

2.4.2    Skeleton.asm

.code
PrepareListView proc
;-----------------------------------------------------------------------;
; 预备ListView控件并且改变它的颜色和属性
;-----------------------------------------------------------------------;
Invoke GetDlgItem,hWnd,IDC_DASM ; 获取ListView控件的句柄
mov hDsmList, eax
invoke SendMessage, hDsmList, LVM_SETTEXTCOLOR, 0, 0FE7000h ; Sets its color
invoke SendMessage, hDsmList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,\ ; Sets its style
LVS_EX_FULLROWSELECT or \
LVS_EX_GRIDLINES + LVS_EX_FLATSB
ret
PrepareListView endp
这个子程序主要是设定ListView控件的属性为我们反汇编器所需要的和设定它的背景颜色。我们
将不注意这些不同之处在我们插入一些文字到ListView控件当中去。当然那是其他的事情,在其他章节。
注意:我们也要添加下面这些代码,来调用我们的代码在程序的开始处(程序初始化的时候)
.if eax==WM_INITDIALOG
invoke PrepareListView ;预备初始化ListView
.elseif eax==WM_COMMAND

2.5总结

在这一章我们没有真正的开始,我们只是预热一些,准备我们反汇编器工程的漫长旅程。

2.6 下一章简介

我们将:
写菜单处理代码
知道如何(打开、映射、处理、关闭)文件
学习如何让ListView工作的例子
还有更多。。。。


欢迎访问AoGo汇编小站:http://www.aogosoft.com
下一篇>>>