Win32反汇编(一) 初步探索Win32反汇编 与 Ollydbg的简单使用

前言

作者:浪子花梦,一个有趣的程序员 ~
时间:2020.8.9,一直想学逆向工程,刚好最近时间比较充足,每天除了刷算法题也可以学逆向了 . . .
此系列文章都是一些基础的文章,通过几个小例子快速的了解 Win32反汇编与OD的使用,在此作个笔记
如若对您有帮助,记得三连哟 ~

文章目录


OD介绍

在研究反汇编之前,我们先来了解一下以后会一直用的神器:
Ollydbg

1. Ollydbg 简介

Ollydbg 用作动态调试,一般用于逆向一些游戏,而对于软件的逆向一般是使用 IDA,以后我应该会学的,Ollydbg
集成了许多的脚本与插件,非常牛X 的一个逆向工具 . . .

界面如下所示:
在这里插入图片描述
整个界面被分为五个区域,每一个区域都显示非常重要的数据集,对应如下所示:

  1. 反汇编窗口:显示被调试程序的反汇编代码(地址栏、HEX数据栏、汇编指令栏、注释栏)
  2. 寄存器窗口:显示当前所选线程的CPU寄存器的内容
  3. 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转的目标地址、字符串等
  4. 数据窗口:显示内存或文件的内容
  5. 堆栈窗口:显示当前线程的堆栈

我们会在下面的示例中可以观察到上面对应的数据 . . .

2. 调试方式

  • 用 OD调试器直接打开进程
  • 附加到已经打开的进程(暂时不学习)

3.定位地址

Ctrl + G 输入 Win32 API函数名(如:MessageBoxW、printf)

4. 断点

  • 直接在选中的行上按下 F2
  • bp 指令地址(Win32 API 函数名或者地址)

5. 调试中经常用到的几个快捷键

  • F2:设置断点
  • F8:单步步过
  • F7:单步步入
  • F9:运行程序
  • Ctrl + F9 执行到返回
  • Alt + F9 执行到用户代码
  • Ctrl + G 查找表达式(定位)
  • Alt + B 查看断点

对于OD 就介绍到这里,以后遇到再说 . . .

.


全局变量赋值的反汇编形式

首先,我们准备需要逆向的程序,此例子是和全局变量有关的,所以我们准备的代码如下所示:

// 全局变量反汇编演示
#include <Windows.h> 
#include <iostream>
using namespace std;

int num = 1;

int main() 
{ 
	MessageBox(nullptr, nullptr, nullptr, MB_OK); 

	num = 0x666666;

	__asm mov num, 0x999999
	 

	return 0;
}

其中调用了一个 Win32 的API,消息盒子,并且我们在其中嵌入了一条汇编代码 . . . 下面我们来通过 od对这个程序进行反汇编 . . .

如下所示,我们将程序直接插进 od中即可:
在这里插入图片描述

下面我们来研究上面所写的 cpp 反汇编代码:

首先我们进行 OD界面,按 Ctrl + G 搜索 MessageBoxW表达式进行定位,如下所示:
在这里插入图片描述
红色框的部分就是 MessageBoxW内部的汇编指令,我们按F9 将程序执行到红色断点处,然后按F8 单步执行到如下的指令出,如下所示:
在这里插入图片描述
可见消息盒子已经弹出来了,由此发现, MessageBoxW的内部调用了 MessageBoxTimeoutW的方法 . . .

因为 MessageBoxW 方法是在 main主函数中调用的,所以我们按下快捷键 Alt + F9 一定会返回到 main方法中,效果如下所示:
在这里插入图片描述
红色框是 main内部的汇编指令,箭头所指的是上一个方法返回的地方,我们发现返回到了 MessageBoxW 的下一条语句 . . .

现在我们把 OD 与 VS 相对看一下,如下所示,我后将OD中加入了注释(红色框):
在这里插入图片描述

对应的汇编代码中,有压栈平衡的知识,以后的文章中会讲到,这些指令学过 8086的应该都能看懂,所以在此就不多讲了,下面我们看其它的例子吧 . . .

.
.


函数调用的反汇编形式

上面的例子中,我们已经演示了如何去调用 MessageBoxW这个方法,下面我们自己实现一个函数,按F7单步步入执行,体验一下数据世界的变化吧 . . .

C/C++ 函数调用翻译成汇编指令相当于 Call 一个 子程序调用 . . .

首先,我们准备需要逆向的程序,此例子是和函数调用有关的,所以我们准备的代码如下所示(比较简单的函数):

#include <Windows.h>
#include <iostream>

using namespace std;

int add(int n1, int n2) {
	return n1 + n2;
}

int main() {

	MessageBox(0, nullptr, nullptr, MB_OK);

	int sum = add(0x11, 0x22);

	printf("0x%06x\n", sum);

	return 0;
}

因为调用函数的地方用的都是常量参数,所以VS会自动优化成 int sum = 0x33; 所以我们需要将VS优化进行设置,方式如下所示:
在这里插入图片描述
设置为 已禁用即可 . . .

按下来,我们就可以使用 OD 来调试这个程序了,我们快速的定位到 main函数中,然后在 MessageBoxW的下面按F2 设置断点,将程序快速的执行到这边,这样我们就可以研究 cpp文件中的代码执行数据的变化,如下所示:
在这里插入图片描述

我们在观看反汇编窗口的同时,一定要留意其它窗口中的数据,这样对于我们研究是非常有好处的 . . .

下面我们按 F7 单步进入 call add 指令中,发现add函数的指令集如下所示:
在这里插入图片描述
OD 的功能是非常强大的,它已经把子程序块用 {} 给括起来了,使我们更容易接收 . . .

在这个子程序块中,访问了两个内存单元:
dword ptr [ebp + 8]
dword ptr [ebp + c]

我们执行完这个子程序块后,eax的值是0x33,单步执行到下面的指令处,将eax给到一个内存单元,我们就可以通过 dd命令查看这个内存单元中的数据,如下所示:
在这里插入图片描述
最后,我们在main函数的返回处设置断点,然后快速的执行到这个地方,发现其中 call了 printf函数,所以在控制台中打印出了一个数据,如下所示:
在这里插入图片描述
函数调用的简单使用就介绍到这里,下面再介绍一点其它的吧 . . .

.
.


加法计算与内存单元长度的修饰

我们来研究一下加法计算在汇编中的表示,并且我们来了解内存单元长度的不同,造成结果的不同 . . .

我们来看一下下面准备的代码,其中包含指针变量,汇编指令,是一个比较杂的程序,也是对我们了解反汇编有一个很大的帮助,如下所示:

#include <Windows.h>
#include <iostream>

using namespace std;
 
int main() {

	int i = 1;
	int* p = &i;

	i = i + 0x100;

	__asm {
		mov eax, p
		add [eax], 0x22222220
	}

	i = i + 0x200;

	printf("0x%08x\n", i);


	return 0;
}

首先, i = 1,然后 i 加上 0x100,然后通过指针变量间接的又加上了 0x22222220,最后加上了 0x200,所以不出意外的话结果应该是:
0x22222521

当我们执行这个程序时,输出如下的结果:
0x00000321

这就有疑惑了,这是为什么呢? 下面就让我们通过OD 对这个程序进行反汇编,看看它的底层究竟发生了什么事儿 . . .

我们直接定位到main的程序中,其中一些汇编指令对应的代码我已经写好注释了,如下所示:
在这里插入图片描述
我们来看 mov eax, p 这条指令的下一条指令,如下所示:
在这里插入图片描述

我们将 add byte ptr [eax], 20 与 add [eax], 0x22222220 进行对比一下,发现 22222220 变成了 20,这是为什么呢?因为 add byte ptr [eax], 20 前面用 byte ptr 进行了修饰,只取 22222220 的一个字节8位,所以只取了 20,在 cpp 代码中,不指定修饰内存单元长度,则默认为一个字节,下面我们修改代码如下所示:

#include <Windows.h>
#include <iostream>

using namespace std;
 
int main() {

	int i = 1;
	int* p = &i;

	i = i + 0x100;

	__asm {
		mov eax, p
		add dword ptr [eax], 0x22222220
	}

	i = i + 0x200;

	printf("0x%08x\n", i);


	return 0;
}

在嵌入的汇编代码中, 加入了 dword ptr 长度修饰,这下子就能完全保留后面数的每一位了,OD 中的调试如下所示:
在这里插入图片描述

输出的结果为:
在这里插入图片描述

各长度的区别:

  1. 字节(1字节):BYTE类型 (unsigned char) 0 ~ 255 表示成十六进制 0 ~ 0xFF
  2. 字(2字节):WORD类型 (unsigned short)0 ~ 65535 表示成十六进制 0 ~ 0xFFFF
  3. 双字 (4字节):DWORD类型 (unsigned int)0 ~ 4294967295 表示成十六进制 0 ~ 0xFFFFFFFF
    .

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OllyDbg是一款功能强大的反汇编工具,用于分析和调试二进制文件。它广泛用于软件逆向工程、漏洞分析和恶意代码分析等领域。以下是一份关于OllyDbg反汇编从入门到精通的视频教程概述: 1. 入门篇:视频教程的第一部分将介绍OllyDbg的基本概念和操作步骤。首先,学习如何安装和配置OllyDbg。然后,了解如何加载目标二进制文件,并掌握如何设置断点、单步执行和检查寄存器的值。 2. 动态分析篇:在这个阶段,将深入研究OllyDbg的动态分析功能。学习如何在程序执行过程中跟踪程序的控制流和内存状态,以及如何使用条件断点和内存断点等高级调试技巧。 3. 静态分析篇:在这一部分,将介绍如何使用OllyDbg进行静态分析。学习如何查看程序的反汇编代码和内存映像,以及如何寻找和分析关键函数和漏洞。 4. 插件开发篇:OllyDbg支持插件的开发,可以扩展其功能。在这个阶段,将学习如何使用OllyDbg SDK开发自己的插件,并掌握一些重要的插件开发技巧和实例。 5. 实战案例篇:最后,将通过一些实际的案例学习如何应用OllyDbg进行软件逆向工程和恶意代码分析。这些案例将覆盖常见的软件保护机制、漏洞利用和逆向工程技术。 总之,这个视频教程将引导初学者从OllyDbg入门到精通。通过学习这些内容,您将掌握OllyDbg的基本操作和高级调试技巧,能够进行有效的静态分析和动态分析,并具备开发自己插件的能力。它将为软件逆向工程和恶意代码分析领域的学习者提供一个循序渐进、全面系统的学习资料。 ### 回答2: ollydbg反汇编从入门到精通是一套针对ollydbg调试工具的视频教程,通过学习这套教程,可以帮助初学者掌握ollydbg的基本操作和高级功能,从而在反汇编逆向工程领域有所突破。 在这套教程中,会先介绍ollydbg的基本概念和使用方法,包括安装和配置ollydbg、打开文件、设置断点、执行调试等操作。然后,会详细讲解反汇编的相关知识,如如何将机器码转换为汇编代码、如何理解汇编代码的含义、如何查看和修改变量、如何跟踪程序的执行流程等等。 在学会了基础操作后,教程还会深入讲解一些高级功能和技巧,如如何处理程序的加密保护、如何通过动态调试寻找程序的漏洞、如何逆向工程探查程序的内部逻辑等等。通过这些内容的学习,学员将可以在实际应用中更加灵活地运用ollydbg进行反汇编逆向工程工作。 除了视频教程,这套教程还提供一些实践项目和习题,帮助学员进行巩固和实践。学员可以通过解决这些项目和习题来提高自己的实际操作能力和解决问题的能力。 总之,ollydbg反汇编从入门到精通视频教程是一套全面而系统的学习资源,通过学习这套教程,可以帮助初学者逐步提高自己的反汇编逆向工程能力,掌握ollydbg这个重要工具,并在实际工作中取得更好的成果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值