OllyICE反汇编教程及汇编命令详解
- 格式:doc
- 大小:81.00 KB
- 文档页数:15
OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。
同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。
启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。
在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个 UDD 目录不清楚。
反汇编入门经典教程-CAL-FENGHAI.-(YICAI)-Company One1反汇编入门教程仅以此文来描述如何反汇编一个EXE程序,这里采用的是静态反汇编,也就是先把整个程序全部反汇编成汇编语言后进行修改,这个例子很简单,首先是我从看雪论坛上下载到的一个程序然后我们使用打开它,可以看到这个EXE程序在反编译以后的内容双击正式启动这个程序,随便输入注册码123,点击C HECK这里可以看到程序在输入错误后提示的内容然后我们使用"串式数据参考",找到这个字符串的位置这个位置如下可以看到在我程序的0040段,15B9这个偏移地址下程序输出了这个字符串,然后我们考虑一下,程序在我输入了错误的注册码,并且点击了CHECK以后,弹出了这个字符串,我们向上找,应该可以找到一个跳转,类似JE,JNE,JMP之类的东西,跳转到此处,位置如下可以看到在偏移地址15AB下有一个入口,注意R EFERENCED BY .....这句,是说"有人从这里插队了"到底是谁"插队"到这里了呢,是00401595这个代码.现在我们跳转到这个位置去追踪它输入00401595可以看到是个JNE(不等跳转),我们只要把这个JNE改成JE就可以了使用HIEW打开这个程序打开以后看到一堆乱码,这是因为它是用文本方式打开了一个EXE程序这里我们按F4,选择DECODE(反汇编)模式这回看到的就都是机器码了然后按F5,输入1595(刚才我们找到的那个语句地址),找到那个位置就是这个7516的JNE命令,我们要把它改成JE,这里直接把7516这个机器码修改成7416按F3进入编辑模式然后按F9保存这回再次打开修改后的程序,重新输入123,可以看到CRACK后的结果是完成!反汇编反汇编:把目标代码转为汇编代码的过程,也可说是把编程语言转为汇编语言代码,低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机。
反汇编入门经典教程反汇编是一种通过逆向工程将机器码转换为可读的汇编代码的过程。
它是了解程序内部工作原理、检测和修复软件漏洞、进行逆向工程等任务的重要工具。
以下是一个反汇编入门经典教程。
第一步:安装反汇编工具要进行反汇编,您需要一个适当的反汇编工具。
一些常用的反汇编工具包括IDA Pro、OllyDbg和Ghidra。
选择其中一个工具,并按照其官方指南安装和配置。
第二步:了解基础知识在开始反汇编之前,您需要掌握一些基础知识。
首先了解汇编语言的基本概念,如寄存器、指令、内存等。
还应该了解不同的汇编指令以及它们的功能和用法。
您可以通过阅读相关的教程和文档来学习这些知识。
第三步:打开目标程序使用反汇编工具打开您要分析的目标程序。
您可以选择一个已编译的可执行文件或者一个在内存中运行的进程。
请确保您具有对该文件或进程的合法访问权限。
第四步:分析代码一旦您打开了目标程序,您将看到程序的汇编代码。
您可以使用工具提供的各种功能来分析代码。
以下是一些基本的分析技巧:1.寻找入口点:在大型程序中,找到程序的入口点是一个重要的第一步。
入口点通常是程序启动时执行的第一条指令。
2.跟踪程序流程:使用调试器功能可以帮助您了解程序的执行流程。
您可以设置断点,在执行到断点时暂停程序并检查寄存器和内存的值。
3.理解函数调用:函数调用是程序执行流程的重要部分。
您可以查看函数调用的汇编指令,并分析参数传递、返回值和栈操作等信息。
4.检查条件和跳转:程序中的条件和跳转指令对于控制程序流程起着重要作用。
您可以跟踪这些指令,以了解程序在不同情况下的执行路径。
第五步:理解代码功能一旦您分析了程序的汇编代码,您将能够了解程序的功能和工作原理。
您可以通过查看函数、变量和各种数据结构的命名来获得有关代码的更多上下文信息。
理解代码的功能将有助于您进行进一步的分析和调试。
第六步:修改代码在一些情况下,您可能希望修改程序的汇编代码。
例如,您可能希望修复一个软件漏洞或者修改程序的行为。
OllyICE反汇编教程及汇编命令详解常用汇编命令大全一、常用指令1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里 )XLAT 字节查表转换.BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ESDI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FSD.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GSDI. LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SSDI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)。
OLLYDBG汇编指令OllyDbg是一款在Windows平台上广泛使用的调试器,主要用于逆向工程和漏洞分析。
在使用OllyDbg进行反汇编和调试时,掌握常见的汇编指令是至关重要的。
以下是一些常见的x86汇编指令以及它们在OllyDbg中的使用和解释。
1.MOV - 数据传送指令assemblyMOV destination, source描述:用于将源操作数的内容传送到目标操作数中。
示例:assemblyMOV EAX, DWORD PTR DS:[ESI]将DS段中ESI偏移处的32位数据传送到EAX寄存器。
2.ADD - 加法指令assemblyADD destination, source描述:将源操作数的值加到目标操作数上。
示例:assemblyADD ECX, 5将ECX寄存器的值加上5。
3.SUB - 减法指令assemblySUB destination, source描述:从目标操作数中减去源操作数的值。
示例:SUB EDX, 10将EDX寄存器的值减去10。
4.CMP - 比较指令assemblyCMP operand1, operand2描述:比较两个操作数的值,但不修改它们。
示例:assemblyCMP EAX, EBX比较EAX和EBX的值。
5.JMP - 无条件跳转指令assemblyJMP destination描述:无条件跳转到指定的目标地址。
示例:assemblyJMP 0x401000无条件跳转到地址0x401000。
6.JE/JZ - 条件跳转指令assemblyJE destination描述:如果前一次比较为相等,则跳转到指定的目标地址。
示例:assemblyJE 0x401000如果上一次比较相等,就跳转到地址。
7.CALL - 调用指令assemblyCALL destination描述:调用指定地址处的函数或子程序。
示例:assemblyCALL 0x401020调用地址0x401020处的函数。
OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。
同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。
启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。
在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个 UDD 目录不清楚。
初识exe程序反汇编小感[转]本文出自“空中的鱼” 博客,出处/358752/264819近期由于一个项目的需要,我初步接触了exe程序反汇编。
折腾了好几天终于见到了那个程序中急需的算法的真面目了。
回顾整个过程,小有感悟。
为记念初识程序反汇编的心路历程,特记录下对程序反汇编过程的粗浅感受。
一、工作环境:1、查壳工具:PEiD(用于初步确定exe程序是否加壳以及使用何种开发软件编写);2、反编译工具:DeDe(经过查壳工具检查,将要被反汇编的程序是用“BorlandC++ 1999”编写的,所以选用专门反编译Delphi程序的DeDe;用于初步确定程序模块、函数方法划分对应exe程序相应汇编指令地址的位置);3、反汇编动态调试工具:OllyICE(即,OD;用于动态反汇编调试程序的相关代码逻辑);4、开发环境: 2005;5、其他工具:EditPlus、记事本、计算器等若干;二、基础知识:1、汇编程序设计:主要深入了解程序数据存放、堆栈使用、子程序调用等技巧;不同类型数据的地址跳转规则(一般都是跳转该类型长度个位置);2、c++程序设计:基本语法结构;指针、数据类型的使用和控制;3、相关工具软件的基本使用方法;三、工作过程:我的反汇编大概过程是:查壳->脱壳、判断开发程序使用的环境->反编译->初步定位主要功能模块或函数的汇编指令起始、终止地址->反汇编准备->查找程序中的特征字符串或特征值,进一步确定需要反汇编的代码逻辑的位置->开始反汇编调试运行,分析需要反汇编的代码逻辑的具体过程->将分析出来的逻辑流程使用c++语言实现。
1、查壳:运行PeiD,打开要反汇编的exe程序,在这里姑且称之为:test.exe吧。
如示意图1:“多项扫描”上面那行“Microsoft Visual C++ 7.0 Dll Method 3”就是该程序的开发环境了。
接下来电击窗口右下角的“>>”按钮,再来看看该程序是否加壳,如示意图2:分别点击“熵值”、“EP校验”、“快速校验”这三行最右侧的“-”按钮,就可以看到是否加壳的提示了。
汇编教程汇编指令详解
汇编语言可以说是机器语言的一种直观形式,是与硬件直接相关的低
级程序设计语言。
它是一种以简洁的汇编指令来表达操作码机器指令的程
序设计语言,汇编语言的指令代码一般比机器语言的指令代码要短,是编
写高效、可移植的机器级程序的理想语言。
汇编语言的基本构成:
(1)指令集:汇编语言的指令集是机器的最基本和最重要的组成部分,也是机器的指令集,描述了机器所做的操作。
(2)操作数:汇编语言的指令集中涉及到的操作数有多种,比如寄
存器操作数、立即数、内存操作数等。
(3)运算和转移指令:汇编语言中的运算和转移指令包括算术运算
指令、比较指令、逻辑运算指令、移位指令等,它们是机器执行的基本操作。
(4)转移指令:汇编语言中的转移指令可以改变机器指令的执行顺序,并实现分支程序设计。
(5)I/O指令:汇编语言中的I/O指令可以实现与外部设备的通信,获取外部设备提供的数据。
(6)汇编指令:汇编指令用于移植各种汇编程序到不同的处理器上,从而实现程序的机器无关性。
一、MOV指令:
MOV指令用于把操作数的值赋给另一个操作数。
——啊冲第二节常用汇编指令说明:汇编语言也是一门语言,其指令相当的多,非常丰富,在此我只介绍几个常用的、简单的汇编指令,让大家与我一同入门。
其实在超多的计算机知识领域里我和大家一样只是个学生而已。
所以,我所要求的同学级别(本视频所针对的对象)是:有一点编程经验,对反汇编感兴趣、零基础的朋友。
堆栈操作指令PUSH和POP•格式: PUSH XXXX•POP XXXX•功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令.•加减法操作add和sub指令•格式: ADD XXXX1,XXXX2•功能: 两数相加•格式: SUB XXXX1,XXXXX2•功能: 两个操作数的相减,即从OPRD1中减去OPRD2,其结果放在OPDR1中.调用和返回函数CALL和RET(RETN)•过程调用指令CALL•格式: CALL XXXX•功能: 过程调用指令•返回指令RET•格式: RET•功能: 当调用的过程结束后实现从过程返回至原调用程序的下一条指令,本指令不影响标志位.•数据传送MOV 格式: MOV XXXX1,XXXX2•功能: 本指令将一个源操作数送到目的操作数中,即XXXX1<--XXXX2.•逻辑异或运算XOR•格式: XOR OPRD1,OPRD2•功能: 实现两个操作数按位‘异或’运算,结果送至目的操作数中.•逻辑或指令OR•格式: OR OPRD1,OPRD2•功能: OR指令完成对两个操作数按位的‘或’运算,结果送至目的操作数中,本指令可以进行字节或字的‘或’运算.有效地址传送指令LEA•格式: LEA OPRD1,OPRD2•功能: 将源操作数给出的有效地址传送到指定的的寄存器中.•实际上,有时候lea用来做mov同样的事情,比如赋值:•Lea edi,[ebp-0cch]•字符串存储指令STOS•格式: STOS OPRD•功能: 把AL(字节)或AX(字)中的数据存储到DI为目的串地址指针所寻址的存储器单元中去.指针DI将根据DF的值进行自动调整.•说明:在VC的DEBUG版里经常用来为局部变量空间写上cccccccc指令•比效指令CMP(CoMPare)•格式: CMP OPRD1,OPRD2•功能: 对两数进行相减,进行比较.•说明:经常与跳转指令相配合来形成循环或跳出操作•跳转指令JXX•JMP:无条件转移指令•JG/JNLE: 大于/不小于等于时转移•JL/JNGE: 小于/不大于等于时转移•JGE/JNL: 大于等于/不小于时转移•JLE/JNG:小于等于/不大于时转移•JE/JZ :等于时转移要求:对常见的汇编指令要达到熟悉,不常见的汇编指令也要有所了解(后附汇编指令表)每日一荐:我常去的两个论坛(原版视频下载)/编程爱好者的交流园地—广海/辅导教师---郁金香附:8088汇编指令表一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSW AP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个**作数为寄存器,段寄存器不可作为**作数) CMPXCHG 比较并交换**作数.( 第二个**作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个**作数里)XLAT 字节查表转换.──BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两**作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.两者相等为0,不等为1.NOT 取反.TEST 测试.(两**作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用**作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复**作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较**作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.就是搜索目标字符,只到找等或者串结束才退出比较ax/al 搜索数据es:di 目标串cx 串长度df 方向标志可以根据退出时的ZF位判断,是否在目标中REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空**作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.。
反汇编入门教程(适合新手看)一、反汇编基础知识1.反汇编的目的反汇编的目的在于研究和修改程序代码。
将二进制代码转换为汇编代码后,我们可以理解程序的操作和逻辑,更容易进行代码分析和修改。
2.反汇编的工具常用的反汇编工具有IDAPro,0llyDbg等。
它们可以在不运行程序的情况下分析程序的代码,帮助我们理解程序的逻辑和结构。
3.反汇编的方法反汇编可以分为静态反汇编和动态反汇编两种方法。
静态反汇编是通过分析二进制文件进行反汇编,而动态反汇编则是基于程序运行时的反汇编。
两种方法各有优缺点,需要根据实际情况选择合适的方法。
二、反汇编的入门流程反汇编需要一定的汇编和计算机基础知识,下面是反汇编的入门流程:1.准备工作首先需要安装反汇编工具,如IDAPro软件,并准备一份需要分析的程序。
2.打开程序打开需要分析的程序,可以用IDAPro软件进行打开。
在打开程序时,选择正确的文件格式和架构,以便正确解析二进制代码。
3.分析程序打开程序后,就可以对程序进行分析。
首先是可执行文件的头部分析,这一部分包括程序入口点,文件大小等信息。
然后是代码分杉逐段分析程序,查找代码中有用的信息。
4.反汇编代码在分析程序代码后,就可以使用反汇编工具将代码转换为汇编代码并进一步分析代码逻辑和结构。
在IDAPro软件中,选择需要反汇编的代码段,然后点击反汇编按钮即可。
5.理解代码反汇编后,我们需要理解汇编代码的含义和逻辑,以便进一步分析代码和修改程序。
这需要一定的汇编和计算机基础知识。
三、反汇编常用技巧1.查找字符串和函数反汇编时,可以根据关键字查找字符串和函数。
在IDAPro软件中使用搜索功能进行查找,可以快速定位到对应的代码段。
2.重命名变量和函数反汇编时,如果代码中的变量或函数名称不具有可读性,可以使用重命名功能对它们进行重命名。
在IDAPro软件中,可以选定代码段,然后使用重命名功能进行重命名。
3.调试程序反汇编时,可以使用调试功能来检查程序的行为和操作。
汇编教程汇编指令详解汇编语言是一种底层的计算机语言,通过使用汇编指令对计算机进行编程。
本文将对汇编指令进行详细解释,帮助读者理解和使用汇编语言。
1.数据传送指令:数据传送指令用于将数据从一个位置传送到另一个位置。
例如,MOV指令可以将数据从一个寄存器移动到另一个寄存器,或从存储器中读取数据并将其移动到寄存器中。
2.算术运算指令:算术运算指令用于执行各种算术运算,如加法、减法、乘法和除法。
例如,ADD指令可以将两个操作数相加,而MUL指令可以将两个操作数相乘。
3.逻辑运算指令:逻辑运算指令用于执行逻辑运算,如与、或、非和异或。
例如,AND指令可以对两个操作数执行按位与运算,而OR指令可以对两个操作数执行按位或运算。
4.控制转移指令:控制转移指令用于在程序执行过程中改变控制流。
例如,JMP指令可以无条件地将程序跳转到指定的地址,而条件分支指令(如JE、JNE等)可以根据特定的条件决定是否跳转。
5.程序调用指令:程序调用指令用于调用子程序。
例如,CALL指令可以将控制交给一个子程序,并在子程序执行完后返回到调用点。
6.中断指令:中断指令用于触发计算机的中断处理程序。
例如,INT 指令可以使计算机执行与指定中断向量相关联的中断处理程序。
7.输入输出指令:输入输出指令用于与计算机的外部设备进行数据交换。
例如,IN指令可以从外部设备中读取数据,而OUT指令可以向外部设备发送数据。
除了上述常用的汇编指令外,不同的计算机体系结构可能还有其他特定的指令。
因此,在学习和使用汇编语言时,了解特定体系结构的指令集是很重要的。
此外,汇编语言还包括一些程序框架和编程技巧,如标号、注释、宏定义、条件编译等。
这些工具和技巧可用于简化和优化汇编程序的开发过程。
总结起来,汇编语言是一种底层的计算机语言,通过使用各种指令对计算机进行编程。
掌握和理解各种汇编指令对于编写高效和优化的汇编程序非常重要。
希望本文能够帮助读者更好地理解和使用汇编语言。
软件安全实验报告二零二零年使用OllyDBG实验环境:操作系统:Windows10Ollydbg调试简单的helloworld程序实验步骤:原理: OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,同时还支持插件扩展功能,是目前最强大的调试工具。
OllyDbg发行版是一个ZIP压缩包,只要解压运行OllyDbg.exe即可。
运行OllyDbg打开进程,界面主要由代码窗口、数据窗口、寄存器、堆栈窗口组成。
1.调试用VC++编写的helloworld程序,在反汇编代码中查找main 函数,MessageBox函数;#include "windows.h"#include "tchar.h"int _tmain(int argc, TCHAR * argv[]){MessageBox(NULL,"Hello World!","bcbobo21cn",MB_OK);return 0;}2.在调试工具条上右击,选择组建;在弹出的组建对话框中,选择 Win32 Release;把HelloWorld编译为release版本。
3.启动Ollydbg ;打开前面的helloworld程序;4.停留在00401020处;5.调试器停止的地点是EP代码,EP即入口点;再往下找找;6.再往下,看到了调用GetVersion函数,GetCommandLineA函数;获取命令行参数之后,应该就到main函数了;7.看到上面CALL 00401000;查看00401000;看到了VC程序中给出的参数;00401000处先PUSH了4个参数入栈,然后调用了USER32中的MessageBoxA;三、实验总结OllyDbg是3级调试工具,与当年的TRW2000(RING 0级调试工具)齐名,用的人很多。
OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个ZIP 压缩包,只要解压到一个目录下,运行OllyDBG.exe 就可以了。
汉化版的发布版本是个RAR 压缩包,同样只需解压到一个目录下运行OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的CPU 寄存器内容。
同样点击标签寄存器(FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG 就可以生效了。
启动后我们要把插件及UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把OllyDBG 解压在F:\OllyDBG 目录下,所以相应的UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。
在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个UDD 目录不清楚。
我这简单解释一下:这个UDD 目录的作用是保存你调试的工作。
第4章-汇编指令【安于此生译】之前的章节主要是理论知识,现在我们要在OllyDbg中实践一下,为后面打开基础。
OllyDbg中几乎所有的标志我都有考虑,如果你遇到了我没有给出的指令,你可以查阅更加全面的汇编指南。
NOP(无操作)运行这条指令不会对寄存器,内存以及堆栈造成任何影响,英文单词的意思是”无操作”,也就是说,它没有特殊的用途。
例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误,多余的空间将会被NOP填充。
适当数目的nop指令可以将其他指令完全替换掉。
下面使用OllyDbg重新载入CrueHead'а(CrackMe的作者)的CrackMe。
我们可以看到反汇编的源代码,如上图第一条指令是PUSH 0,占两个字节,在这条指令上面单击鼠标右键选择Assemble.或者直接使用快捷键-空格键,在弹出窗口的编辑框中输入NOP。
写入NOP指令后单击Assemble按钮。
这里我们可以看到OD设计的非常智能,考虑到PUSH指令占两个字节,OD会使用两条NOP指令进行替换,而不是使用一条NOP 进行替换。
现在,在原来PUSH 0的地方显示的两条NOP指令,单击F7,指令一条NOP指令,可以看到,这里只改变了EIP(保存了下一条要执行指令的地址)寄存器的值,并没有影响到其他寄存器,堆栈或者标志位。
现在我们需要在数据窗口查看这两个字节,它们的内存地址分别是401000和401001。
在数据窗口中,鼠标右键选择-“Go to”-“Expression”,输入你需要转到的地址。
这里我们需要输入401000。
红色突出显示的是刚刚修改过的字节。
前两个是90,然后E8,FF和04,00,00。
这是一个Call指令的所有剩余字节。
OD可以撤销我们修改的指令吗?呵呵,当然啦。
然后单击鼠标右键,选择“UNDO SELECTION”。
这样就恢复了原来的PUSH指令。
在数据窗口中的话,你就可以看到它原始的字节了。
OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。
汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。
简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。
用鼠标左键点击注释标签可以切换注释显示的方式。
寄存器窗口:显示当前所选线程的 CPU 寄存器内容。
同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。
信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。
数据窗口:显示内存或文件的内容。
右键菜单可用于切换显示方式。
堆栈窗口:显示当前线程的堆栈。
要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。
启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。
还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。
上图中其它的选项可以保留为默认,若有需要也可以自己修改。
修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。
在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。
有人可能知道插件的作用,但对那个 UDD 目录不清楚。
Ollydbg反汇编分析strcpy.exe的当输⼊16个字符会导致⽆限循环的缓冲区溢出漏洞strcpy.exe缓冲区溢出漏洞分析⼀:测试strcpy.exe的主函数1.利⽤IDA定位主函数2.测试程序运⾏结束前,栈顶寄存器的值(1) 当输⼊16个字符的时候,程序return前,主函数栈顶的值会变为401100。
(2) 当输⼊3个字符时,程序return前,当前栈顶的值为401135。
(3)发现当输⼊16个字符程序会循环执⾏的问题所在,是由于当前栈顶的值改变,导致程序⽆法终⽌运⾏,每⼀次都返回到00401100。
⽽程序会接着进⼊00401000(主函数的⼊⼝),所以程序会循环执⾏。
问题:是哪⼀步操作的失误导致栈内的值被修改?请往下看。
⼆:通过ollyice调试程序。
1.定位到主函数的第⼀条指令,时刻观察0019FF34 内的值,观察什么时候会被改变。
2.观察发现:执⾏完0040102B这条指令之后,0019FF34内的值被改变为00401100,⽽输⼊3个字符的正常程序该值不会被改变。
3.分析该条语句功能rep movs byte ptr es:[edi], byte ptr [esi]rep指令常和串传送指令搭配使⽤功能:根据ecx的值,重复执⾏后⾯的指令movs byte ptr es:[edi], byte ptr [esi]Movs:数据串传送指令把ds内地址为esi的⼀字节内容取到 es 内地址为 EDI 的地⽅。
通过分析语句功能发现是因为esi在内存中的内容为00的取值,导致401135的低⼀字节 35 被改为 00 变为 00401100。
问题:那为什么edi的值会变为主函数开始时寄存器的地址?请往下看(如下图)观察发现:当执⾏完00401024这条指令后,程序运⾏过程当中,我⼿动输⼊的16个字节数据从 0019FF24 到 0019FF30填满缓冲区,但是由于字符串末尾有”\0”,所以多移动⼀个字节,把00放到了主函数开始时堆栈段 0019FF34 的低字节处,导致00401135 变为 00401100。
OllyICE反汇编教程及汇编命令详解[转]2009-02-11 08:09OllyICE反汇编教程及汇编命令详解内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。
在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器段寄存器是根据内存分段的管理模式而设置的。
内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。
在每种方式下,段寄存器的作用是不同的。
有关规定简单描述如下:实方式:前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。
为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。
5、指令指针寄存器32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。
如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。
如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。
在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。
在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。
运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。
如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。
这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位1、I/O特权标志IOPL(I/O Privilege Level)I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。
该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
2、嵌套任务标志NT(Nested Task)嵌套任务标志NT用来控制中断返回指令IRET的执行。
具体规定如下:(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;(2)、当NT=1,通过任务转换实现中断返回。
3、重启动标志RF(Restart Flag)重启动标志RF用来控制是否接受调试故障。
规定:RF=0时,表示“接受”调试故障,否则拒绝之。
在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
4、虚拟8086方式标志VM(Virtual 8086 Mode)如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
计算机寄存器常用指令一、常用指令1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ESDI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FSD.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GSDI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SSDI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES I 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX0时重复.REPC 当CF=1且CX/ECX0时重复.REPNC 当CF=0且CX/ECX0时重复.五、程序转移指令1.简单的条件转移指令JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0JS OPR----------------------结果为负转移, 测试条件SF=1JNS OPR---------------------结果为正转移, 测试条件SF=0JO OPR--------------------- 溢出转移, 测试条件OF=JNO OPR --------------------不溢出转移, 测试条件SF=0JP OPR ---------------------结果为偶转移, 测试条件SF=1JNP OPR --------------------结果为奇转移, 测试条件SF=0JC OPR -------------------- 有进位转移, 测试条件SF=1JNC OPR --------------------无进位转移, 测试条件SF=02.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)JB(或JNAE) opd --------------小于或者不大于等于则转移JNB(或JAE) opd---------------不小于或者大于等于则转移JA(或NJBE) OPD---------------大于或者不小于等于则转移JNA(或JBE) OPD---------------不大于或者小于等于则转移3.带符号比较条件转移指令JL(或JNGE) --------------小于或者不大于等于则转移JNL(或JGE)--------------不小于或者大于等于则转移JG(或NJLE)---------------大于或者不小于等于则转移JNG(或JLE)---------------不大于或者小于等于则转移六、调用子程序与返回指令CALL 子程序调用指令RET 子程序返回指令六、其它指令OFFSET -------------------- 返回偏移地址SEG -------------------- 返回段地址EQU(=) -------------------- 等值语句PURGE -------------------- 解除语句DUP -------------------- 操作数字段用复制操作符SEGMENT,ENDS -------------------- 段定义指令ASSUME -------------------- 段地址分配指令ORG -------------------- 起始偏移地址设置指令$ --------------------地址计数器的当前值PROC,ENDP -------------------- 过程定义语句NAME,TITLE,END -------------------- 程序开始结束语句MACRO,OllyICE反汇编教程及汇编命令详解内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。