《逆向分析实战》1.1

1.OD界面的熟悉

左上为反汇编窗口,用于显示 反汇编代码,调试分析程序主要在这个窗口中进行。

左中为信息提示窗口,用于显示与反汇编窗口中上下文环境相关的内存,寄存器或者跳转来源,调用来源等信息。

左下为数据窗口,用于以多种格式显示内存中的内容,可使用的格式有hex,文本,短型,长型,浮点,地址和反汇编等。

右上为寄存器窗口,用于显示各个寄存器的内容,包括通用寄存器,段寄存器,标志寄存器,浮点寄存器,右键可选择MMX寄存器,3DNow!寄存器和调试寄存器

右下为栈窗口,用于显示栈内容,栈帧,即ESP或EBP寄存器指向的地址部分。

最下为命令窗口,用于输入命令以简化调试分析。

2.对数据的理解

最基本的是一个字节占8位,一个字占16位。hex数据不是按最基本的情况显示,一个字节占两列。db表示字节类型,dw表示字类型,dd表示双字类型,表示数值的时候,h结尾的表示16进制,b结尾的表示二进制,无修饰的表示十进制。

定义w1=5566h,w2=7788h,但是在内存中会显示为6655与8877.主机采用的是小尾方式存储数据,数据的低位存放在内存的低地址中,数据高位存放在内存高地址中,因此低位存放66,高位存放55,在内存看时是相反的。当在数据窗口中选择数据时,右键的菜单提供编辑,赋值,查找,断点等功能。

命令窗口输出db/dw/dd+address,可改变数据窗口的显示方式。(按字节或者字或者双字)。

3.x86汇编语言介绍

逆向入门的目标,掌握80x86的常用指令,寄存器的用法,堆栈的概念和数据在内存中的存储。

寄存器用来存放程序运行中的各种信息,包括操作数地址,操作数,运算的中间结果。

CPU的工作模式分为实模式与保护模式,前者较早期,可以直接访问硬件,现在的CPU仍然支持实模式,为了兼容以及X86的架构处理器都是从实模式引导过来的。

寄存器register是CPU内部用于高速存储数据的小型存储单元,访问速度比内存快很多,但两者都是用来存储数据的。(价格 寄存器>内存>硬盘)CPU访问内存中的数据是时会有一个寻址的过程,因此访问内存时间更长。而寄存器时集成在CPU内部的,数量少而且具有独立的名字,因此访问速度非常快。

X86寄存器中,逆向相关的有基本寄存器,调试寄存器与控制寄存器。基本寄存器分为8个通用寄存器,6个段寄存器,1个指令指针寄存器和1个标志寄存器。

通用寄存器用于数据的传输与各种运算。32位通用寄存器包括4个数据寄存器,EAX,EBX,ECX,EDX(每个寄存器都可以当作一个32位,16位AX或8位AH对应高八位与AL对应低八位的存储单元来用)。32位标志寄存器EFLAGS,32位指令指针寄存器EIP(可按照32位与16位进行使用,低16位表示为SI来存储16位的指针),16位段寄存器CS,SS,DS,ES,FS,GS。

关于8个通用寄存器的解释:

EAX为累加器,在乘法与除法指令中被自动使用。EBX为基址寄存器,DS段中的数据指针。ECX为计数器,在字符串和循环操作中常用,在循环指令和串操作时,ECX用来循环计数。每执行一次循环,ECX被CPU自动减一。EDX为数据寄存器。这四个寄存器主要用在算术运算与逻辑运算指令中,用来保存各种需要计算的值。

EBP为扩展基址指针寄存器,SS段中堆栈内数据指针。EBP由高级语言用来 引用参数与局部变量,亦称为堆栈基址指针寄存器。ESP为堆栈指针寄存器,SS中堆栈指针。ESP用来 寻址堆栈上的数据,一般不参与运算。ESI为源变址寄存器,字符串操作源指针。EDI为目的变址寄存器,字符串操作目标指针。后两者常用于内存数据的传递。ESI与EDI与特定的指令LODS,STOS,REP,MOVS一起使用,主要用于内存中数据的复制。ESP指示堆栈区域的栈顶地址,PUSH,POH,CALL,RET直接操作该指针。EBP表示堆栈区域的基地址。

EIP寄存器保存着下一条要执行的指令的地址,程序运行时,CPU会读取EIP中的一条指令的地址,传送指令到指令缓冲区后,EIP寄存器的值自动加上读取指令的字节大小。即下一条指令的地址是当前指令地址加上当前指令长度。CPU每运行完一条指令,就会通过EIP寄存器读取下一条指令给CPU。转移指令 会改变EIP的值,使CPU跳跃性执行,从而构成分支与循环的程序结构。EIP寄存器的值在程序中无法直接修改,只能通过影响EIP的指令或者中断,异常来影响。EIP中的值始终引导CPU的执行。

段寄存器用于存放段的基地址,段是一块预分配的内存区域。CS代码段,DS数据段,SS堆栈段,ES(FS和GS)附加数据段。在逆向中常用到FS寄存器,用于存储SEH,TEB,PEB等重要的操作系统数据结构。

标志寄存器FLAGS,15~0

条件标志寄存器:

  1. OF,11,OverFlow Flag。溢出标志位,反映有符号数加减法运算所得结果是否溢出。超过当前运算位数表达范围称为溢出,标志位被置1,否则为0。
  2. SF,7,Sign Flag,符号标志位,反映运算结果的符号位。运算结果为负时为1,为正时为0.
  3. ZF,6,0标志位,运算结果为0该位置为1,否则为0.
  4. AF,4,Auxiliary carry flag,辅助进位标志位,在字操作时,发生低字节向高字节进位或借位时该位置为1,否则为0.字节操作要求低4位向高4位。
  5. PF,2,Parity Flag,奇偶标志位,反映结果中1个数的奇偶性。偶数置1
  6. CF,0,Carry Flag,进位标志位,运算结果最高位产生了一个进位或者借位,该位置1。

控制标志寄存器:

  1. DF,10,Direction Flag,
  2. IF,9,Interrupt Flag,
  3. TF,8,Trap flag,

以上都是常用的标志位,要掌握标志位每一位的作用和标志位在第几位。

OD中认识寄存器

在调试的过程中,寄存器的值在发生改变时会变为红色,未发生改变时为黑色。双击,右键显示菜单可修改,复制寄存器的值。

猜你喜欢

转载自www.cnblogs.com/qywcysry/p/9820997.html