1.2.1 调试helloworld.exe
1.认识OD组成
OD工作区:
- 指令及指令解释区
- 寄存器及运行状态区
- 代码和数据字节码区
- 栈区
指令解释区
指令及指令解释区(以下称①区)该区域位于整个界面的左上角,共包含四列。分别为
- 指令所在的内存地址、
- 指令字节码、
- 反汇编后的指令语句,
- 以及指令相关的注释。
OD的强大之处在于,它将许多难懂的指令字节码反解释成了汇编指令,并附以形象的说明。
例如,在内存地址0x0040101E处的指令字节码FF25 00204000,其对应的汇编指令是一个远跳转指令:
JMP DWORD PTR DS : [<&kernel32.ExitProcess>]
而该位置处的数据则是一个内存地址。该地址指向了kernel32.dll动态链接库中函数ExitProcess的起始位置。
寄存器运行状态区
寄存器及运行状态区,该区域位于整个界面的右上角,包含了所有的32位寄存器,如eax、ebx、ecx、esi、edi、esp、ebp等。大家要特别关注以下几个寄存器:
- ebp(栈基地址指针)
- esp(栈顶指针)
- eip(指向下一条要执行的指令的位置)
除了寄存器的值外,该区还显示所有段寄存器的值及标志位的值,如FS段,这个段在后面讲到异常的时候会用到。
代码和数据字节码区
代码和数据字节码区(以下称③区)该区域位于整个界面的左下角,它包含了指定内存范围的字节码,我们可以通过菜单命令随时查看当前内存中的数据。
栈区
栈区 该区域位于整个界面的右下角,它反映了当前栈的分配情况及栈在程序运行过程中的变化情况。
1.2.2 Helloworld.exe的跟踪执行
跟踪一个程序的执行不仅可以帮助我们判断程序是否在按照自己预先设计的思路运行,还可以使我们了解某个时刻计算机的寄存器、栈、全局变量、内存等的状态,便于我们理解和更好地把握程序运行过程,优化程序设计,提高编程水平。
常用快捷键
F3:加断点
F7:单步步入
F8:单步步过
F9:运行
Ctrl+F2:重新运行
超级文字查找 插件使用
指令解释区右键->Search for->All reference Text String找到Helloworld位置打断点
调试
- 找到Helloworld F2打断点
- (1) Call F7进入MessageBox
- (2)Call F7 进入ExitProcess
1.2.2 修改Exe文件字节码
OD不仅可以让我们对EXE文件进行反汇编和单步执行调试,还可以对目标EXE文件进行修改,后面的许多章节都会涉及这一操作。下面我们对HelloWorld.exe文件中的部分字节码进行更改,将显示信息“HelloWorld”更改为“HelloWorld-modified by OD”。这种修改要成功,要求更改后的字符串长度不能超出EXE中数据段的范围。幸运的是,由于链接器在进行链接时是以200h字节对齐段长度,即数据段的长度要大于等于200h字节,所以这次修改一定可以成功。
- 在字节码区选中要修改的内容,右键,选择Binary->Edit
- 重写写入内容
- 运行修改
OK->F9放开断点
注意
1.要选中足够的大小的内容 大小少了是无法增加的
2.注意内容中的’.‘需要替换成空格 不然就提前\0结束字符串显示内容了
就变成Helloworld\0by OD 显示不全
- 保存修改
1.2.3 静态分析
如果说OD是一个擅长动态分析的软件,那么W32DASM则是一个擅长静态分析的软件。后者可以标识整个EXE文件中指令间的调用关系,对于跟踪和识别指令之间的承前启后的关系有很大的帮助,该软件在随书文件中可以找到。
这里可以选用IDA Pro(下载地址)
静态分析最大的好处是:能从当前指令反查调用此处的指令所在。例如,地址0x00401018处的指令是谁调用了呢(加粗部分)﹖请分析如下代码行:
提示﹐由于静态分析和动态分析均正确地模拟了Windows 操作系统的进程装载机制,所以二者的指令地址是一致的。
1.3 十六进制编辑软件FlexHex
UltraEdit(下载地址)
WinHex
我用的是UltraEdit
1.3.1 UE修改程序
- UE打开Helloworld.exe
- ctrl+H 16进制查看
- ctrl+F 搜索0x48即’H’
- 找到Helloworld 然后修改 为Helloworld By UE
1.4 破解实例:U盘监控器
通过一个简单的破解软件的实例,进一步展示以上软件的使用方法。
目标
U盘监控器。该软件可以从互联网上获得,也可以从本书的随书文件中找到。
任务
该软件需要注册才能使用全部功能,我们的任务是使得输入任何注册码均能注册成功。
思路
通常在注册时,程序会读取注册码,然后对注册码进行判断:正确则显示注册成功,转到正常的程序运行状态;错误则显示注册失败,转到未注册运行状态。如果我们将判断转移条件更改一下,错误则转到正常的运行状态,反之则转到未注册的运行状态。这样,如果我们输入了错误的注册号,程序也会像输入了正确的注册号一样运行,流程如图1-18所示。
实现步骤
步骤1 首先运行该软件,获取与破解有关的提示信息。
打开软件,进行注册。随便输入注册码,单击注册以后,系统出现一个对话框提示“注册失败!”,如图1-19所示。这个字符串就是我们要获取的与破解有关的提示信息
注意:这个USB监控程序 在书附源码文件中,可以私信找我要
步骤2 使用FlexHEX获取“注册失败!”字符串的文件偏移地址。
步骤3 使用OD获取引用该字符串的指令在内存中的地址。
步骤4 使用W32DASM 获取判断语句的位置。
步骤5 使用OD更改指令字节码。
步骤6 重新测试
1.5 初识PE文件
PE (Portable Executeable File Format,可移植的执行体文件格式),使用该格式使链接生成的EXE文件能在不同的CPU工作指令下工作。
可执行文件的格式是操作系统工作方式的真实写照。Windows操作系统中可执行程序有好多种,
比如 COM、PIF、SCR、EXE 等,这些文件的格式大部分都继承自PE。其中:
- EXE是最常见的PE文件,
- 动态链接库(大部分以dll为扩展名的文件)也是PE文件。
本书只涉及这两种类型的PE文件。
简单了解PE字节码编排
分析结构
我们首先以HelloWorld.exe为例,简单地了解一下PE格式文件的字节码编排。如果你手头没有合适的软件,还想获取像FlexHEX那样的十六进制格式字节码内容,可以使用以下步骤。
- 步骤1 生成1.txt
- 步骤2 将HelloWorld.exe更改为123。注意,不要加扩展名。
- 步骤3 在命令提示符下运行以下命令:
Debug 123<1.txt>2.txt
这样,就可以生成规则排列的十六进制字节码并存储在文件2.txt中,如代码清单1-2所示。是不是和FlexHEX显示的结果差不多呢?
(卡在Debug命令了,这一步骤实现,有点没搞懂)
解决Debug命令没找到问题 参考在windows10 64位系统上使用debug命令
思路:
- 先用DOSBOX挂载c盘
- 再使用debug.exe (debug.exe是16位的,默认无法在64位机器运行)
PE 结构信息
PE以200H大小对齐的
1.6 小结
本章 主要实现:
- 环境安装
- 简单PE程序修改
- 简单认识PE