使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii
import unicorn
import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE = b'\x1C\x00\x0A\x46\x1E\x00'"""MOV R3, R0 的机器码:0x1C 0x00(MOV R3, R0)MOV R0, R2 的机器码:0x0A 0x46(MOV R0, R2)MOV R2, R3 的机器码:0x1E 0x00(MOV R2, R3)"""cp = capstone.Cs(capstone.CS_ARCH_ARM,capstone.CS_MODE_THUMB)for i in cp.disasm(CODE,0,len(CODE)):print("[addr:%x]:%s %s\n" %(i.address,i.mnemonic,i.op_str))mu = unicorn.Uc(unicorn.UC_ARCH_ARM ,unicorn.UC_MODE_THUMB)ADDRESS = 0x1000SIZE = 1024mu.mem_map(ADDRESS,SIZE)mu.mem_write(ADDRESS,CODE)bytes = mu.mem_read(ADDRESS,10)print("ADDRESS:%x,content:%s"%(ADDRESS,binascii.b2a_hex(bytes)))mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0,0x100)mu.reg_write(unicorn.arm_const.UC_ARM_REG_R1,0x200)mu.reg_write(unicorn.arm_const.UC_ARM_REG_R2,0x300)mu.reg_write(unicorn.arm_const.UC_ARM_REG_R3,0x400)printArm32Regs(mu)mu.emu_start(ADDRESS+1,ADDRESS+4)print("------------")printArm32Regs(mu)returnif __name__ == '__main__':testhumb()

运行结果图:
在这里插入图片描述

代码概述

这段代码使用了 unicorncapstone 库来模拟 ARM Thumb 指令的执行。它的主要功能是加载一段机器码,执行这些指令,并打印出执行前后寄存器的值。

代码结构

  1. 导入库

    import binascii
    import unicorn
    import capstone
    
    • binascii: 用于处理二进制和 ASCII 之间的转换。
    • unicorn: 一个轻量级的多架构 CPU 模拟器。
    • capstone: 一个轻量级的反汇编框架,用于将机器码转换为可读的汇编指令。
  2. 打印寄存器值的函数

    def printArm32Regs(mu):for i in range(66, 78):print("R%d,value:%x" % (i - 66, mu.reg_read(i)))
    
    • 该函数接受一个 unicorn 模拟器实例 mu 作为参数。
    • 它循环读取 R0 到 R12(在 ARM 中,寄存器编号从 0 开始,R0 对应 66,R1 对应 67,以此类推),并打印出每个寄存器的值。
  3. 主测试函数

    def testhumb():CODE = b'\x1C\x00\x0A\x46\x1E\x00'
    
    • 这里定义了要执行的机器码 CODE,它包含了三条指令的机器码。
    cp = capstone.Cs(capstone.CS_ARCH_ARM, capstone.CS_MODE_THUMB)
    for i in cp.disasm(CODE, 0, len(CODE)):print("[addr:%x]:%s %s\n" % (i.address, i.mnemonic, i.op_str))
    
    • 使用 capstone 创建一个反汇编器实例 cp,指定架构为 ARM 和模式为 Thumb。
    • 反汇编 CODE,并打印出每条指令的地址、助记符和操作数。
  4. 设置 Unicorn 模拟器

    mu = unicorn.Uc(unicorn.UC_ARCH_ARM, unicorn.UC_MODE_THUMB)
    ADDRESS = 0x1000
    SIZE = 1024
    mu.mem_map(ADDRESS, SIZE)
    mu.mem_write(ADDRESS, CODE)
    
    • 创建一个 Unicorn 模拟器实例 mu,指定架构为 ARM 和模式为 Thumb。
    • 映射内存区域,从 ADDRESS 开始,大小为 SIZE
    • 将机器码写入模拟器的内存中。
  5. 初始化寄存器

    mu.reg_write(unicorn.arm_const.UC_ARM_REG_R0, 0x100)
    mu.reg_write(unicorn.arm_const.UC_ARM_REG_R1, 0x200)
    mu.reg_write(unicorn.arm_const.UC_ARM_REG_R2, 0x300)
    mu.reg_write(unicorn.arm_const.UC_ARM_REG_R3, 0x400)
    
    • 初始化 R0、R1、R2 和 R3 寄存器的值。
  6. 打印寄存器值

    printArm32Regs(mu)
    
    • 在执行指令之前,打印寄存器的初始值。
  7. 执行指令

    mu.emu_start(ADDRESS + 1, ADDRESS + 4)
    
    • ADDRESS + 1 开始执行到 ADDRESS + 4。注意,这里从 ADDRESS + 1 开始执行是因为机器码的第一条指令是 MOV R3, R0,它的机器码是 0x1C 0x00,在 Thumb 模式下,指令的地址是以 2 字节为单位的。
  8. 再次打印寄存器值

    print("------------")
    printArm32Regs(mu)
    
    • 执行完指令后,再次打印寄存器的值,以查看它们是否发生了变化。

代码功能总结

  • 反汇编: 代码首先将机器码反汇编为可读的汇编指令,并打印出每条指令的信息。
  • 模拟执行: 使用 Unicorn 模拟器执行这些指令,并在执行前后打印寄存器的值,以便观察指令对寄存器的影响。
  • 寄存器操作: 通过指令的执行,寄存器的值会根据指令的逻辑进行更新。

注意事项

  • 机器码的正确性: 确保机器码对应的指令是正确的,并且在执行时不会导致未定义的行为。
  • 寄存器的初始化: 在执行指令之前,确保寄存器的值已正确初始化,以便观察指令执行后的变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471165.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress 6.7 “Rollins”发布

每个 WordPress 版本都会向一位在音乐界留下不可磨灭印记的艺术家致敬。WordPress 6.7 的代号为“Rollins”,旨在向传奇爵士萨克斯演奏家桑尼罗林斯致敬。罗林斯是爵士乐界最伟大的即兴演奏家和先驱之一,他以精湛的技术、创新精神和无畏的音乐表达方式影…

844.比较含退格的字符串

java用 O(1)空间这个方法,容易挺多bug的… O(1)空间 #:删除前一个字符 》 从后面开始判断(这样可以用跳过的思想)不能使用两次 i- - 来处理 # 的操作,会造成误删了前面…

WLAN消失或者已连接但是访问不了互联网

目录 1、WLAN已连接但是访问不了互联网 2、WLAN图标消失 今晚电脑突然连不上网了,重启试了好多种办法都没有用。 1、WLAN已连接但是访问不了互联网 这个的问题很多,建议直接网络重置,即将网络驱动全部删除,然后重新安装。 首先…

Linux源码阅读笔记-V4L2框架基础介绍

V4L2视频设备驱动基础 V4L2 是专门为 Linux 设备设计的整套视频框架(其主要核心在 Linux 内核,相当于 Linux 操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2 驱动框架能够支持多种类型设备&…

C 语言 【模拟实现内存库函数】

1、memcpy memcpy函数是C/C语言中的一个用于内存复制的函数,声明在 string.h 中(C是 cstring)。其原型是: void * memcpy ( void * destination, const void * source, size_t num ); 其中,destination表示的是要拷贝…

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到HDFS、Hbase,简单来说flume就是收集日志的。 Flume两个版本区别: ​ 1&…

01:(手撸HAL+CubeMX)时钟篇

(手撸HALCubeMX)时钟篇 1、对SystemInit函数的分析2、使用HSI将总线时钟配置为最高频率3、使用HSE将总线时钟配置为最高频率4、使用Cube配置时钟树的参数5、对HAL_Init函数分析6、对系统定时器中断服务函数分析 有关时钟树和上电/复位的基础知识请参考“…

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Spring Boot实现文件上传与OSS集成:从基础到应用

目录 前言1. 文件上传的基础实现1.1 前端文件上传请求1.2 后端文件接收与保存 2. 集成第三方OSS服务2.1 准备工作2.2 编写OSS集成代码2.3 修改Controller实现文件上传至OSS 3. 文件上传的扩展:多文件上传与权限控制结语 前言 随着互联网应用的快速发展,…

微服务各组件整合

nacos 第一步&#xff0c;引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> 第二步&#xff0c;增加配置 spring:application:name: …

机器学习总结

机器学习按照模型类型分为监督学习模型&#xff0c;无监督学习模型和概率模型三大类&#xff1a; 下图是机器学习笔记思维导图&#xff0c;&#xff1a; 一.什么是机器学习 从本质上讲&#xff0c;可以认为机器学习就是在数据中寻找一种合适的函数来描述输入与输出之间的关系。…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

三、损失函数

损失函数 前言一、分类问题的损失函数1.1 二分类损失函数1.1.1 数学定义1.1.2 函数解释&#xff1a;1.1.3 性质1.1.4 计算演示1.1.5 代码演示 1.2 多分类损失函数1.1.1 数学定义1.1.2 性质与特点1.1.3 计算演示1.1.4 代码演示 二、回归问题的损失函数2.1 MAE损失2.2 MSE损失2.3…

PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸

小编最近有一篇png图片要批量压缩&#xff0c;大小都在5MB之上&#xff0c;在网上找了半天要么就是有广告&#xff0c;要么就是有毒&#xff0c;要么就是功能复杂&#xff0c;整的我心烦意乱。 于是我自己用python写了一个纯净工具&#xff0c;只能压缩png图片&#xff0c;没任…

测试工程师简历「精选篇」

【#测试工程师简历#】一份专业且引人注目的测试工程师简历&#xff0c;无疑是你敲开理想职位大门的金钥匙。那么&#xff0c;如何撰写一份既体现技术水平又彰显个人特色的简历呢&#xff1f;以下是幻主简历网整理的测试工程师简历「程序员篇」&#xff0c;欢迎大家阅读收藏&…

git下载慢下载不了?Git国内国外下载地址镜像,git安装视频教程

git安装下载的视频教程在这 3分钟完成git下载和安装&#xff0c;git国内外下载地址镜像&#xff0c;Windows为例_哔哩哔哩_bilibili 一、Git安装包国内和国外下载地址镜像 1.1国外官方下载地址 打开Git的官方网站&#xff1a;Git官网下载页面。在页面上选择对应的系统&…

专题十八_动态规划_斐波那契数列模型_路径问题_算法专题详细总结

目录 动态规划 动态规范五步走&#xff1a; 1. 第 N 个泰波那契数&#xff08;easy&#xff09; 解析&#xff1a; 1.状态表达式&#xff1a; 2.状态转移方程&#xff1a; 3.初始化&#xff1a; 4.填表顺序&#xff1a; 5.返回值 编写代码&#xff1a; 总结&#xff…

阿里云centos7.9服务器磁盘挂载,切换服务路径

项目背景 1、项目使用的服务器为阿里云centos7.9&#xff0c;默认的磁盘为vda&#xff0c;文件系统挂载在这个磁盘上&#xff0c;项目上使用的文件夹为/home/hnst/uploadPath 2、vda使用率已达到91% 3、现购置一块新的磁盘为vdb&#xff0c;大小为2T 目的 切换服务所使用的…

STM32问题集

这里写目录标题 一、烧录1、 Can not connect to target!【ST-LINK烧录】 一、烧录 1、 Can not connect to target!【ST-LINK烧录】 烧录突然 If the target is in low power mode, please enable “Debug in Low Power mode” option from Target->settings menu 然后就&…

Scala学习记录,case class,迭代器

case class case class创建的对象的属性是不可改的 创建对象&#xff0c;可以不用写new 自动重写&#xff1a;toString, equals, hashCode, copy 自动重写方法&#xff1a;toString,equals,hashCode,copy 小习一下 1.case class 的定义语法是什么 基本形式&#xff1a;case …