第一天:
1.8086入门
2.win32汇编
使用工具:ollyDbg
第一个windows项目,利用函数定位主函数。
pdb文件:在编译的时候会自动生成,反汇编工具会读取里面的东西。
常用命令:
F2:设置断点
F8:单步步过,单步执行,不进入函数里面。
F7:单步步入,单步执行,进入函数里面。
F4:运行到选定位置。
F9:运行。
c++代码内嵌汇编
内嵌汇编:__asm mov aaa,0x778899
所见即所得,加上__asm即可。
二:函数调用的反汇编形式
1.函数与call(OD分析代码将函数(子程序)分块)
c/c++函数调用翻译成汇编相当于call(子程序)调用)
2.关闭c/c++优化(若不关闭,则代码难以读懂)
项目属性配置-》c/c++-》优化-》禁用/od
第二天
eax 32位
ax 16位
ah 8位
al 8位
od command命令行 看内存
dd ebp+4 查看地址存的值。(dd,dw,db)
od命令行看寄存器
?eax
?ax,?ah 查看寄存器里面的值。
?ebp-8 查看ebp-8的地址。
MOVSX和MOVZX
movsx:符号扩展传送
movzx:零扩展传送
1. movsx 操作数A,操作数B
movzx 操作数A,操作数B
相同点:操作数B所在空间必须小于操作数A
LEA指令
lea指令格式
有效的地址传送指令lea
格式:lea 操作数A,操作数B
功能:将操作数B的有效抵制传送到制定的某个寄存器,操作数A必须是寄存器(32位系统 就 是32位)
OD使用小结
1.od调试
重新开始:ctrl+f2
转到地址:ctrl+g
断点切换:F2
断点窗口:alt+B
运行:f9
暂停:f12
单步步过:f8遇到call跳过
单步步入:f7遇到call进入
运行到指定位置:f4
反汇编窗口中跟随:回车键enter
跟随:回车键enter 进入某个地址
2.右键菜单 -goto
+号:转到下一步
-号:转到上一步
*号:转到当前指令地址
3.命令栏指令
bp 下断点
bc 清楚断点
dd 以双字方式显示数据
dw 以字方式显示数据
db 以字节方式显示数据
dc 以字符方式显示数据
? 计算表达式的值
4.od修改汇编代码
选中汇编指令,按下空格后,直接输入汇编代码
汇编减法指令sub
1.sub指令(substract)
格式:sub 操作数A,操作数B A=A-B
功能:两个操作数相减,即从A中减去B,其结果放在A中。
ZF零标志位:若当前当前的运算结果为零,zf等于1,否则为0。
注意:sub指令影响zf标志位。
2.cmp和转移指令
1.比较指令cmp
格式:cmp 操作数A,操作数B
功能:两个操作数的相减,即从A中减去B,其结果会影响标志位,对标志位的影响与sub指令相同。cmp指令主要是用于配合转移指令使用,如jz/je 当zf=1时跳转
2.等于条件转移指令je/jz
格式:je/jz 标号 //等于跳转
功能:zf=1,跳转到指定地址执行。
说明:
(1)je与jz等价,他们是根据标志位zf进制转移的指令
(2)je,jz均为一条指令的两种助记符表示方法。
第三天
3.不等于转移指令jne/jnz
(1)jne/jnz功能
条件转移指令jne/jnz //不等于转移
格式:jnz/jne 标号
功能:zf=0,转移至标号地址处执行。
1. if(a==b) jne/jnz
{
a=b;}
a=2*b;
4.无条件跳转指令jmp和goto指令
(1)goto与jmp
无条件跳转指令
格式:jmp A
(2)其中A为转移的目标地址,程序转移到目的地址所指向的指令继续往下执行。
(3)本组指令对标志位无影响。
5.有符号小于/不大于等于转移指令jl/jnge
格式:jl/jnge 标号地址
功能:小于/不大于等于 时转移到标号地址
jl 有符号 小于 则跳转(jump if less)
jnge 有符号 不大于等于 则跳转(jump if not greater or equal)
sf=1;符号位标志为1 则跳转到标号地址执行(结果为负数)
jump 跳转/转移
not 不
zero 0
less 小于
greater 大于
if(a>b)//jl/jnge
{printf(“do a>=b);}
printf("do a<b/n");
6程序状态字寄存器psw
1.cf进位标志位
当执行一个加法(减法)运算时,最高位产生进位(或借位时),cf为1,否则为0。
2.zf零标志位
若当前的运算结果为零,则zf等于1,否则为0
3.sf符号标志位
该标志位于运算结果的最高位相同。即运算结果为负,则sf为1,否则为0。
4.of溢出标志位
若运算结果超出机器能够表示的范围称为溢出,此时of为1,否则为0。
判断是否溢出的方式是:
进行二进制运算时,最高位的进位与次高位的进位值进行异或运算。若运算结果为1表示溢出of为1,否则of为0;
三条原则:
同号相加异号相减才会发生溢出
同号相加的符号与参与运算的符号不同就溢出
异号相减结果的符号位与被减数的符号位不同就产生溢出
5.pf奇偶标志
当运算结果的最低16位中含1的个数为偶数则pf为1,否则pf为0
6.af辅助进位标志
一个加法(减法)运算结果的低四位向高四位有进位(或借位)时af为1,否则af为0
7.tf跟踪标志
该标志位为方便程序调试而设置。若tf等于一则运行中断,否则禁止中断。
8.if中断标志位
该标志位用来控制cpu是否响应可屏蔽中断。若if🟰1则运行中断,否则禁止中断。
9.df方向标志
该标志用来控制串处理指令的处理方向。若df等于1则串处理过程中自动递减,否则自动递增。
第三天
1.sto至st7
80位两用寄存器
MMX FPU
2.浮点指令
1.FLD类似于 PUSH指令
2.FSTP类似于 POP指令
3.FADD类似于 ADD指令
格式
fadd memvar //st0=st0+memvar
4.FSUB类似于 SUB指令
格式
fsub memvar //st0=st0+memvar
5.FMUL 乘法指令
格式
fmul memvar //st0=st0*memvar
6.FFIV 除法指令
格式
FDIV memvar //st0=st0/memvar
7.FILD
整数入栈指令
FILD memvar //st0=(double)memvar
8.cvttsd2si 浮点转整数指令
cvttsd2si r32,st0/m32
运用截断处理将st0/m32中的一个单精度浮点值转换成r32中的一个有符号的双字整数。
and esp,FFFF FFF8(优化对齐)
fld dword ptr [1312108] //float 8.786000
fstp dword ptr [local.1]//float f=8.786f
fld dword ptr[local.1] //float 8.786000
fadd qword ptr[1312100] //float 1.0000 0000 0000 000
fstp dword ptr[local.1] //