0
点赞
收藏
分享

微信扫一扫

汇编 Ollydbg使用

相关概念

内存的最小单位是字节即1byte=8bit=2个十六进制位,所以相关的计算切记算到byte而不是bit
比如0x0005和0x0006是相差了一个字节,而不是一个位,原因就是内存以字节为最小单位,5+1=6。

cpu从内存中读写信息需要通过总线:地址总线数据总线控制总线

地址线:内存编号信息。 地址线决定了cpu的寻址能力
数据线:数据信息。决定了cpu和其他部件进行数据传送时一次能够传送多少字节的能力
控制线:读写信息。 决定了cpu对其他部件进行控制的能力

寄存器分为三种(8086cpu)
1、数据寄存器: AX,BX,CX,DX。AX,BX(也可被当做偏移地址寄存器),CX,DX通用寄存器
AX=AH+AL H=high,L=low(高8位,低8位)
BX=BH+BL
CX=CH+CL
DX=DH+DL

8086cpu一次性可以处理两种尺寸的数据
字节型 8bit–8位寄存器
字型 2byte–16位寄存器
注意要确保数据与寄存器之间一定更要保持一致性

2、地址寄存器(包括段地址寄存器和偏移地址寄存器)
段地址寄存器
DS、ES、SS、CS
偏移地址寄存器
SP、BP、SI、DI、IP、BX

段地址x16(D) + 偏移地址 = 物理地址
段地址x16(D) = 基础地址
基础地址 + 偏移地址 = 物理地址

3、指令寄存器

指令和数据在内存中没有任何区别
8086cpu将cs * 10h+ip中的内容当作指令来执行
cs:代码段段地址
ip:下一条指令的地址
cs*10h+ip:下一条执行的指令所在的内存的地址

指令是有长度的,一条指令可以由多个字节构成

ds:数据的段地址寄存器
ds * 10h + [偏移地址]存放的内容就是数据

指令的执行过程

1、cpu从cs:ip所指向的内存单元中读取指令,存放到指令缓存器中
2、ip=ip+所读指令的长度,从而指向下一条指令
3、执行指令缓存器中的内容,回到步骤1

常用寄存器

EAX: 累加器
EBX: 基址寄存器
ECX: 计数器
EDX: 数据寄存器
ESI: 源变址寄存器
EDI: 目的变址寄存器
EBP: 扩展基址指针寄存器, 指向栈底
ESP: 栈指针寄存器, 指向栈顶
EIP: 指令指针寄存器

常用指令

push 将16位寄存器或者内存中的字型数据放到栈顶标记上面
pop 将栈顶标记所标识的字型数据放到16位寄存器或内存中
call:跳到位置执行代码,执行完成后返回此处
ret 从一个代码区域中退出到调用CALL的指令处

debug常用指令

u–>将内存中的机器指令翻译成汇编指令
d–>查看内存中的内容
r–>查看寄存器中的内容
r reg–>修改reg的值
a–>输入汇编指令
t–>执行当前cs:ip所指向的机器指令
e 地址–>修改内存中的内容

__________________________________________________________

OD(Ollydbg)初步

(以下内容来自bilibili)

常用快捷键
F2 设置断点
F9 运行
F8 单步跳过
F7 单步进入
F4 运行到选定位置,作用就是直接运行到光标所在位置处暂停
Ctrl+F9 执行到返回,此命令在执行到一个ret时暂停,常用来从系统部分返回到我们调式的程序部分

INT3断点(F2断点\CC断点)原理解析
方法:鼠标选中–>F2
原理:
1、替换指令,也就是换成int3指令
2、od检测到int3指令后会引发一个异常并且捕获它,这时程序就会中断
3、int3指令被删除掉,还原之前的代码
优点:可以无限下int3断点
缺点:很容易被检测

INT3断点的反调试与反反调试

反INT3调试原理

#include <windows.h>
int main(){
//得到FuncName函数地址给addr
FARPROC addr = GetProcAddress(LoadLibrary(L"user32.dll", "FuncName"));
//强转成byte
byte byteAddr = *(byte *)addr;
//int3断点会产生cc指令,判断是否为0xcc
if (byteAddr == 0xCC){
//反调试代码;
}
return 0;
}

反反int3调试:先找到函数,然后把断点下到函数的内部再重新调试

硬件断点原理(和调试寄存器有关,DR0~DR7)

DR0~DR3用来保存需要断点的地址
DR6:状态寄存器
DR7:控制寄存器

设置:鼠标选中右键–>断点–>硬件执行
查看:调试–>硬件断点
原理:
1、DR0~DR3用来保存需要断点的地址
2、DR7寄存器设置相对应的控制器
3、当程序运行到这个地址的时候,cpu向od发出异常信息,然后程序中断,等待用户操作
优点:速度快(在寄存器中)、不容易被检测
缺点:最多四个硬件断点

内存断点原理 (根据内存属性来实现)
设置: 选中对应地址的数据选中后右键–>断点
原理:
1、对这个地址设置不可读、不可写、不可执行属性
2、当程序运行到这里后会产生异常并抛给od
3、od捕获异常、程序中断


举报

相关推荐

0 条评论