32位汇编:实验1寄存器的使用
实验(1)总结:OllyDBG 的基本界面与窗口功能

| 窗口名称 | 功能说明 |
|---|---|
| 反汇编窗口 | 显示程序的汇编代码,可切换注释、地址、HEX等显示方式。 |
| 寄存器窗口 | 显示当前线程的CPU寄存器(如EAX、ESP、EIP等),支持切换显示模式。 |
| 信息窗口 | 显示当前选中指令的详细参数、跳转地址、字符串等。 |
| 数据窗口 | 显示内存或文件内容,支持多种显示格式(Hex、ASCII、Unicode等)。 |
| 堆栈窗口 | 显示当前线程的堆栈内容,便于观察函数调用和参数传递。 |
实验(2)总结:寄存器观察与标志位实验
1)加载 crackme.exe
使用 OllyDBG 加载目标程序(crackme.exe),进入调试状态。

2)关键寄存器说明
**ESP:**堆栈指针,指向当前栈顶地址。

**EIP:**指令指针,指向下一条将要执行的指令地址。

按下F7,那么将执行第一条指令,然后切到第二条将执行的指令。

通用寄存器
在OD右上角寄存器区显示有EAX,ECX,EDX,,EBX,ESP,EBP,ESI,EDI和EIP等,它们都被称为32位寄存器。
在 OllyDbg 中,它们的内容以十六进制显示。例如,EAX 的最小值为 00000000,最大值为 FFFFFFFF

3)修改寄存器值
可手动修改寄存器值(如将 EAX 改为 12345678).

打开 OllyDbg,把 EAX 更改为我们需要的值,这里 假如为 12345678

OllyDBG 会用红色高亮显示变化。

4)标志寄存器实验(EFLAGS)
在OllyDbg寄存器信息的下方显示的就是标志寄存器

里的标志分为 C,P,A,Z,S,T,D 和 O。 我们还看到,它们只能是两个数字值,0 和 1。某一具体指令的执行可以改变它们的含义
O 标志(溢出标志)
溢出标志在当操作改变了符号位,返回错误值时被设置。
将 EAX 的值改为 7FFFFFFF,即最大的正数(补码表示)。

现在使其加 1,其和将超过最大正数,80000000 对应的是一个负数。

可以看到原来在00401000 处的指令变为了我们输入的指令

ADD EAX,1,执行这条指令会发生什么?它将 EAX 加 1,并将值返回到 EAX。 O 标志现在等于0,F7 将完成这条指令,O标志被设置为1,该标志的目的:当指令的结果超出了它可能存取的最大值,将被设置

Z 标志(零标志)
当运算产生的结果为 0 时被设置。
返回到 401000处的指令:ADD EAX,1。(右键点击 New origin here),先设置 EAX 的 值为FFFFFFFF,即十进制-1,当按下F7运行指令 ADD EAX,1使,结果为-1+1,等于0,零标志被设置。

按下F7后,EAX的值为0,所以,如果操作的结果为0,Z标志被设置为1。

S 标志(符号标志)
这个标志在运算结果为负时设置为 1。
来看一下它是如何运作的,改变 EAX 的数值为 FFFFFFF8, 它等于十进制-8

然后 F7 再次执行 ADD EAX,1。结果为 FFFFFFF9,等 于十进制-7,是个负数,所以符号标志位被设置。

更多推荐


所有评论(0)