OD使用须知常识,CPU寄存器和汇编指令

合集下载

汇编语言寄存器和指令操作的整理

汇编语言寄存器和指令操作的整理
l DI 目的变址寄存器
与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能
段寄存器l CS 代码段
存放当前程序的指令代码
l DS 数据段
存放程序所涉及的源数据或结果
l SS 堆栈段
当运算结果的最高位为1时, SF为1, 否则为0. 最高位表示符号数的正和负
6. TF 跟踪标志位
用于调试程序时进入单步方式工作. TF=1时, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器和各标志位的内容. TF=0时, CPU工作正常, 不产生内部中断
7. IF 中断允许标志位
l POP DST ;出栈指令: 弹出栈顶元素, 后将栈顶指针向栈底方向移动一个字
l XCHG OPR1, OPR2 ;交换指令: 将这两个操作数交换
地址传送指令:
l LEA DST, SRC ;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中
算术运算指令加法指令:
l ADD DST, SRC ;DST+SRC的和存放到DST中去
l ADC DST, SRC ;带进位加法指令, DST+SRC+CF
l INC DST ;增1指令
减法指令:
l LOOPZ/LOOPE, LOOPNZ/LOOPNE ;前者用于找到第一个不为0的事件, 后者用于找到第一个为0的事件
子程序调用指令:
l imme: 立即数
l DST: 目的操作数
l SRC: 源操作数
l mem: 存储器操作数

OD反汇编语言解释

OD反汇编语言解释

OD反汇编语言解释1000字OD反汇编语言是一种将机器语言指令转换为人类可读的汇编语言的工具,常用于逆向工程、软件分析和修改等领域。

在OD中,用户可以通过加载二进制文件并通过反汇编视图查看其汇编代码。

以下是关于OD反汇编语言的一些解释:1. 指令集:OD支持多种指令集,包括x86、x64、ARM、MIPS和PowerPC等。

每个指令集都有自己的特点和语法规则,用户需要事先了解并选择适合的指令集进行反汇编。

2. 寄存器:寄存器是CPU内部用于存储数据和地址的临时存储器。

在OD反汇编语言中,寄存器用来存储操作数和处理指令。

例如,EAX寄存器可用于存储累加器中的值,EBX可用于存储基址中的值,ECX可用于计数器中的值。

3. 操作码:操作码是汇编指令的核心部分,代表着具体的操作。

指令的操作码不同,具体操作也就不同。

例如,MOV指令是用来将数据从一个位置移动到另一个位置的指令,ADD指令是用于两个数值相加并保存结果的指令。

4. 操作数:操作数是指导致操作执行的位置或值。

在OD反汇编语言中,操作数可以是寄存器、内存地址或立即数。

例如,MOV AX,[BX]指令的操作数为[E]BX,表示复制寄存器BX中所存的数据到寄存器AX中。

5. 标志位:标志位是用来保存处理器状态的位。

在OD反汇编语言中,标志位记录着上一个操作的结果。

例如,ZF(零标志位)表示结果为零,CF(进位标志位)表示结果需要进位。

6. 流程控制:OD反汇编语言也支持流程控制指令,例如JMP、JE、JNE、JA、JB等。

这些指令用于实现条件跳转、循环、分支和函数调用等操作。

总之,OD反汇编语言是一种非常有用的工具,可用于逆向工程、软件分析和修改等领域。

理解OD反汇编语言的关键是掌握指令、寄存器、操作数、标志位和流程控制等概念。

OD使用须知常识CPU寄存器和汇编指令

OD使用须知常识CPU寄存器和汇编指令

OD使用须知常识CPU寄存器和汇编指令OD(Operator's Manual)是运营手册的缩写,指的是一份文件或手册,用于指导用户正确操作和使用一些产品或系统。

对于OD使用者来说,掌握一些基本常识是非常重要的。

在学习OD使用须知之前,我们先来了解一下CPU寄存器和汇编指令。

一、CPU寄存器CPU(Central Processing Unit,中央处理器)寄存器是CPU内部的一组高速存储器,用于临时存放指令、数据和地址等信息。

CPU寄存器可以分为通用寄存器和特殊寄存器两种。

通用寄存器:这些寄存器的尺寸通常与CPU的数据总线宽度相同,用于存放临时数据,例如计算结果、函数参数等。

常见的通用寄存器有AX、BX、CX、DX等。

不同的CPU有着不同的寄存器数量和命名方式。

特殊寄存器:这些寄存器具有特殊的功能,例如指令指针寄存器(Instruction Pointer,IP)用于存放下一条要执行的指令的地址;程序状态寄存器(Program Status Register,PSR)用于存放程序的状态信息,例如标志位(比如进位标志、溢出标志等)。

寄存器在计算机中起到了至关重要的作用,它们可以提供高速的数据存储和交换,加快了计算机的运行速度。

在汇编语言中,寄存器常用来存放计算过程中的中间结果。

二、汇编指令汇编指令(Assembly Instruction)是一种低级的机器指令,用来直接控制CPU的运行。

与高级语言相比,汇编指令更加底层,更接近机器语言。

它通过助记符(Mnemonic)来表示具体的操作,例如加载数据到寄存器、进行算术运算等。

汇编指令通常包括两部分:操作码和操作数。

操作码指示了具体的操作,例如MOV表示数据传送操作;操作数则指定了操作所需的参数,例如MOVAX,BX表示将BX寄存器的值传送给AX寄存器。

由于汇编语言直接操作CPU,因此具有很高的灵活性和效率,但也非常依赖于硬件平台和CPU架构。

OD使用完全教程

OD使用完全教程

OD使用完全教程.txt如果不懂就说出来,如果懂了,就笑笑别说出来。

贪婪是最真实的贫穷,满足是最真实的财富。

幽默就是一个人想哭的时候还有笑的兴致。

OllyDbg调试工具使用完全教程一,什么是 OllyDbg?OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。

它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。

Version 1.10 是最终的发布版本。

这个工程已经停止,我不再继续支持这个软件了。

但不用担心:全新打造的 OllyDbg 2.00 不久就会面世!运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。

还有,OllyDbg 是极占内存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。

支持的处理器: OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE 指令集以及相关的数据格式,但是不支持SSE2指令集。

配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。

数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。

帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。

如果您还有 Windows API 帮助文件的话(由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的相关帮助。

启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新启动上一个被调试程序,或是挂接[Attach]一个正在运行的程序。

汇编语言入门汇编指令及寄存器详解教程

汇编语言入门汇编指令及寄存器详解教程

汇编语⾔⼊门汇编指令及寄存器详解教程⽬录前⾔什么是汇编语⾔汇编语⾔产⽣的原因汇编与⼆进制的关系寄存器寄存器作⽤存取速度⽐较寄存器分类常⽤寄存器⽤途寄存器EAX、AX、AH、AL的关系汇编语⾔指令数据传送指令算术运算指令逻辑运算指令循环控制指令转移指令linux 和 windows 下汇编的区别总结前⾔我们⼤都是被⾼级语⾔惯坏了的⼀代,源源不断的新特性正在逐步添加到各类⾼级语⾔之中,汇编作为最接近机器指令的低级语⾔,已经很少被直接拿来写程序了,不过我还真的遇到了⼀个,那是之前的⼀个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他⽆法正确调⽤想执⾏的函数,结果他就开始在C++代码⾥嵌⼊汇编了,绕过了种种限制终于如愿以偿,但是读代码的我们傻眼了…因为项⽬是跨平台的,代码推送的 Linux 上编译的时候他才发现,汇编代码的语法在 Linux 和 Windows 上居然是不⼀样的,结果他⼜⽤⼀个判断平台的宏定义“完美”的解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值、左引⽤和右引⽤的时候,总是有⼈⽤程序编译⽣成的中间汇编代码来解释问题,看得我迷迷糊糊,所以决定熟悉⼀下简单的汇编指令,边学习边记录,⽅便今后忘记了可以直接拿来复习。

什么是汇编语⾔汇编语⾔是最接近机器语⾔的编程语⾔,引⽤百科中的⼀段话解释为:汇编语⾔(assembly language)是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。

在汇编语⾔中,⽤助记符代替机器指令的操作码,⽤地址符号或标号代替指令或操作数的地址。

汇编语⾔⼜被称为第⼆代计算机语⾔。

汇编语⾔产⽣的原因对于绝⼤多数⼈来说,⼆进制程序是不可读的,当然有能⼈可以读,⽐如第⼀代程序员,但这类⼈快灭绝了,直接看⼆进制不容易看出来究竟做了什么事情,⽐如最简单的加法指令⼆进制表⽰为00000011,如果它混在⼀⼤串01字符串中就很难把它找出来,所以汇编语⾔主要就是为了解决⼆进制编码的可读性问题。

OD使用须知常识CPU寄存器和汇编指令

OD使用须知常识CPU寄存器和汇编指令

OD使用须知常识CPU寄存器和汇编指令
1. 计算机的CPU主要包括一级 cache、二级 cache、控制器、ALU
和寄存器,其中寄存器最重要、最基础,是CPU内部最高效率的部分。

2.寄存器是一种可以快速存储和检索数据,并且具有高度的读取操作
速度的一种电路;它可以将一个或多个数据和信息保存在其中,也可以用
于控制程序的运行,以及执行指令的过程中。

3.寄存器分为几种不同的种类,其中包括存储器寄存器和指令寄存器;其中,存储器寄存器用来存储数据,而指令寄存器用来存储程序指令,并
且可以在CPU中被直接读取执行。

4.对于编程来说,寄存器的使用非常重要,特别是在需要处理大量数
据时;比如,当一个程序时调用一些函数或者进行复杂的算法计算时,在
程序开始和结束时,往往使用特定的寄存器来存储(处理结果的)数据,
使得处理速度更快,更有效。

5.在使用CPU的时候,必须要懂得使用CPU汇编指令;汇编语言是一
种用于控制CPU的机器级语言,通过汇编指令可以非常有效的控制CPU,
增强性能和效率。

6.对于不同的CPU,汇编指令也不相同;比如,x86汇编指令集(8086)是一种最常用的面向x86的指令集,其中包括了对寄存器的操作
指令。

OD使用教程 -

OD使用教程 -

调试技巧总结
• 7.一般我们要结合经验通过猜测的方式多尝试几遍设 陷阱,找出相关的函数。 • 8.按“Ctrl+G”键打开跟随表达式的窗口。 • 9.也可以通过“Ctrl+N”键打开应用程序的导入表( 输入表),然后查看应用程序总共导入了哪些函数来 以此推断需要在哪里挖坑下陷阱! • 10.关于返回值,汇编代码的返回值约定是存放在eax 这个寄存器里边的,如果32位的eax不够存放返回值 ,系统会将返回值放在内存某个位置并把该位置的地 址放在eax返回。
调试技巧总结
• 4.所谓领空,实际上就是指在某一时刻,CPU执 行的指令所在的某段代码的所有者。 • 5.如004013F7这类地址一般是可执行文件领空, 7C8114AB这类大地址一般是系统DLL所在的地 址空间。 • 6.程序通常读取文本框内容的字符串用的是以下 两个函数:
– GetDlgItemTextA(GetDlgItemTextW) – GetWindowTextA(GetWindowTextW)
OD使用教程
• 今天小甲鱼给大家演示使用OD破解《解密系列》 里边的小程序的过程。 • 《解密系列》里固然破解过程说明,但是看过此 书的朋友无不说太简单带过了,书中仅提到破解 该程序的简要步骤。 • 但是我们强调一定要知其然且知其所以然!所以 在今天的演示中,小甲鱼会用一样的程序讲出更 全面的内容! • 鸡冻吧?那上课就别睡觉了哦~
• 演示中… …
调试技巧总结
• 1.F2下断点,Alt+b打开断点编辑器,可编辑所 有下过的断点,空格键可快速切换断点状态。 • 2.当位于某个CALL中,这时想返回到调用这个 CALL的地方时,可以按“Ctrl+F9”快捷键执行 返回功能。这样OD就会停在遇到的第一个返回命 令(如RET、RETF或IRET)。 • 3.如果跟进系统DLL提供的API函数中,此时想返 回到应用程序领空里,可以按快捷键“Alt+F9” 执行返回到用户代码命令。

OD入门系列图文详细教程

OD入门系列图文详细教程

一、OllyDBG的安装与配置详细OllyDBG只要解压到一个目录下,运行OllyDBG.exe就可以了。

汉化版的发布版本是个RAR压缩包,运行OllyDBG.exe即可:OllyDBG中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考TT小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的CPU寄存器内容。

同样点击标签寄存器(FPU)可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下OllyDBG就可以生效了。

启动后我们要把插件及UDD的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把OllyDBG解压在F:\OllyDBG目录下,所以相应的UDD目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改OllyDBG中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动OllyDBG。

在这个对话框上点确定,重新启动一下OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个UDD目录不清楚。

我这简单解释一下:这个UDD目录的作用是保存你调试的工作。

比如你调试一个软件,设置了断点,添加了注释,一次没做完,这时OllyDBG就会把你所做的工作保存到这个UDD目录,以便你下次调试时可以继续以前的工作。

OD使用完全教程

OD使用完全教程

教你如何破解软件,OD破解软件,OD使用教程教你如何破解软件,OD破解软件,OD使用教程大家好,这几天我上网大概看了一下,ITyouth论坛的内容真的应有尽有,不知道应该写什么了,所以我想了一晚上终于想到了还是教你们些破解知识吧!我想对大家来说都很有用吧!我将会一直坚持下去保证课堂质量,有不会的可以提出来问我,尽量解答(呵呵!我也是鸟嘛!)废话不多说!支持我的就往下看吧!先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧!----------------------------------------------------------------------------------------------------------------语句:cmp a,b//cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小.mov a,b//mov是赋值语句,把b的值赋给a.je/jz//就是相等就到指定位置(也叫跳转).jne/jnz//不相等就到指定位置.jmp//无条件跳转.jl/jb//若小于就跳.ja/jg//若大于就跳.jge//若大于等于就跳.----------------------------------------------------------------------------------------------------------------------这些都是我们在以后的课程中会经常遇到的语句,应该记住它们,接下来我们在讲讲破解工具的使用:我们破解或给软件脱壳最常用的软件就是OD全名叫ODbyDYK界面如图1它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示.cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息.右下角的是当前堆栈情况,还有注释啊.恩,今天的课程就上到这了,大家可以在自己的电脑下试试OD,了解了解OD,下堂课我将破解一款软件给大家看,我们就用今天讲的语句和OD来破解,在以后的课程里我还会教大家脱壳,因为现在的软件为了维护版权多数都加了壳的,所以要破解就必须脱壳!好了!下节课见!88OD下载地址:百度一下吧破解工具------ODbyDYK v1.10 12.06.rar 5.1MB【原创】"白拿"软件破解班(二)呵呵!大家好!我是散人,我们又见面了!恩,按照上节课说的那样今天来破解个软件给大家看看!大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话加我QQ!有时间给你补节课!呵呵!好!孔子曰:“废话不可多说也”OK!!!~!!!先讲下预备知识:JZ/JE//相等则跳转JNE/JNZ//不相等则跳转JMP //无条件跳转目标柏林:LRC傻瓜编辑器杀杀杀~~~~~~~~~简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。

OD(OllyDbg)使用教程

OD(OllyDbg)使用教程

修改这一反汇编代码段,双击反汇编列后者按空格键, 修改这一反汇编代码段,双击反汇编列后者按空格键, 键入NOP,点汇编 键入 ,
最后 F9运行,你会看到: 运行, 运行 你会看到:
下面就介绍一些分析常用的汇编代码含义: 下面就介绍一些分析常用的汇编代码含义: MOV 传送字或字节 如MOV A B,就是将 中的字传给 中的字传给A ,就是将B中的字传给 PUSH 把字压入堆栈 CALL 子程序调用指令 XOR 异或运算 所谓异或,就是两值不同,则为真,反之,为假 所谓异或,就是两值不同,则为真,反之, RET 子程序返回指令 CMP 比较 两操作数作减法 仅修改标志位 不回送结果 比较.(两操作数作减法 仅修改标志位,不回送结果 两操作数作减法,仅修改标志位 不回送结果) JNZ(或 JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0 --------------结果不为零转移 测试条件ZF=0 结果不为零转移,测试条件 DEC 减 1 INC 加 1 JZ(或jE) OPR---------------结果为零转移 测试条件 结果为零转移, 或 结果为零转移 测试条件ZF=1 SUB 减法 LEA 装入有效地址 例: LEA DX,string ;把偏移地址存到 把偏移地址存到DX. 把偏移地址存到 MOVSX 先符号扩展 再传送 先符号扩展,再传送 REP 当CX/ECX0时重复 时重复 AND 与运算 TEST 测试.(两操作数作与运算 仅修改标志位,不回送结果 测试 两操作数作与运算,仅修改标志位 不回送结果) 两操作数作与运算 仅修改标志位 不回送结果
注意:此时的领空是模块USER32,领空就是在 注意:此时的领空是模块 ,
某一时刻, 某一时刻,CPU的CS:EIP所指向代码的所有者 的 所指向代码的所有者

汇编语言的指令和寄存器

汇编语言的指令和寄存器
HF是把FLAGS的低八位送到AH中
5.XLAT是(查表转换指令)把BX+AL为偏移的字节指向的值传送到AL。DS位段偏移量。
6.MOVSX(符号传送指令)8到16,把高8位全弄成符号位。
7.MOVZX(领扩展指令)8到16,把高8位全弄成0;
8.BSWAP(字节交换指令)特指32位的数。针对本个数。
4》结果的特征将放在FLAGS中:
1.CF:进位标志。
2.PF:奇偶标志。
3.AF:辅助进位标志。
4.ZF:零标志。
5.OF:溢出标志。
(5)奇偶标志 PF
(6)辅助进位标志AF
2>.状态控制标志
(1)方向标志DF
(2)中断允许标志IF
(3)追踪标志TF
3》1.lea是送偏移量;到寄存器
2.LDS是把一个32位的数,分别送到DS和BX中,LDS BX,list
3.SAHF是把AH送到FLAGS的低八位中,
复习一下汇编的基础知识,主要是Intel 8086的CPU。16机器
1.通用寄存器
(1)数据寄存器
数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。
AX寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。
BX寄存器称为基址寄存器。常用于存放存储器地址。
CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。
DX寄存器称为数据寄存器。常用来存放双字数据的高16位,或存放外设端口地址。
(2)变址和指针寄存器
变址和指针寄存器包括SI、DI、SP、BP 4个16位寄存器,主要用于存放某个存储单元的偏移地址。

OD使用须知常识,CPU寄存器和汇编指令

OD使用须知常识,CPU寄存器和汇编指令

OD使用须知常识,CPU寄存器和汇编指令用OD和CE,不断找汇编资料,解读指令,实在是累。

总算找到篇比较完整的资料与大家分享。

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位寄存器更具有通用性。

OD基本汇编指令

OD基本汇编指令

OD基本汇编指令jmp ;⽆条件跳转指哪飞哪⼀些杂志中说的直飞光明顶,指的就是它了~ 光明顶⼀般指爆破地址根据条件跳转的指令:JE ;等于则跳转 JNE ;不等于则跳转 JZ ;为 0 则跳转 JNZ ;不为 0 则跳转 JS ;为负则跳转 JNS ;不为负则跳转 JC ;进位则跳转 JNC ;不进位则跳转 JO ;溢出则跳转 JNO ;不溢出则跳转 JA ;⽆符号⼤于则跳转 JNA ;⽆符号不⼤于则跳转 JAE ;⽆符号⼤于等于则跳转 JNAE ;⽆符号不⼤于等于则跳转 JG ;有符号⼤于则跳转 JNG ;有符号不⼤于则跳转 JGE ;有符号⼤于等于则跳转 JNGE ;有符号不⼤于等于则跳转 JB ;⽆符号⼩于则跳转 JNB ;⽆符号不⼩于则跳转 JBE ;⽆符号⼩于等于则跳转 JNBE ;⽆符号不⼩于等于则跳转 JL ;有符号⼩于则跳转 JNL ;有符号不⼩于则跳转 JLE ;有符号⼩于等于则跳转 JNLE ;有符号不⼩于等于则跳转 JP ;奇偶位置位则跳转 JNP ;奇偶位清除则跳转 JPE ;奇偶位相等则跳转 JPO ;奇偶位不等则跳转------------说了以上那么多也许⼤家会觉得晕但我们实际⽤到的⼀般只有 jmp je jne jz jnz⽽已所以⼤家只要清楚这5个跳转的条件即可,别的那些了解下就好了----------下⾯开始说传递跟⽐较指令传递指令:mov⽐较指令:cmp-----------mov是从右边向左边传递⽐如说:mov eax,1 ‘为eax赋值为1mov ecx,eax ’这样ecx也就是1了我们可以现学现⽤我们上⾯讲了跳转⼤家可以注意⼀下,我开头有说是标志位跳转那么什么是标志位呢就像mov eax,1mov ecx,eaxcmp ecx,eax 这个就是标志位我们已知eax跟ecx都是1那就符合je的跳转条件je是等于跳转。

od反编译工具用法

od反编译工具用法

od反编译工具用法OD是一款常用的反编译工具,适用于Windows、Linux等操作系统。

它可以帮助研究人员、黑客等对二进制文件进行反汇编、调试、修改等操作。

使用OD反编译工具需要掌握一些基本的命令和用法。

1. 安装OD工具OD工具可在官网下载,也可使用Linux系统自带的软件包管理器进行安装。

Windows用户可在GitHub上下载。

2. 使用OD工具在Linux终端中输入od命令即可进入OD工具。

使用OD工具可以对可执行文件、共享库、内核模块等进行反汇编、调试、修改等操作。

3. 常用命令(1) od -t <type> <file>:以指定格式输出文件内容。

(2) od -N <bytes> <file>:输出指定字节数的文件内容。

(3) od -A <address> <file>:从指定地址开始输出文件内容。

(4) od -j <offset> <file>:从指定偏移量开始输出文件内容。

(5) od -x <file>:以十六进制格式输出文件内容。

(6) od -c <file>:以字符格式输出文件内容。

(7) od -t x1 <file>:以字节为单位输出文件内容。

(8) od -t d1 <file>:以十进制格式输出文件内容。

4. 反编译使用OD工具可以对二进制文件进行反编译。

在OD工具中输入'u main'命令即可反编译文件中的main函数。

反编译后可查看函数中的汇编代码和注释,便于对代码进行分析和修改。

总之,OD反编译工具是一款非常有用的工具,掌握其基本命令和用法可帮助研究人员、黑客等更好地对二进制文件进行反汇编、调试、修改等操作。

汇编语言寄存器和指令操作的整理

汇编语言寄存器和指令操作的整理

汇编语言寄存器和指令操作的整理汇编语言是一种与机器语言紧密相关的低级语言。

它使用寄存器和特定的指令操作来进行数据的加载、存储、运算和控制。

寄存器是位于CPU内部的高速存储器。

它们可以暂时存储数据,供CPU进行运算和操作。

汇编语言使用多个寄存器进行数据的临时存储和处理。

在x86架构的计算机系统中,常见的寄存器包括:1.通用寄存器:程序员可以随意使用的寄存器,用于存储临时数据和地址。

在32位模式下,共有8个32位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP),在64位模式下,有16个64位通用寄存器(RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8~R15)。

2.段寄存器:用于存储段地址,分别包括代码段寄存器(CS)、数据段寄存器(DS)、附加段寄存器(ES)、栈段寄存器(SS)和指令指针寄存器(IP)。

3.标志寄存器:用于存储程序运行状态和执行结果的标志位,包括进位标志(CF)、零标志(ZF)、符号标志(SF)、溢出标志(OF)等。

除了寄存器,汇编语言还使用一些特定的指令操作来完成各种功能。

常见的指令操作包括:1.数据传输指令:用于将数据从一个位置(如寄存器、内存)传送到另一个位置。

常见的数据传输指令有MOV(将数据从源操作数传送到目标操作数)、LEA(加载有效地址)等。

2.算术运算指令:用于对数据进行加、减、乘、除等数学运算。

常见的算术运算指令有ADD(加法)、SUB(减法)、MUL(乘法)、IDIV(整数除法)等。

3.逻辑运算指令:用于对数据进行逻辑上的与、或、非、异或等运算。

常见的逻辑运算指令有AND(与运算)、OR(或运算)、NOT(取反运算)、XOR(异或运算)等。

4.控制指令:用于控制程序的流程和状态。

常见的控制指令有JMP(无条件跳转)、JZ(零标志跳转)、LOOP(循环执行)、CALL(调用子程序)等。

5.输入输出指令:用于与外部设备进行数据的输入和输出。

od使用方法

od使用方法

转Draren总结的ollydbg v1.09d 中文版使用说明一点一滴的积累,也就会了.之所以选择ollydbg1.我的os是winXP,无法使用trw2000,而softice装了多次均未成功,还蓝屏死机多次.郁闷.2.友好的gui界面,不像softice.可以边干活边听歌,不像softice,把整个os都挂起了.多用两次,连时间都不知道了.3.强大的内存查看功能,再不用什么-d了,而且跳转方便,爽!一目了然.4.强大的右键菜单功能ollydbg的界面:菜单:文件:1.其中包括该菜单的下部有上次打开的纪录,该纪录保存有上次未清除的断点.2.附加.对付那些Anti-Debug程序.先运行程序,再运行od,文件-->附加.查看:1.执行模块(Alt+E),查看程序使用的动态链接库2.查看断点.Alt+B调试:1.运行(F9)加载程序后,运行!2.暂停(F12)3.单步进入(F7)遇见CALL进入!进入该子程序.4.单步跳过(F8)遇见CALL不进去!5.执行到返回(ALT+F9)就是执行到该子程的返回语句ollydbg的16进制编辑功能.类似与hiew,hex workshop查看-->文件二进制文件编辑功能.查看-->文件,打开的文件是二进制显示.选中要改变的机器指令,空格,修改,右击-->保存.ollydbg的四个区域左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 不错;左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息;右下角的是当前堆栈情况,还有注释啊.F3选择打开程序.使用F9执行程序.下断点:1.对函数下下断点在代码区右击-->搜索-->当前模块中的名称(ctrl+N),在跳出来的对话框中选择需要下的断点函数.->右击->查找导入参考(enter),按F2下断点.如果有多个地方调用了该函数就这样操作。

汇编指令的基本知识

汇编指令的基本知识

汇编指令的基本知识1 指令1.1 定义:指令由操作码和操作数两部分组成;a 操作码:操作码说明计算机要执⾏那种操作,它是指令中不可缺少的组成部分。

每种指令的操作码:⽤⼀个唯⼀的助记符表⽰(指令功能的英⽂缩写);对应着机器指令的⼀个⼆进制编码。

b 操作数:操作数是指令执⾏的参与者,即各种操作的对象。

指令中的操作数:可以是⼀个具体的数值;可以是存放数据的寄存器;还可以是指明数据在主存位置的存储器地址。

1.2 格式:操作码操作数1,操作数2 ;注释a 操作数1:称为⽬的操作数dest,它不仅可以作为指令操作的⼀个对象,还可以⽤来存放指令操作的结果。

b 操作数2:称为源操作数src,它表⽰参与指令操作的⼀个对象。

c 分号后的内容是对指令的解释1.3 表达r8:任意⼀个8位通⽤寄存器(AH AL BH BL CH CL DH DL)r16:任意⼀个16位通⽤寄存器(AX BX CX DX SI DI BP SP)r32:任意⼀个32位通⽤寄存器(EAX EBX ECX EDX ESI EDI EBP EDI)reg:通⽤寄存器seg:段寄存器(CS DS ES SS)m8:⼀个8位存储器操作数内存单元m16:⼀个16位存储器操作数内存单元m32:⼀个32位存储器操作数内存单元mem:内存单元i8:⼀个8位⽴即数i16:⼀个16位⽴即数i32:⼀个32位⽴即数imm:⽴即数dest:⽬的操作数(操作数1)src:源操作数(操作数2)1.4 多种表达⽅式同⼀寻址⽅式可以写成不同的形式:MOV AX,[BX][SI] ;等同于 MOV AX,[BX+SI]MOV AX,12[BX] ;等同于 MOV AX,[BX+12]MOV AX,12[BX][SI];等同于 MOV AX,12[BX+SI]或 MOV AX, [BX+SI+12]2 寻址⽅式2.1 ⽴即数寻址指令中的操作数直接存放在机器代码中,紧跟在操作码之后,通常⽤于对通⽤寄存器或内存单元赋值2.2 寄存器寻址指令中的操作数直接存放在CPU的内部寄存器reg中,在指令执⾏过程中,会减少读/写存储器单元的次数,所以,使⽤寄存器寻址⽅式的指令具有较快的执⾏速度。

汇编语言入门汇编指令及寄存器详解教程

汇编语言入门汇编指令及寄存器详解教程

汇编语言入门汇编指令及寄存器详解教程汇编语言是一种低级编程语言,与计算机硬件直接相关。

它使用一组基本的指令和寄存器来编写程序。

本篇教程将介绍汇编语言的基本指令和寄存器,帮助读者入门汇编语言编程。

一、汇编语言概述及基本概念汇编语言是机器语言的助记符表示。

它采用英文单词来表示机器指令,以便程序员更容易理解和编写。

汇编语言程序需要通过汇编器将其转换为机器语言,然后可以在计算机上运行。

1.1 汇编指令汇编指令是汇编语言中的基本指令,用于执行计算机的各种操作。

常见的汇编指令包括数据传输指令、算术运算指令、逻辑运算指令和控制转移指令等。

下面介绍几个常用的汇编指令:1.1.1 MOV指令MOV指令用于将数据从一个位置复制到另一个位置。

语法格式如下:MOV 目标操作数, 源操作数其中,目标操作数表示数据的目的位置,源操作数表示数据的来源位置。

例如,MOV AX, BX表示将寄存器BX中的数据复制到寄存器AX中。

1.1.2 ADD指令ADD指令用于实现加法运算。

语法格式如下:ADD 目标操作数, 源操作数其中,目标操作数表示运算结果的存储位置,源操作数表示参与加法运算的数据。

例如,ADD AX, BX表示将AX寄存器中的数据与BX 寄存器中的数据相加,并将结果存储在AX寄存器中。

1.1.3 JMP指令JMP指令用于实现无条件跳转。

语法格式如下:JMP 目标地址其中,目标地址表示跳转的目标位置。

例如,JMP 100表示跳转到地址为100的指令处执行。

1.2 寄存器寄存器是一种用于存储和处理数据的硬件组件。

在汇编语言中,寄存器被广泛应用于各种数据传输和运算操作。

下面介绍几个常用的寄存器:1.2.1 通用寄存器通用寄存器是汇编语言中最常用的寄存器,用于存储数据和执行运算。

常见的通用寄存器有AX、BX、CX和DX等。

1.2.2 段寄存器段寄存器用于存储程序的段地址。

在实模式下,8086处理器有4个段寄存器:CS、DS、ES和SS。

OD的常用命令

OD的常用命令
四.两种不同情况的不同修改方法
1.修改为jmp
je(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息
xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)
例: LES DI,string ;把段地址:偏移地址存到ESI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FSI.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GSI.
0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
。。。
。。。
xxxxxxxxxxxx 出错信息(我们希望不要跳到这里,不让它出现)它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OD使用须知常识,CPU寄存器和汇编指令用OD和CE,不断找汇编资料,解读指令,实在是累。

总算找到篇比较完整的资料与大家分享。

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,ENDM --------------------宏定义指令XLAT (TRANSLATE)-------------------- 换码指令----七、条件标志ZF 零标志-- 当结果为负时,SF=1,否则,SF=0.AF 辅助进位标志---运算过程中第三位有进位值,置AF=1,否则,AF=0PF 奇偶标志------当结果操作数中偶数个\"1\",置PF=1,否则,PF=0SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0. OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0常用修改方法1、定位在cmp或test后的判断跳转,je、jz如此之类的...遇到这样的,我一般都会把它们改成jmp就能过,当然也要看看上下代码的意思,不然可能出错...个人认为这样修改的效果还是不错的..2、定位在跳转后的地址,如je xxxxxxxx ,jmp xxxxxxxx 之类的xxxxxxxx上...一般遇到是判断跳转的je,jnz的...按照第一个方法把跳转符改改就能过...如把je改成jmp...遇到是jmp xxxxxxxx的,就试试看下面有没有空位构造下push xxxxxxxxret或者可以把jmp xxxxxxxx ,用跳转转移到其它地方...3、定位在call eax之类上...把它改成push eax或其它...4、定位在call上的...先跟进call后面的地址看看,因为有时候那里往上拉一句就可能会有NOP之类的语句,那么我们把call后面的地址向前移一位就可以过...如果没有NOP,我们可以用跳转转移...5、定位在OR或者XOR上...把OR改XOR或者XOR改OR...6、定位在mov语句上,如MOV DWORD PTR SS:[ESP+14],ESI...我们可以把它改成mov esp,esiadd esp,147、定位在cmp语句,如cmp eax,espjnz xxxxxxxx那么遇到这样的,我们可以把这两句NOP掉,然后加上jmp xxxxxxxx ,这里意思就是我们不要那个比较,把代码直接跳到xxxxxxx x上运行....遇到test 这样的也可以试试这个方法...8、定位在字符串上,但是不能用改大小写的方法修改,修改就出错...例如pcshare有一个定位在“%s%s%s”上的...我们可以首先用C32把“%s%s%s”向前移一位,然后用OD载入,右键,超级字符串参考,查找ASCII,然后找到所有的“s%s%s”,由于我们向前移了一位,所以显示的应该是“s%s%s”,然后双击来一个个修改...双击后会发现,对应的语句会有一个地址,我们把它改掉,向前一位,如4AD05168就改成4AD05167,接着同样方法继续改其它有“s%s%s”的...这个方法通用字符串的修改...总结:上面的只不过是我在免杀时的一些经验...实际免杀还需要读懂上下代码,实际分析,并不代表按照上面这样改就一定可以...做人要灵活,方法都是自己悟出来的,没什么完美的通用方法...自己的免杀方法才是最好的~特征码修改总结2~1. 遇到特征码定位在jmp指令上面的构造替换push xxxxx ret。

相关文档
最新文档