2018/10/03-字符串指令(重复指令、操作数据缓冲区指令)、rep与movx指令-《恶意代码分析实战》

  重复指令是一组操作数据缓冲区的指令。数据缓冲区通常是一个字节数组的形式,也可以是单字或者双字。(Intel‘称这些指令为字符串指令)

  最常见的数据缓冲区操作指令是movsx、cmps、stosx和scasx,其中x可以是b、w后者d,分别表示字节、字和双字。这些指令对任何形式的数据都有效。

  在这些操作中,使用ESI和EDI寄存器。ESI是源索引寄存器,EDI是目的索引寄存器。还有ECX用作计数的变量。

  这些指令还需要一个前缀,用于对长度超过1的数据做操作。movsb指令本身只会移动一个字节,而不使用ECX寄存器。

  在x86下,使用重复前缀来做多字节操作。rep指令会增加ESI和EDI这两个偏移,减少ECX寄存器。rep前缀会不断重复,直至ECX=0。repe/repz和repne/repnz前缀则不断重复,直至ECX=0或直至ZF=1或0。在大部分的数据缓冲区操作指令中,ESI、EDI和ECX必须为rep指令的生效而进行适当的初始化。

  mvosb指令用于将一串字节从一个位置移动到另一个位置。rep前缀经常与movsb一起使用,从而赋值一串长度由ECX决定的字节。从逻辑上说,rep movsb指令等价于C语言的memcpy函数。movsb指令从ESI指向地址取出一个字节,将其存入EDI指向地址,然后根据方向标志(DF)的设置,将ESI和EDI的值加1或者减1。若果DF=0,则加,否则减。

  cmpsb指令用于比较两串字节,以确定其是否是相同的数据。它经常与repe前缀一起使用,此时,cmpsb指令逐一比较两串字节,直至发现一处不同或比较到头。ECX=0或者ZF=0,就停止重复。相当于C语言中memcp函数。

  scasb指令用于从一串字节中搜索一个值。这个值有AL寄存器给出。它的工作方式与cmpsb一样,但是它是将ESI指向地址的字节与AL进行比较,而不是与EDI指向地址的字节比较。repe操作会使得这个比较不断继续,知道找到该字节,或者ECX=0。如果在这串字节中找到了那个值,其位置会被存储在ESI中。

  stosb指令用于将值存储到EDI指向的地址。它与scasb一样,但不是去搜索,而是将指定的字节存入EDI指向的地址。rep前缀与scasb一起使用后,就初始化了一段内存缓冲区,其中的每个字节都是相同的值。这等价于C语言的memset函数。

  rep指令实例:

  repe cmpsb  用于比较两块数据缓冲区。EDI和ESI必须被设为两端缓冲区的地址,ECX必须被设为缓冲区长度。当ECX=0或者发现缓冲区不一致的时候,停止比较。

  rep stosb  用于用一个给定的值初始化一块缓冲区所有字节。EDI包含了缓冲区地址,AL则包含初始值。这个指令通常与xor eax, eax一起使用。

  rep movsb  一般用于赋值缓冲区中的字节。ESI需要被设为缓冲区地址,EDI被设为目的缓冲区地址,ECX则必须为要复制的长度。会逐字节复制,直至ECX=0。

  rep scasb  用于在一段数据缓冲区中搜索一个字节。EDI需指向缓冲区地址,AL则包含要找的字节,ECX设为缓冲区长度。当ECX=0或找到该字节时,比较停止。

原文地址:https://www.cnblogs.com/Fingerprint/p/9899926.html

时间: 2024-11-06 09:51:56

2018/10/03-字符串指令(重复指令、操作数据缓冲区指令)、rep与movx指令-《恶意代码分析实战》的相关文章

2018/11/08-调试器-《恶意代码分析实战》

调试器是用来检测或测试其他程序运行的以来软件或硬件.由于刚完成的程序包含错误,因此调试器在软件开发过程中可以大显身手.调试器让你能够洞察程序在执行过程中做了什么.调试器的目的是允许开发者监控程序的内部状态和运行. 从调试器获得程序的信息可能比较困难,但并不意味着不可能,可以从反汇编器中获得所需信息.反汇编会在程序执行第一条指令前,立即提供程序的快照.当程序执行时,调试器的目的是允许开发者监控程序的内部状态和运行. 调试器监控程序执行的能力在恶意代码分析过程中扮演着十分重要的角色.调试器允许你查看

2018/10/03-函数调用约定、cdecl、stdcall、fastcall- 《恶意代码分析实战》

cdecl是最常用的约定之一,参数是从右到左按序被压入栈,当函数完成时由调用者清理栈,并且将返回值保存在EAX中. stdcall约定是被调用函数负责清理栈,其他和cdecl非常类似. fastcall调用约定跨编译器时变化最多,但是它总体上在所有情况下的工作方式都是相似的.在fastcall中,前一些参数(典型的是前两个)被传到寄存器中,备用的寄存器是EDX和ECX(微软fastcall约定).如果需要的话,剩下的参数再以从右到左的次序被加载到栈上.通常使用fastcall比其他约定更高效,因

linux下使用tar命令 (转至http://www.cnblogs.com/li-hao/archive/2011/10/03/2198480.html)

解压语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用.主选项:c 创建新的档案文件.如果用户想备份一个目录或是一些文件,就要选择这个选项.相当于打包. x 从档案文件中释放文件.相当于拆包. t 列出档案文件的内容,查看已经备份了哪些文件. 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩.辅助选项: -z :是否同时具有 gzip 的属性?亦即是否需要用 gzi

字符串非重复全排列算法

[题目描述] 输入一个字符串,打印出该字符串中字符的所有排列. 例如输入字符串abc,则输出由字符a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba. [分析] 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列.以对字符串abc进行全排列为例,我们可以这么做:以abc为例 固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac 固定b,求后面ac的排列:bac,bca,求好

【去除集合中字符串的重复值-2】

package com.yjf.esupplier.common.test; import java.util.ArrayList; import java.util.Iterator; /** * @author shusheng * @description 去除集合中字符串的重复值(字符串的内容相同) * @Email [email protected] * @date 2018/12/12 16:55 */ public class ArrayListDemo1 { public sta

【去除集合中字符串的重复值-1】

package com.yjf.esupplier.common.test; import java.util.ArrayList; import java.util.Iterator; /** * @author shusheng * @description 去除集合中字符串的重复值(字符串的内容相同) * @Email [email protected] * @date 2018/12/12 16:24 */ public class ArrayListDemo { /** * Array

[算法]删除字符串中重复的字符

如何删除字符串中重复的字符 问题描述: 删除字符串中重复的字符,例如,"good"去掉重复的字符串后就变成"god". 第一种方法: "蛮力法",最简单的方法就是把这个字符串看作是一个字符数组,对该数组使用双重循环进行遍历,如果发现有重复的字符,就把该字符置为'\0',最后再把这个字符数组中所有的'\0'去掉,此时得到的字符串就是删除重复字符后的目标字符串. 代码如下: package 删除字符串中重复的字符; public class Solu

leetcode——Remove Duplicates from Sorted List II 删除排序字符串中重复字符(AC)

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. For example, Given 1->2->3->3->4->4->5, return 1->2->5. Given 1->1->1->2->3, return 2->3

OpenWrt for vmware 从openwrt.org下载10.03.1 或是自己下载最新的源码进行编译生成x86 vmdk格式

1,直接从OpenWrt.org官网下载 http://downloads.openwrt.org/backfire/10.03.1/x86_generic/ 更新OpenWrt在线软件源 opkg update http://downloads.openwrt.org/backfire/10.03.1/x86_generic/packages/Packages.gz opkg list | grep mysql-server OpenWrt安装MySQL 查看OpenWrt中MySQL是否安装