文章目录

  • 1.CPU寄存器
  • 2.常用汇编指令
  • 3.作者答疑

  如果需要对恶意软件分析,或者修改现有可执行文件的功能,如果有软件的源代码,固然可以比较好的修改,如果没有,通过汇编指令的修改亦可做到。本文介绍CPU寄存器和常用汇编语言指令。

1.CPU寄存器

  ESP是栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。是cpu机制决定的,push、pop指令会自动调整esp的值。
  EBP是基址指针寄存器(extended base pointer),一般与ESP配合使用,可以存取某时刻的ESP,这个时刻就是进入一个函数内后,cpu会将ESP的值赋给EBP,此时就可以通过EBP对栈进行操作,比如获取函数参数,局部变量等。其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
  win32系统会分配一个向下扩展,入栈,地址减小,出栈,地址增加,足够大的栈段保存栈数据。
  调用一个函数时,先将堆栈原先的基址(EBP)入栈,以保存之前任务的信息。然后将栈顶指针的值赋给EBP,将之前的栈顶作为新的基址(栈底),然后再这个基址上开辟相应的空间用作被调用函数的堆栈。函数返回后,从EBP中可取出之前的ESP值,使栈顶恢复函数调用前的位置;再从恢复后的栈顶可弹出之前的EBP值,因为这个值在函数调用前一步被压入堆栈。这样,EBP和ESP就都恢复了调用前的位置,堆栈恢复函数调用前的状态。
  EAX (Extended Accumulator):累加寄存器,也称之为累加器;
  EBX (Extended Base):基地址寄存器;
  ECX (Extended Count):计数器寄存器;
  EDX (Extended Data):数据寄存器;
  ESI 和 EDI 又称作为变址寄存器:ESI (Source Index):源变址寄存器;EDI (Destination Index):目的变址寄存器。控制寄存器:EIP (Extended Instruction Pointer):指令指针寄存器;EFLAG:标志寄存器;段寄存器:CS (Code Segment):代码段寄存器;DS (Data Segment):数据段寄存器;SS (Stack Segment):堆栈段寄存器;ES (Extra Segment):附加段寄存器。
  【注意】 4个通用数据寄存器是可拆分的,例如 AX可分为AH(高位寄存器)和AL(低位寄存器),如下图所示:

  CS:IP索引的内存地址即为CPU开始读取代码的起点,之后的一段代码区域,被称为代码片段(code segement),这两个寄存器不能进行赋值操作(mov操作),只能通过jum汇编指令跳转。

  在32位模式下:当使用平坦(未分段的)存储器模型时,段寄存器加载的段选择符指向重叠的段,在线性地址空间中,每个段的起始地址都是0。这些重叠的段构成了程序可见的线性地址空间。通常,会定义两个重叠的段:一个是代码段,另一个是数据/栈段。CS寄存器指向代码段;其他的所有段寄存器指向数据/栈段。
  在64位模式下:处理器把CS/DS/ES/SS的段基都当作0,忽略与之关联的段描述符中的段基地址。这样就为代码/数据/栈创建了平坦的地址空间。但是FS/GS段寄存器是例外。在计算线性地址时,这两个段寄存器可能被用作额外的基址寄存器(当寻址局部数据或寻址某些操作系统数据结构时)。

2.常用汇编指令

  push指令:它首先减少 ESP 的值,再将源操作数复制到堆栈地址。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。
  pop指令:它首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4。
  pushfd指令:它把 32 位 EFLAGS 寄存器内容压入堆栈,而 popfd指令则把栈顶单元内容弹出到 EFLAGS 寄存器。
  lea指令:取有效地址指令 (Load Effective Address ),指令格式:LEA 目的,源;指令功能:取源操作数地址的偏移量,并把它传送到目的操作数所在的单元。LEA 指令要求源操作数必须是存储单元,而且目的操作数必须是一个除段寄存器之外的16位或32位寄存器。当目的操作数是16位通用寄存器时,那么只装入有效地址的低16位。
  中括号:[地址] 是取地址指向的内容。
  stosd:将eax的内容复制到edi的内存空间,复制四个字节,并将edi加4。
  rep指令:重复后面的指令。ECX的值是重复的次数。初始化edi,设置好ecx,初始化eax,初始化内存,如下源代码所示:

lea edi,dword ptr ss:[ebp-1F4]
mov ecx,7D
mov eax,CCCCCCCC
rep stosd

  FLD指令:格式,FLD STReg/MemReal,指令功能:将浮点数据压入协处理器的堆栈中。当进行内存单元内容压栈时,系统会自动决定传送数据的精度。
  FST指令:格式,FST STReg/MemReal,指令功能:将协处理器堆栈栈顶的数据传送到目标操作数中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。
  neg指令:格式,Neg Reg/MemReal,指令功能:操作数取补。
  jl指令:前面进行的算术运算,小于则跳转。
  ffree指令:浮点释放。
  fincstp指令:浮点栈针加一。
  MOVZX 指令:MOVZX OPD,OPS,将8位或16位的OPS零扩展为16位或32位,再传给OPD。
  test指令:属于逻辑运算指令,功能: 执行BIT与BIT之间的逻辑运算,测试(两操作数作与运算,仅修改标志位,不回送结果)。Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。
  CMP指令:属于算术运算指令,两操作数作减法,仅修改标志位,不回送结果。

3.作者答疑

  如有疑问,敬请留言。

PE文件-CPU寄存器-栈-常用汇编语言指令-push-move-sub-lea-rep-xor相关推荐

  1. 逆向中常见寄存器及常用汇编指令

    寄存器 通用寄存器 (前八个) 32位 16位 作用 EAX(累加器) AX 作用于操作数和结果的数据 EBX(基址寄存器) BX DS段中的数据指针 ECX(计数器) CX 用于字符串和循环操作 E ...

  2. Black Hat | PE Tree:BlackBerry 发布PE文件开源逆向工具

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 BlackBerry 在今年举办的美国黑帽大会上为网络安全社区发布了一款新工具:PE Tree. PE Tree 是一款适用于 Lin ...

  3. CPU卡PSAM卡 响应指令错误码

    http://m.blog.csdn.net/xinxinsky/article/details/52315592             PIN 二进制文件:数据以字节为单位进行读写,每次读写的长度 ...

  4. CTF PWN基础知识(寄存器、栈、汇编指令、标志位)详解

    本文中寄存器缩写都有标注上中文含义,方便初学者理解记忆. 寄存器: 寄存器是计算机暂存指令.数据和地址的地方. 常用寄存器及其功能整理: RIP:程序计数寄存器,来存放下一条即将用来执行的指令的地址, ...

  5. 汇编基础--寄存器与常用指令

    汇编是面向CPU的一种语言,是CPU机器码的人类语言描述. CPU 运算需要依赖于寄存器与内存,其中寄存器用于暂时存放CPU在运算中得到的结果,随后在按照需求选择是否放入内存或者继续参与其它的运算.寄 ...

  6. 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟

    很多时候我们使用函数 gettimeofday 以及 clock_gettime 作为我们获取 wall lock的时钟函数. 因为这两种函数是 glibc 提供的用户封装,简单易用,而且能够精确到 ...

  7. linux查看进程运行日志文件,【Linux】常用指令、ps查看进程、kill杀进程、启动停止tomcat命令、查看日志、查看端口、find查找文件...

    1.说出 10 个 linux 常用的指令 1) ls 查看目录中的文件 2)cd /home 进入 '/ home' 目录:cd .. 返回上一级目录:cd ../.. 返回上两级目录 3)mkdi ...

  8. ARM汇编寄存器和常用指令详解

    文章目录 AAPCS关于ARM寄存器的定义 寄存器 R0~R12 通用寄存器 R13-SP(Stack Pointer) 栈寄存器 R14-LR(Link Register) 链接寄存器 R15-PC ...

  9. 出栈(释放栈)和引用栈内数据意义不等同,和嵌套有关系但不是等同关系,局部变量进栈操作,不是局部变量自动带有进栈指令。汇编语言后局部变量操作是包含进栈操作指令PUSH和栈内地址存储数据调用,出栈。

    出栈(释放栈)和引用栈内数据意义不等同,和嵌套有关系但不是等同关系,局部变量进栈操作,不是局部变量自动带有进栈指令.汇编语言后局部变量操作是包含进栈操作指令PUSH和栈内地址存储数据调用,出栈. 2. ...

最新文章

  1. Android中的service全面总结
  2. 提高云计算中的软件质量
  3. 加密软件究竟有哪些作用呢?
  4. 排序算法之递归算法(归并排序)
  5. LVS(9)——为NAT单独增加路由器
  6. Iphone NSMutableArray,NSMutableDictionary AND 动态添加按钮
  7. ASP.NET简易教程3——SQL存储过程
  8. 开发利器JRebel部署SpringBoot项目
  9. julia: ubuntu下安装
  10. SXLib3D -- 一款高效的点云和网格交互处理平台
  11. 怎么做有内容的二维码?二维码在线制作教程
  12. linux如何把系统盘转换成gpt,如何更改/转换Ubuntu MBR驱动器到GPT,并从EFI启动Ubuntu?...
  13. tomcat从头开始
  14. 工业平板手持PDA的功能有哪些?
  15. 做了五年Android,我顿悟了...
  16. ubuntu14.04的自带的拼音输入法问题
  17. Word文档检查语法错误及错别字
  18. 专注创新型蛋白工具研发,上海恺佧生物科技完成3000万元Pre-A轮融资...
  19. 转:世上最愚蠢的行为,就是讲道理
  20. 几款值得选的SSH客户端软件

热门文章

  1. 数据结构包括哪几种基本结构,各有什么特点
  2. centos7应用笔记:键盘重影射
  3. 驱动程序之_3_网络设备_3_网卡驱动移植
  4. 2021-10-08 2021年中式烹调师(初级)新版试题及中式烹调师(初级)免费试题
  5. PostgreSQL13主从同步异步流复制
  6. PHP 利用json_decode解析json为null问题解决
  7. UVA-12716 - GCD XOR
  8. Hbase中RowKey的设计原则和热点问题
  9. TPAMI 2022|金字塔池化的骨干网络!南开达摩院联合推出P2T
  10. 华数机器人码垛_华数工业机器人码垛路径操作教程