win32反汇编初步探索及Onllydbg的使用

实验项目win32反汇编
综合性实验2020年11月25日

一、实验综述

1.实验目的及要求

(1)掌握C语言定义全局变量的基本原理
(2)掌握Ollydbg分析工具的使用
(3)在C语言源代码中添加MessageBox代码来定位全局变量赋值语句
(4)分析OD中反汇编窗口及堆栈窗口代码,寻找反汇编代码中的赋值语句

2.实验仪器、设备或软件
Ollydbg
Visual Studio 2015
3.实验原理

(1)Ollydbg简介
Ollydbg是汇编级的调试器,我们使用的VS是源码级的。
Ollydbg主要有以下五个窗口:
反汇编窗口:显示被调试程序的反汇编代码(地址栏、HEX数据栏、汇编指令栏、注释栏)
寄存器窗口:显示当前所选栈线程的CPU寄存器的内容
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字符串等
数据窗口:显示内存或文件的内容
堆栈窗口:显示当前线程的堆栈
(2)MessageBox简介
MessageBox是一个库函数,MFC经常使用的,这是在屏幕上弹出一个带OK按钮的对话框。

二、实验过程(步骤过程、数据记录)

1.步骤

(1)使用VS2015创建项目LESSON 1(我的路径为F:\OD反汇编\LESSON 1)在项目的源文件下新建项001.c文件并写入以下代码;

#include<Windows.h>
int aaa = 0;
int main()
{
	aaa = 0x778899;
	return 0;
}

在这里插入图片描述
(2)选择release配置,vs中的工程有debug和release两个版本:

  • Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,但是不做任何优化(性能有影响),目的是为开发人员提供强大的应用程序调试能力,也就是说只有在Debug模式下,我们才可以使用vs所提供的所有的程序调试功能,比如:单步调试中将光标移至变量处即可以获取该变量的实时数据。
  • Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试,在Release模式下也无法使用vs所有的调试功能。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。

在这里插入图片描述

(3)在源代码中写入命令:MessageBox(0, NULL, NULL, MB_OK);

在这里插入图片描述

注:系统调用MessageBox函数会在程序运行时弹出一个信息框,可以帮助定位源代码。

(4)保存源代码并编译链接运行,运行结果如下:

在这里插入图片描述
(5)此过程会在该项目路径下生成可执行文件(LESSON 1.exe)

在这里插入图片描述

(6)打开onllydbg,File->Open->在F:\OD反汇编\LESSON 1\Release路径下的LESSON 1.exe文件,显示页面如下:

在这里插入图片描述
(7)右键->Go to->Experssion,输入表达式:MessageBoxW进行查找。

  • MessageBoxW:一个Unicode字符集的提示框
  • MessageBoxA:一个ANSI字符集的提示框
  • 因为我们在VS2015中使用的一般都是Unicode字符集的,因此我们此处使用表达式:MessageBoxW,代码将跳转到MessageBox的汇编代码部分。

在这里插入图片描述
(8)定位到MessageBox处;快捷键F2(设置断点),设置断点的地址部分会显示红色高亮;

在这里插入图片描述

(9)快捷键F9让程序执行到汇编指令部分,执行部分会显示紫色线条。

  • 代码中main函数调用了MessageBox函数,因此MessageBox函数返回会返回给main函数

在这里插入图片描述
(10)在右下角的堆栈窗口会显示函数调用,在堆栈窗口选中函数调用语句,回车,看到反汇编窗口代码跳转到了main函数。下图中紫色选中部分就是main函数部分(OD中已经用一个中括号括了起来)。

在这里插入图片描述
(11)从main函数中,我们可以找到自己编写的C语言程序对应的汇编代码。
在这里插入图片描述
鼠标选中的就是我们对全局变量的赋值,赋值的话,他会翻译为转移指令

2.数据记录

在汇编语言中,实验中C语言的赋值语句对应的汇编代码为:

mov dword ptr [aaa],778899

三、结果讨论与分析

1.实验结果

在Ollydbg调试软件中成功找到了C语言源码对应的反汇编代码,明白了C语言中赋值语句对应的汇编指令。

2.分析总结

为了熟悉Ollydbg的软件的使用,小组展开讨论,了解并熟悉了该软件的使用方法,以及如何使用一些快捷键来提高使用效率。
下面是OD的一些常用快捷键:

打开一个新的可执行程序 (F3)
运行选定的程序进行调试 (F9)
暂时停止被调试程序的执行 (F12)
单步进入被调试程序的 Call 中(F7)
步过被调试程序的 Call (F8)
跟入被调试程序的 Call 中 (Ctrl+F11)
跟踪时跳过被调试程序的 Call (Ctrl+F12)
执行直到返回 (Ctrl+F9)
显示记录窗口 (Alt+L)
显示模块窗口 (Alt+E)
显示内存窗口(Alt+M)
显示 CPU 窗口 (Alt+C)
显示补丁窗口 (Ctrl+P)
显示呼叫堆栈 (Alt+K)
显示断点窗口 (Alt+B)
打开调试选项窗口 (Alt+O)

虽然有些步骤比较快的能够帮助我们定位函数或变量,但建议使用单步运行来分析程序执行路径,关注函数跳转 ,跟踪变量取值。这样可以更好的理解汇编语言与高级语言的转化,以及相关函数的调用过程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zkaisen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值