编辑“︁
Unicorn引擎
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
== 使用unicorn的快速指南 == 我们将会展示如何使用python调用unicorn的api以及它是如何轻易地模拟二进制代码. 当然这里用的api仅是一小部分, 但对于入门已经足够了. <syntaxhighlight lang="python"> 1 from __future__ import print_function 2 from unicorn import * 3 from unicorn.x86_const import * 4 5 # code to be emulated 6 X86_CODE32 = b"\x41\x4a" # INC ecx; DEC edx 7 8 # memory address where emulation starts 9 ADDRESS = 0x1000000 10 11 print("Emulate i386 code") 12 try: 13 # Initialize emulator in X86-32bit mode 14 mu = Uc(UC_ARCH_X86, UC_MODE_32) 15 16 # map 2MB memory for this emulation 17 mu.mem_map(ADDRESS, 2 * 1024 * 1024) 18 19 # write machine code to be emulated to memory 20 mu.mem_write(ADDRESS, X86_CODE32) 21 22 # initialize machine registers 23 mu.reg_write(UC_X86_REG_ECX, 0x1234) 24 mu.reg_write(UC_X86_REG_EDX, 0x7890) 25 26 # emulate code in infinite time & unlimited instructions 27 mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32)) 28 29 # now print out some registers 30 print("Emulation done. Below is the CPU context") 31 32 r_ecx = mu.reg_read(UC_X86_REG_ECX) 33 r_edx = mu.reg_read(UC_X86_REG_EDX) 34 print(">>> ECX = 0x%x" %r_ecx) 35 print(">>> EDX = 0x%x" %r_edx) 36 37 except UcError as e: 38 print("ERROR: %s" % e)</syntaxhighlight> 运行结果如下: <syntaxhighlight lang="shell">$ python test1.py Emulate i386 code Emulation done. Below is the CPU context >>> ECX = 0x1235 >>> EDX = 0x788f</syntaxhighlight> 样例里的注释已经非常直观, 但我们还是对每一行代码做出解释: * 行号2~3: 在使用Unicorn前导入<code>unicorn</code>模块. 样例中使用了一些x86寄存器常量, 所以也需要导入<code>unicorn.x86_const</code>模块 * 行号6: 这是我们需要模拟的二进制机器码, 使用十六进制表示, 代表的汇编指令是: "INC ecx" 和 "DEC edx". * 行号9: 我们将模拟执行上述指令的所在虚拟地址 * 行号14: 使用<code>Uc</code>类初始化Unicorn, 该类接受2个参数: 硬件架构和硬件位数(模式). 在样例中我们需要模拟执行x86架构的32位代码, 我 们使用变量<code>mu</code>来接受返回值. * 行号17: 使用<code>mem_map </code>方法根据在行号9处声明的地址, 映射2MB用于模拟执行的内存空间. 所有进程中的CPU操作都应该只访问该内存区域. 映射的内存具有默认的读,写和执行权限. * 行号20: 将需要模拟执行的代码写入我们刚刚映射的内存中. <code>mem_write</code>方法接受2个参数: 要写入的内存地址和需要写入内存的代码. * 行号23~24: 使用<code>reg_write</code>方法设置<code>ECX</code>和<code>EDX</code>寄存器的值 * 行号27: 使用<code>emu_start</code>方法开始模拟执行, 该API接受4个参数: 要模拟执行的代码地址, 模拟执行停止的内存地址(这里是 <code>X86_CODE32</code>的最后1字节处), 模拟执行的时间和需要执行的指令数目. 如果我们像样例一样忽略后两个参数, Unicorn将会默认以无穷时间和无穷指令数目的条件来模拟执行代码. * 行号32~35: 打印输出<code>ECX</code>和<code>EDX</code>寄存器的值. 我们使用函数<code>reg_read</code>来读取寄存器的值. 要想查看更多的python示例, 可以查看文件夹[https://github.com/unicorn-engine/unicorn/tree/master/bindings/python bindings/python]下的代码. 而C的示例则可以查看[https://github.com/unicorn-engine/unicorn/tree/master/samples sample]文件夹下的代码.
摘要:
请注意,所有对gamedev的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Gamedev:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息