python unicorn engine

unicorn简介:

Unicorn 是一个轻量级, 多平台, 多架构的 CPU 模拟器框架.
我们可以更好地关注 CPU 操作, 忽略机器设备的差异. 想象一下, 我们可以将其应用于这些情景:
比如我们单纯只是需要模拟代码的执行而非需要一个真的 CPU 去完成那些操作, 又或者想要更安全地
分析恶意代码, 检测病毒特征, 或者想要在逆向过程中验证某些代码的含义. 使用 CPU 模拟器可以很好
地帮助我们提供便捷.
它的亮点 (这也归功于 Unicorn 是基于 qemu 而开发的) 包括:
支持多种架构: Arm, Arm64 (Armv8), M68K, Mips, Sparc, & X86 (include X86_64).
对 Windows 和 nix 系统 (已确认包含 Mac OSX, Linux, BSD & Solaris) 的原生支持
具有平台独立且简洁易于使用的 API
使用 JIT 编译技术, 性能表现优异
from unicorn import *
from unicorn.x86_const import *
# 需要使用一些x86常量, import一下
X86_CODE32 = b"\x41\x4a"    # 这是我们要模拟的代码,这里使用16进制表示,表示两个x86指令“INC ecx”和”DEC dex“
Address = 0x1000000         # 指定虚拟地址,我们将在这儿模拟上述代码
mu = Uc(UC_ARCH_X86, UC_MODE_32)
# 使用Uc类初始化Unicorn, 该类接受2个参数:硬件架构和硬件模式。 在这里,我们希望模拟X86体系结构的32位代码
mu.mem_map(Address, 2*1024*1024)
# 使用mem_map方法在前面声明的地址处映射2MB内存。此过程中的所有CPU操作都只能访问此内存。 此内存使用默认权限READ,WRITE和EXECUTE进行映射
mu.mem_write(Address, X86_CODE32)
# 将要模拟的代码写入我们刚刚映射到的内存中。 mem_write方法有两个参数:要写入的地址和要写入内存的代码
mu.reg_write(UC_X86_REG_ECX, 0X1234)
mu.reg_write(UC_X86_REG_EDX, 0X7890)    # 使用reg_write方法设置ECX,EDX寄存器的值
mu.emu_start(Address, Address+len(X86_CODE32))
# 使用emu_start方法开始模拟。该API采用4个参数:需要模拟的代码的地址、模拟停止的地址(正好在X86_CODE32的最后一个字节之后)、要模拟的时间和要模拟的指令数量。如果我们忽略最后两个参数,比如这个例子,unicorn将在无限时间和无限数量的指令中模拟代码
r_ecx = mu.reg_read(UC_X86_REG_ECX)
r_edx = mu.reg_read(UC_X86_REG_EDX)
# 通过reg_read函数读取
print(">> ecx = 0x%x" % r_ecx)
print(">> edx = 0x%x" % r_edx)        # 打印出寄存器ECX,EDX的值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I Am Rex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值