使用 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.mzph.cn/news/886030.shtml

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

相关文章

git重置的四种类型(Git Reset)

git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件(使用了…

第三十一天|贪心算法| 56. 合并区间,738.单调递增的数字 , 968.监控二叉树

目录 56. 合并区间 方法1:fff 看方法2:fff优化版 方法3: 738.单调递增的数字 968.监控二叉树(贪心二叉树) 56. 合并区间 判断重叠区间问题,与452和435是一个套路 方法1:fff 看方法2&am…

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表(中等) 8.12从前序与中序遍历序列构造二叉树(中等) 8.13路径总和III(中等) 8.14二叉树的最近公共祖先(中等) 8.15二叉树中的最大路径和(困…

AutoSAR CP DoIP规范导读

主要功能和用途 诊断通信协议实现 遵循标准:遵循ISO 13400 - 2标准,实现了诊断通信在IP网络上的传输协议和网络层服务,包括数据封装、传输、路由等功能。 多种消息支持 车辆识别与公告:能够进行车辆识别请求和响应,…

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题,记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

屏幕缩放后截屏图片尺寸数字偏大导致前端DOM尺寸设置失真问题

如果显示器的尺寸缩放,而不是100%的话,利用截屏软件截取屏幕中的区域,截取时读取到的区域尺寸,就会失真;如果使用这个尺寸去设置网页中的DOM,则Dom的尺寸也会跟着失真。 比如, 如果使用失真…

蓝桥杯每日真题 - 第7天

题目:(爬山) 题目描述(X届 C&C B组X题) 解题思路: 前缀和构造:为了高效地计算子数组的和,我们可以先构造前缀和数组 a,其中 a[i] 表示从第 1 个元素到第 i 个元素的…

给阿里云OSS绑定域名并启用SSL

为什么要这么做? 问题描述: 当用户通过 OSS 域名访问文件时,OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true,导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候,使用浏览器是经常的,很多用户在点开浏览器时,却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢?今天小编就给大家分享几个常见的原因和具体的解决方法,希望能对大家有所帮…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时,Jenkins Master 会在 kubernetes 中创建一个 Sla…

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统&#xff0c;旨在提供一致的设计语言和视觉…

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制&#xff08;Flow Control&#xff09;是计算机网络中确保数据流平稳传输的技术&#xff0c;旨在防止数据发送方发送过多数据&#xff0c;导致接收方的缓冲区溢出&#xff0c;进而造成数据丢失或传输失败。流量控制通常…

可扩展架构与分层架构

可扩展架构 1 概述 软件系统与硬件/建筑系统最大的区别就是可以迭代升级和扩展&#xff0c;一个硬件生产出来后就不会进行改变&#xff0c;除非拿去售后维修&#xff0c;一个建筑完工后也不会改变其整体的结构&#xff0c;除非被破坏后进行修复和重铸 可以发现如果硬件/建筑不…

MyBatis从入门到进阶

目录 MyBatis入门1、创建项目、数据准备2、数据库配置3、编写持久层代码单元测试打印日志 基本操作查询数据插入数据删除数据更新数据 MyBatis - xml插入数据更新数据删除数据查询数据#{}与${}SQL注入排序like查询 MyBatis进阶if标签trim标签where标签set标签foreach标签sql标签…

TensorFlow 2.0 环境配置

官方文档&#xff1a;CUDA Installation Guide for Windows 官方文档有坑&#xff0c;windows的安装指南直接复制了linux的指南内容&#xff1a;忽略这些离谱的信息即可。 可以从官方文档知悉&#xff0c;cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 &#xff0c; 现实的漫游效果不是从摄像机的角度来看 &#xff0c; 但其仍然存在很多困难 。基于三维场景的视频融合 &#xff0c; 因其直观等特效在视频监控等相关领域有着…

亚马逊评论爬虫+数据分析

爬取评论 做分析首先得有数据&#xff0c;数据是核心&#xff0c;而且要准确&#xff01; 1、爬虫必要步骤&#xff0c;选好框架 2、开发所需数据 3、最后测试流程 这里我所选框架是seleniumrequest&#xff0c;很多人觉得selenium慢&#xff0c;确实不快&#xff0c;仅针对此…

RK3588 C++ 多线程运行

RK3588 C 多线程 实际运行解决OpenCV问题&#xff1a; 1. OpenCV 安装 sudo apt-get update sudo apt-get install libopencv-dev2. 检查 OpenCV 安装路径 find / -name OpenCVConfig.cmake3. 设置 OpenCV_DIR 环境变量 export OpenCV_DIR/usr/lib/aarch64-linux-gnu/cmake/op…

【已解决】Parameter index out of range (14 > number of parameters, which is 13).

解决思路&#xff1a; 字面意思就是sql传参数量对不上&#xff0c;但我检查几遍代码都感觉没问题&#xff0c;sql单独拿到mysql里运行也没问题。看了其他的报错&#xff1a;Error setting non null for parameter #2 with JdbcType null&#xff0c;看起来也是跟参数有关的&am…