逆向工程入门

第一天:

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]  //

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

煎饼果子小鸢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值