逆向五天PPT学习

逆向五天PPT
# 高级汇编语言讲解


## 汇编语言概述


## 数据的表示及类型
1.计算机系统内部采用二进制表示*数值数据*,也采用二进制编码表示*非数值数据*和*指令*。这也是很多漏洞产生的根本原因。(如一段数据和一句指令的二进制信息或许相同)
2.存储器的容量是以字节为最小单位来计算的 1字节即1B(Byte,8bit组成一个Byte)。
3.2个字节组成一个字,最低位称为第0位。两个字组成一个双字。


## 汇编程序开发调试方法
1.汇编语言编写的源文件从写出到执行主要包括的三步:
    0x00编写汇编源程序
    0x01对源程序进行编译masm、链接link
    0x02执行可可执行文件中的程序
2.汇编代码调试:在Terminal中执行*debug filename.exe*
    -r  查看、改变寄存器内容
    -d  查看内存中的内容
    -u  将内存中的机器指令翻译成汇编指令
    
## 寄存器讲解
1.寄存器分类:
    8086CPU有14个寄存器,大致可分为三类:
        通用寄存器、控制寄存器、段寄存器。
            通用寄存器又可分为:数据寄存器、指针寄存器、变址寄存器。
### 寄存器分类
 ![](media/15121767836944/15121798280833.jpg)


### 通用寄存器
   ![](media/15121767836944/15121809973577.jpg)


### 段寄存器
8086CPU依赖其内部的四个段寄存器实现寻址1M字节物理地址空间。
8086把1M字节地址空间划分为若干逻辑段,当前使用段的段值存放在段寄存器中。
    表示方法:   段值:偏移
    计算方法: 物理地址 = 段值*16 + 偏移
同时使用四个段,每个段有各自分工
    ![](media/15121767836944/15121815452327.jpg)


### 标志寄存器
8086CPU有个16位的标志寄存器,包含了9个标志,主要用于反映*处理器的状态*和*运算结果的某些特征*(大小??)。
**标志寄存器分为两类**


标志类别       | 寄存器                                   |用途
-------      | -------                               | -------
运算结果标志 | OF、SF、ZF、AF、PF、CF      | 主要受加减运算和逻辑运算结果的影响
状态控制标志 | DF、IF、TF                            | 不受运算结果的影响


  ![](media/15121767836944/15121833601820.jpg)


## 寻址方式讲解


## 指令系统讲解
指令格式:
    [标号:] 指令助记符 [操作数1[,操作数2]] [;注释]
8086的指令系统可以分为6个功能组:
数据传递、算数运算、逻辑运算、串操作、程序控制、处理器控制。
1.数据传递指令:
    格式: MOV DST,SRC
        将操作数2的 值 传递给操作数1,用于寄存器、存储器、数、的传递。
    格式: XCHG OPRD1,OPRD2
        交换两操作数内容,操作素同时是字节或字。
    格式: LEA REG,OPRD
        将操作数OPRD的 有效地址 传递到操作数REG。
2.堆栈操作指令
    堆栈是一段RAM区域。称为栈底的一段地址较大,栈顶地址较小。
    堆栈的段值在堆栈段寄存器SS中,堆栈指针寄存器SP始终指向栈顶。
    堆栈操作遵循“先进后出”原则,数据操作都在栈顶进行。
    格式: PUSH SRC
        将操作数SRC压入堆栈。现将堆栈指针寄存器SP的值减二,再将操作数压入SP所指栈顶。
    格式: POP DST 
        弹出 一个字 数据至目的操作数DST,SP值加二。
3.加减乘除运算指令
    格式: ADD OPRD1,OPRD2
        此指令完成两个操作数相加,并将结果送至目的操作数OPRD1。
    格式: SUB OPRD1,OPRD2
        此指令完成OPRD1减去OPRD2,并将结果返回至操作数OPRD1.
    格式: INC OPRD
        此指令完成对操作数OPRD加一,并将结果返回至OPRD。
    格式: DEC OPRD
        此指令完成对OPRD减一,并将结果返回至OPRD。
    格式: CMP OPRD1,OPRD2
        比较指令完成OPRD1减去OPRD2,运算结果不返回至OPRD1,但影响标志CF、AF、SF、OF、
    AF、PF。
    格式: MUL OPRD
        无符号数乘法指令完成操作数OPRD与AL或AX的无符号乘法操作。
    格式: IMUL PORD
        有符号乘法指令,与上同。
    格式: DLV OPRD
        无符号除法指令完成AX或DX除以操作数OPRD的无符号除法操作
    格式: IDLV OPRD
        有符号除法指令,与上同。除数为0时,引发0号中断。
    格式: CBW
        字节转换为字指令,把寄存器AL中的符号扩展到寄存器AH中。
    格式: CWD
        字转换为双字指令,把寄存器AX中的符号扩展到寄存器DX中。
4.逻辑运算和移位指令
    格式: NOT OPRD
        否操作指令将操作数取反,然后送回至OPRD。
    格式: AND OPRD1,OPRD2
        与操作指令将两个操作数进行按位的逻辑“与”运算,结果返回到目的操作数OPRD1。
    OR OPRD1,OPRD2
    XOR OPRD1,OPRD2
    TEST OPRD1,OPRD2(AND,无返回,仅影响标志)
    移位指令
    循环(移位)指令
5.转移指令
    格式: JMP 标号  (JMP NEXT)
        无条件段内直接转移指令 使控制无条件的转移至标号处。
    格式: JMP OPRD
        无条件段内间接转移指令 使控制无条件地转移到由操作数OPRD的内容给定的目标地址处。
    JMP FAR PTR
    JMP OPRD
    条件转移指令:根据某标志位或标志位的逻辑运算来判别条件是否成立。条件成立则转移,否则继续执行。通常在条件转移指令之前,总有用于条件判决的有关指令,例如CMP、TEST。
    JZ标号
    JE标号
    JNZ标号
    JNE标号
    JL标号
    JNGE标号
    JBE标号
    JNA标号
    循环指令:
        LOOP 标号  计数循环指令,使寄存器CX的值减一,结果不等于0则转移到标号
        LOOPE/LOOPZ 标号
        LOOPNE/LOOPNZ 标号
        JCXZ 标号  跳转指令,当寄存器CX的值等于0时跳转到标号。


## 子程序设计    
如果某个程序片段将反复在程序中出现,那么就把它设计成子程序。

![](media/15121767836944/15121998206744.jpg)


-------
*CALL*和*RET*都是转移指令,它们都修改IP,或同时修改CS和IP,通常被用来实现子程序的设计。
-------
CALL和RET指令共同支持了汇编语言中的模块化设计,模块化设计可以实现多个相互联系功能独立的子程序来解决复杂问题。
-------
CALL指令的四种调用模式
SET指令的四种执行模式
### 特殊的子程序调用---中断
8086CPU在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊信息我们称其为中断信息。
中断的意思是指CPU不再接着向下执行,而是转去处理中断信息
-------
CPU内部出现四种事件时将产生相应的中断信息:
    除法错误、单步执行、执行INTO指令、执行INT指令。
中断源是指产生中断信息的事件。标示中断源的数据称为中断类型码。
    除法错误:0
    单步执行:1
    执行INTO指令:4
    执行INT指令:指令格式为int n,其中n为中断类型码
    用于处理中断信息的程序被称为 中断处理程序 ,中断类型码的作用就是用来定位中断处理程序。
用*IRET*指令返回返回程序进入中段前的位置,通常用于中断处理程序末尾。


### 疑问

阅读更多
文章标签: 汇编一点点
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭