扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共2页)
第3章 静态分析技术
第一节 基础知识
一、虚拟地址和偏移量转换
由于Windows程序是运行在386保护模式下,在保护模式下,程序访问存储器所使用的逻辑地址称为虚拟地址(Virual Address,VA)。与实地址模式下的分段地址类似,虚拟地址也可写成"段:偏移量"的形式,这里的段是指段选择器。
文件执行时将被映像到指定内存地址中,这个初始内存地址称为基址(ImageBase)。在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 9x中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。
相对虚拟地址(Relative Virual Address,RVA)表示此段代码在内存中相对于基地址的偏移。即:相对虚拟地址(RVA)=虚拟地址(VA)-基址(ImageBase)。
文件中的地址与内存中表示不同,它是用偏移量(File offset)来表示的。
在SoftICE和W32Dasm下显示的地址值是内存地址(memory offset),或称之为虚拟地址(Virual Address,VA)。而十六进制工具里,如:Hiew、Hex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 或物理地址(RAW offset)。
在实际操作时,使用 RVA-Offset之类的转换器很容易查出字串RVA和偏移量的值。
以Pc_offset(光盘\tools\offset)此工具为例说说如何将SoftICE下看到的虚拟地址(Virual Address,VA)转换成十六进制工具里的偏移量(File offset),运行该软件打开记事本程序,在Memory Address(内存地址)输入虚拟地址(Virual Address,VA)的值:40117D,点击"Do it"按钮将显示己转换成文件偏移量(File offset),如图一所示。
(图一)内存虚拟地址转换成文件偏移量
二、文件类型分析
文件分析是静态分析程序的第一步,通过相关工具显示欲调试文件的信息,如它是用什么语言写的,是否加壳等。常用的文件分析工具有TYP、Gtw或FileInfo。其中FileInfo(光盘\tools\file\File analysers)由于识别文件类型较多,使用方便,在这一节简单地讲讲它的用法。
FileInfo运行时是DOS界面,支持Windows长文件名,能识别DOS、NE、PE等各种文件类型和壳。
语法:fi <drive:\path\><*.*> </r> </f> </d-> </l+> </p+>
"fi /r"or "/s" 列出当前目录和子目录所有的文件信息;
"fi /f" 仅列出能识别的文件
由于每次要进入DOS窗口运行程序相当不便,在这可创建快捷方式,把要分析的文章复制到FileInfo目录下,用鼠标双击FileInfo主文件即可。FileInfo快捷方式如图二。在快捷方式中的命令行中可以键入相关参数,如:FI.EXE /l /p+,此后用鼠标双击FileInfo快捷方式,会自动分析出FileInfo当前目录内的所有文件,不包含子目录。
图二FileInfo快捷方式中命令参数配制
双击此快捷方式就可执行带参数的FileInfo,显示结果如图三所示。
图三 FileInfo分析文件的报告
在此例中,文件CHAP301.EXE被分析出是用VC6.0编译的, CHAP303.EXE文件类型是Win GUI,就是Windows图形用户界面程序(一般FileInfo分析不出类型就报此类型)。另外此工具也可分析出程序是被何种软件所加密的等。
第二节 W32Dasm简介
W32Dasm是一个强大的反汇编工具,操作简单,使用方便。通常被程序员使用,当然也可被用来Crack软件了,很适合Cracker使用。我在这把与crack相关的功能简述如下:
1.0 开始
1.1 运行W32Dasm,在这里以windows95自带的计算器为例:calc.exe。
1.2 从Disassembler(反汇编)菜单选择Disassembler Options(反汇编程序选项)选项将出现如下对话框:
1.3 在Disassembler(反汇编)菜单,选择Open File(打开文件)选项或按工具栏按钮
1.4 选择你要打开的文件就可。
注意:你反汇编文件后,如字符己超过屏幕外,这时你要选择合适的字体(在Font字体选项中Select Font选择字体),然后设为默认字体(Save Default Font)即可。 当然一般以默认值就可。
2.0 保存反汇编文本文件和创建方案文件(Save The Disassembly Text and Create A Project File)
略。
3.0 反汇编源代码的基本操作
3.1 转到代码开始(Goto Code Start)
在工具栏按或从菜单的转到(Goto)选项选择转到代码开始(Goto Code Start) 或按Ctrl S, 这样光标将来到代码的开始处,用户可通过双击鼠标或用shift+上下光标键改变光标的位置。
注:代码的开始处是反汇编代码列表清单汇编指令的开始,而不是代码运行的起点,程序运行的起点称为程序入口点(Program Entry Point)
3.2 转到程序入口点(Goto Program Entry Point)
在工具栏按或菜单的转到(Goto)选项选择 转到程序入口点(Goto Program Entry Point)或按F10,这样光标将来到程序入口点(Entry Point),这里就是程序执行的起始点,一般动态调试时LOAD时也就停在此处。
3.3 转到页(Goto Page)
在工具栏按或菜单的转到(Goto)选项选择转到页(Goto Page)或按F11,这时跳出一对话框,输入页数可跳转到相关页面去。
3.4 转到代码位置(Goto Code Location)
在工具栏按或菜单的转到(Goto)选项选择转到代码位置(Goto Code Location)或按F12,一个对话框将出现,充许用户输入代码偏移地址,以跳转到此位置上去。
3.5 执行文本跳转(Execute Text Jump)
这功能是在Execute Text(执行文本)菜单选项里的,执行跳跃(Execute Jump)功能激活条件是光标在代码的跳转指令这行上(这时光条是高亮度的绿颜色)。此时工具条Jump To按钮也激活。如图:
此时按或菜单选项Execute Jump(执行跳跃)或按右光标键,光条将来到跳转指令所指到的位置。在这例子里,将来到:004076CE xor eax,eax 这一行代码处:
如要返回到上一次跳跃,请参考3.6.
3.6 返回到上一次跳跃Return From Last Jump
这功能是在Execute Text(执行文本)菜单选项里的,此指令仅仅是在 执行文本跳转功能完成后才激活。当这条件成立时,按钮将激活。按或在菜单里选项返回到上一次跳跃(Return From Last Jump)或按左光标键,光条将返回到上一次跳跃位置处。
3.7 执行呼叫Execute Text Call
这功能是在Execute Text(执行文本)菜单选项里的,此功能激活的条件是光条在CALL指令一行。在这一行时光条将发绿,按钮将激活。执行时光条将会来到CALL所指的地址处。
如下图: 光条在0040751D call 004073D4 一行。
此时按或在菜单的执行呼叫(Execute Text Call)或按右光标键,光条将来到CALL所指的地址004073D4这一行。
如要返回到刚才起点的0040751D call 004073D4 一行,参考3.8的返回呼叫。
3.8 返回呼叫(Return From Last Call)
这功能是在Execute Text(执行文本)菜单选项里的,此指令仅仅是在执行呼叫Execute Text Call功能完成后才激活。当这条件成立时,按钮将激活。按或在菜单里选项返回呼叫(Return From Last Call)或按左光标键,光条将返回到上一次呼叫位置处。
3.9 导入功能(Imported)
在菜单功能选项里,其作用主要是查看import函数。按或在菜单功能选项里的导入(Imports)命令,执行后将列出当前文件的Import函数。
你可双击这些项目,光条将来到调用这些函数的代码处。
注意:如果代码多处引用了这些函数,你双击这个项目函数时,光条将在调用了其的几个位置代码处循环.
你也可用copy all或copy view复制import函数。
3.10 出口功能(Exported)
在菜单功能选项里,其作用主要是查看Export函数。按或在菜单功能选项里的出口(Exports)命令,执行后将列出当前文件的Exports函数。
注意:一般EXE文件没有exported,DLL文件有exported函数。
3.11 裁判(References)
在这个菜单选项里有菜单参考(MENU), 对话参考(DIALOG)or (串式数据参考STRING DATA),分别对应按钮:,或。
注意:其中(串式数据参考STRING DATA)功能破解时很常用。
4.0 复制汇编代码文本
W32dasm充许打印或复制指定行的汇编代码。首先你将鼠标移到W32DASM的最左边单击,将会出现一个小红点,再按住shift键,移到你需要的下一行,再单击鼠标一下,将选中一段,按CTRL+C复制或在菜单选项反汇编里的拷贝指定的行(Copy Lines of Text)功能或按,把数据复制到剪贴板里。如:
5.0 装载32位的汇编代码动态调试
5.1 反汇编windows自带的计算器程序 calc.exe.
5.2 选择菜单调试选项中的加载处理(Load Process),或按Ctrl+L.出现一个加载对话框,你可输入选项命令。现在你可按装载(load)按钮。
Calc.exe现在被W32DASM动态调试,将出现左右两个调试窗口(如下图),在初始化calc.exe程序后,指令将停留在入口点(Entry Point)处。
左边的调试窗口列出各种状态器如:CPU寄存器,CPU控制寄存器,断点,活动的DLL,段寄存器等等;
(左调试窗口)
(右调试窗口)
6.0 运行,暂停或终止程序
6.1 在右调试窗口,按运行(RUN)按钮或按F9,calc.exe将运行起来。
按暂停(PAUSE)按钮或空格键,程序将暂停,这在单步跟踪时经常用到。
按终止(TERMINAT)按钮,程序将停止,退出动态调试环境。
7.0单步跟踪程序
7.1 重新加载 calc.exe
7.2 在程序加载后,停留在入口点,你可按F7或F8单步调试程序,这两个键所不同的是F7是跟进CALL里,F8是路过。
7.3 进入自动调试按 (F5) 和结束自动调试按 (F6) 。
8.0设置激活断点
8.1 重新加载 calc.exe
8.2 在W32DASM的菜单转到选项转到代码处(goto code)功能,填上403198,按确定,你将在W32Dasm的主窗口(此时可能最小化了,把其还原即可)来到403198地址一行。光条在这一行显亮绿色,按F2或用鼠标左点击最左边(同时按住CTRL)设置断点。
这时如断点设置成功,光条最左边有一小段黄条,显示此行为断点。如下图:
如果断点不在这里,整行光条将是黄色的。
当断点设置好后,在左调试窗口中的断点小窗口显示断点情况(右边有一*):
此时按F2或(鼠标左键+CTRL),断点将取消。
8.3 此时按F9程序将运行到相关断点时停止。
9.0 偏移地址和虚拟地址转换
W32DASM、SOFTICE和Hiew(Decode模式)显示的地址都是虚拟地址,但是在Hiew(Decode模式)下,F5功能键查找的地址是偏移地址,因此必须将虚拟地址转换成偏移地址,才能找到正确的地址。常用的方法是在W32DASM下将绿色的光条移到某一行代码上 , 在窗口底部有一行字指示其偏移地址 , 如虚似地址:Code DaTa@0040534e而偏移地址为:@Offset 0000474Eh. 这就是偏移地址。
10.0 结束
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者