携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天
@[toc]
前言
前期准备
开发语言:MASM V10.0
工作环境:Windows XP/Vista/8/10
源程序的编辑器: 记事本(notepad.exe)用来编写汇编源程序 Visitual Studio 2015/2017/2019也是可以的
动态调试器:OllyDBG软件
静态调试器:W32DASM
字节码的阅读器和编辑器: FlexHex/UltraEdit(下载地址)/WinHex
1.1 开发语言MASM32
MASM32是Steve Hutchessond在微软的不同产品基础上集成开发出来的汇编开发工具包,适合Win32编程环境的汇编语言,它主要用于基于Windows平台的32位汇编语言开发,是现在最流行的 Win32汇编开发包。与VC++和VB等高级语言相比,Win32汇编具有得天独厚的优势,这些优势主要体现在:
- 它摒弃了对系统细节的封装,更接近于系统的底层,从而使得编码更加灵活,能完成许多高级语言无法做到的事情(如代码重定位和特殊寄存器赋值等)。
- 它生成的可执行PE文件体积小,执行速度快。
- 它可用于软件的核心程序段设计,以提高软件的性能。
- 它能够直接接触系统的底层,所以使用它要远比使用VC++和VB等高级语言更适合开发与系统安全相关的程序。比如,与计算机硬件密切相关的驱动程序的开发、计算机病毒的分析与防治、软件加密与解密、软件调试、Windows PE研究等。
因此,学习Win32汇编对学习信息安全而言很有必要。MASM32是我们研究Windows PE的首选语言。 MASM32是一个免费的软件包,该软件包中包含了汇编编译器ml.exe、资源编译器rc.exe、32位的链接器link.exe和一个简单的集成开发环境( Intergrated DevelopmentEnvironment,IDE)QEditor.exe。为什么说MASM32是从其他产品集成出来的呢?这是因为软件包中的ml.exe来自Microsoft 的MASM软件包,rc.exe和 link.exe则来自Microsoft的Visual Studio。MASM32软件包还包括了详尽的头文件、导入库文件、例子文件、帮助文档和一些工具程序,如 lib.exe和dumpbin.exe等,后者被大家公认为最好的显示PE文件结构的工具。大家可以从网站 www.masm32.com/ 上获得MASM32 SDK的最新版本,并可以在论坛里与来自世界各地的汇编爱好者交流技术和思想。
1.1.1 设置开发环境
可以选用vs作为开发工具 可详见我的博客[笔记]vs2015 编写汇编masm32 Helloworld 或者其他相关文章
下载安装masm
环境变量配置
include=masm32/include/; lib=masm32/lib/; path=masm32/bin/;
测试是否配置成功
运行cmd.exe->运行ml命令
1.1.2 开发第一个源程序HelloWorld.asm
配置
配置lib
配置include
代码
.386
;CPU mode
.model flat ,stdcall
option casemap : none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kerne132.lib
;数据段
.data
szText db 'Helloworld',0
;代码段
.code
main :
invoke MessageBox,NULL,offset szText ,NULL,MB_OK
invoke ExitProcess,NULL
end main
1~6行是程序的注释; 7~10行定义了该汇编程序支持的基本特性; 11~16行引入了外部的动态链接库,在这些动态链接库里有程序需要的函数调用,这种调用方式符合程序代码重用的原则; 17~19行定义了这个程序中用到的数据; 20~25行则是程序的代码段,25行的伪指令“end start”告诉操作系统代码入口﹔最有用的代码行只有23行和24行,分别调用了user32.dll 动态链接库中的MessageBoxA函数和kernel32.dll动态链接库中的ExitProcess函数。
1.1.3 运行HelloWorld.exe
vs版本运行
run一下vs就成功显示
masm32运行
1.进入工作区
2.编译源文件
在当前工作区中输入命令
ml -c -coff Helloworld.asm
然后回车。
参数-c表示独立编译,不进行链接;
参数-coff表示编译后生成标准的COFF目标文件。
编译以后会在源文件所在目录生成一个与源文件同名的obj目标文件。
ml.exe是汇编语言的编译程序,它负责将汇编源程序编译成目标文件。该程序可接受的各参数的解释和描述如下所示:
3.链接目标文件与动态链接库
链接是为了将源文件中调用到的动态链接库中的函数的相关信息附加到可执行文件中。链接命令是:
link -subsystem:windows Helloworld.obj
参数-subsystem表示允许该代码运行的子系统。
如果没有错误,执行以上命令后会在源文件所在目录下生成最终的可执行文件HelloWorld.exe。链接程序的参数解释如下:
4.运行
Helloworld.exe
1.2 调试工具OllyDBG
大家可能对OllyDBG(简称OD)并不是很熟悉,但在软件pj领域,它却是与TRW2000和SoftICE等齐名的跟踪pj利器。熟练掌握OD的用法对我们以后研究EXE文件内部指令跳转、病毒分析、逆向工程与反病毒设计等有很大的帮助。那么,就让我们从调试HelloWorld.exe开始学习吧。
OllyDBG 2.01版本 下载地址 OllyDBG官网下载地址 OllyDBG 吾爱pj版 自带插件会比较方便
注意:下载需要关闭Windows实时保护
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 pj实例:U盘监控器
通过一个简单的pj软件的实例,进一步展示以上软件的使用方法。
目标
U盘监控器。该软件可以从互联网上获得,也可以从本书的随书文件中找到。
任务
该软件需要注册才能使用全部功能,我们的任务是使得输入任何注册码均能注册成功。
思路
通常在注册时,程序会读取注册码,然后对注册码进行判断:正确则显示注册成功,转到正常的程序运行状态;错误则显示注册失败,转到未注册运行状态。如果我们将判断转移条件更改一下,错误则转到正常的运行状态,反之则转到未注册的运行状态。这样,如果我们输入了错误的注册号,程序也会像输入了正确的注册号一样运行,流程如图1-18所示。
实现步骤
步骤1 首先运行该软件,获取与pj解有关的提示信息。
打开软件,进行注册。随便输入注册码,单击注册以后,系统出现一个对话框提示“注册失败!”,如图1-19所示。这个字符串就是我们要获取的与pj有关的提示信息
注意:这个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