<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=Unicorn%E5%BC%95%E6%93%8E</id>
	<title>Unicorn引擎 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=Unicorn%E5%BC%95%E6%93%8E"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=Unicorn%E5%BC%95%E6%93%8E&amp;action=history"/>
	<updated>2026-05-05T22:46:27Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=Unicorn%E5%BC%95%E6%93%8E&amp;diff=238&amp;oldid=prev</id>
		<title>127.0.0.1：​创建页面，内容为“{{Ctf_Wiki}} &lt;span id=&quot;unicorn-engine简介&quot;&gt;&lt;/span&gt; = Unicorn Engine简介 =  &lt;span id=&quot;什么是unicorn引擎&quot;&gt;&lt;/span&gt; == 什么是Unicorn引擎 ==  Unicorn是一个轻量级, 多平台, 多架构的CPU模拟器框架. 我们可以更好地关注CPU操作, 忽略机器设备的差异. 想象一下, 我们可以将其应用于这些情景: 比如我们单纯只是需要模拟代码的执行而非需要一个真的CPU去完成那些操作, 又或者想要更安…”</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=Unicorn%E5%BC%95%E6%93%8E&amp;diff=238&amp;oldid=prev"/>
		<updated>2023-07-02T12:19:43Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Ctf_Wiki}} &amp;lt;span id=&amp;quot;unicorn-engine简介&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = Unicorn Engine简介 =  &amp;lt;span id=&amp;quot;什么是unicorn引擎&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; == 什么是Unicorn引擎 ==  Unicorn是一个轻量级, 多平台, 多架构的CPU模拟器框架. 我们可以更好地关注CPU操作, 忽略机器设备的差异. 想象一下, 我们可以将其应用于这些情景: 比如我们单纯只是需要模拟代码的执行而非需要一个真的CPU去完成那些操作, 又或者想要更安…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ctf_Wiki}}&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicorn-engine简介&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= Unicorn Engine简介 =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;什么是unicorn引擎&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 什么是Unicorn引擎 ==&lt;br /&gt;
&lt;br /&gt;
Unicorn是一个轻量级, 多平台, 多架构的CPU模拟器框架. 我们可以更好地关注CPU操作, 忽略机器设备的差异. 想象一下, 我们可以将其应用于这些情景: 比如我们单纯只是需要模拟代码的执行而非需要一个真的CPU去完成那些操作, 又或者想要更安全地分析恶意代码, 检测病毒特征, 或者想要在逆向过程中验证某些代码的含义. 使用CPU模拟器可以很好地帮助我们提供便捷.&lt;br /&gt;
&lt;br /&gt;
它的亮点(这也归功于Unicorn是基于[http://www.qemu.org qemu]而开发的)有:&lt;br /&gt;
&lt;br /&gt;
* 支持多种架构: Arm, Arm64 (Armv8), M68K, Mips, Sparc, &amp;amp;amp; X86 (include X86_64).&lt;br /&gt;
* 对Windows和*nix系统(已确认包含Mac OSX, Linux, *BSD &amp;amp;amp; Solaris)的原生支持&lt;br /&gt;
* 具有平台独立且简洁易于使用的API&lt;br /&gt;
* 使用JIT编译技术, 性能表现优异&lt;br /&gt;
&lt;br /&gt;
你可以在[http://www.unicorn-engine.org/BHUSA2015-unicorn.pdf Black Hat USA 2015]获悉有关Unicorn引擎的更多技术细节. Github项目主页: [https://github.com/unicorn-engine/unicorn unicorn]&lt;br /&gt;
&lt;br /&gt;
尽管它不同寻常, 但它无法模拟整个程序或系统, 也不支持系统调用. 你需要手动映射内存并写入数据进去, 随后你才能从指定地址开始模拟.&lt;br /&gt;
&lt;br /&gt;
== 应用的情景 ==&lt;br /&gt;
&lt;br /&gt;
什么时候能够用到Unicorn引擎呢?&lt;br /&gt;
&lt;br /&gt;
* 你可以调用恶意软件中一些有趣的函数, 而不用创建一个有害的进程.&lt;br /&gt;
* 用于CTF竞赛&lt;br /&gt;
* 用于模糊测试&lt;br /&gt;
* 用于gdb插件, 基于代码模拟执行的插件&lt;br /&gt;
* 模拟执行一些混淆代码&lt;br /&gt;
&lt;br /&gt;
== 如何安装 ==&lt;br /&gt;
&lt;br /&gt;
安装Unicorn最简单的方式就是使用pip安装, 只要在命令行中运行以下命令即可(这是适合于喜爱用python的用户的安装方法, 对于那些想要使用C的用户, 则需要去官网查看文档编译源码包):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;pip install unicorn&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
但如果你想用源代码进行本地编译的话, 你需要在[http://www.unicorn-engine.org/download/ 下载]页面中下载源代码包, 然后可以按照以下命令执行:&lt;br /&gt;
&lt;br /&gt;
* *nix 平台用户&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;$ cd bindings/python&lt;br /&gt;
$ sudo make install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Windows平台用户&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;cd bindings/python&lt;br /&gt;
python setup.py install&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
对于Windows, 在执行完上述命令后, 还需要将[http://www.unicorn-engine.org/download/ 下载]页面的`Windows core engine`的所有dll文件复制到`C:\locationtopython\Lib\site-packages\unicorn`位置处.&lt;br /&gt;
&lt;br /&gt;
== 使用unicorn的快速指南 ==&lt;br /&gt;
&lt;br /&gt;
我们将会展示如何使用python调用unicorn的api以及它是如何轻易地模拟二进制代码. 当然这里用的api仅是一小部分, 但对于入门已经足够了.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt; 1 from __future__ import print_function&lt;br /&gt;
 2 from unicorn import *&lt;br /&gt;
 3 from unicorn.x86_const import *&lt;br /&gt;
 4 &lt;br /&gt;
 5 # code to be emulated&lt;br /&gt;
 6 X86_CODE32 = b&amp;quot;\x41\x4a&amp;quot; # INC ecx; DEC edx&lt;br /&gt;
 7 &lt;br /&gt;
 8 # memory address where emulation starts&lt;br /&gt;
 9 ADDRESS = 0x1000000&lt;br /&gt;
10 &lt;br /&gt;
11 print(&amp;quot;Emulate i386 code&amp;quot;)&lt;br /&gt;
12 try:&lt;br /&gt;
13     # Initialize emulator in X86-32bit mode&lt;br /&gt;
14     mu = Uc(UC_ARCH_X86, UC_MODE_32)&lt;br /&gt;
15 &lt;br /&gt;
16     # map 2MB memory for this emulation&lt;br /&gt;
17     mu.mem_map(ADDRESS, 2 * 1024 * 1024)&lt;br /&gt;
18 &lt;br /&gt;
19     # write machine code to be emulated to memory&lt;br /&gt;
20     mu.mem_write(ADDRESS, X86_CODE32)&lt;br /&gt;
21 &lt;br /&gt;
22     # initialize machine registers&lt;br /&gt;
23     mu.reg_write(UC_X86_REG_ECX, 0x1234)&lt;br /&gt;
24     mu.reg_write(UC_X86_REG_EDX, 0x7890)&lt;br /&gt;
25 &lt;br /&gt;
26     # emulate code in infinite time &amp;amp; unlimited instructions&lt;br /&gt;
27     mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32))&lt;br /&gt;
28 &lt;br /&gt;
29     # now print out some registers&lt;br /&gt;
30     print(&amp;quot;Emulation done. Below is the CPU context&amp;quot;)&lt;br /&gt;
31 &lt;br /&gt;
32     r_ecx = mu.reg_read(UC_X86_REG_ECX)&lt;br /&gt;
33     r_edx = mu.reg_read(UC_X86_REG_EDX)&lt;br /&gt;
34     print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; ECX = 0x%x&amp;quot; %r_ecx)&lt;br /&gt;
35     print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; EDX = 0x%x&amp;quot; %r_edx)&lt;br /&gt;
36 &lt;br /&gt;
37 except UcError as e:&lt;br /&gt;
38     print(&amp;quot;ERROR: %s&amp;quot; % e)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
运行结果如下:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;$ python test1.py &lt;br /&gt;
Emulate i386 code&lt;br /&gt;
Emulation done. Below is the CPU context&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; ECX = 0x1235&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; EDX = 0x788f&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
样例里的注释已经非常直观, 但我们还是对每一行代码做出解释:&lt;br /&gt;
&lt;br /&gt;
* 行号2~3: 在使用Unicorn前导入&amp;lt;code&amp;gt;unicorn&amp;lt;/code&amp;gt;模块. 样例中使用了一些x86寄存器常量, 所以也需要导入&amp;lt;code&amp;gt;unicorn.x86_const&amp;lt;/code&amp;gt;模块&lt;br /&gt;
* 行号6: 这是我们需要模拟的二进制机器码, 使用十六进制表示, 代表的汇编指令是: &amp;amp;quot;INC ecx&amp;amp;quot; 和 &amp;amp;quot;DEC edx&amp;amp;quot;.&lt;br /&gt;
* 行号9: 我们将模拟执行上述指令的所在虚拟地址&lt;br /&gt;
* 行号14: 使用&amp;lt;code&amp;gt;Uc&amp;lt;/code&amp;gt;类初始化Unicorn, 该类接受2个参数: 硬件架构和硬件位数(模式). 在样例中我们需要模拟执行x86架构的32位代码, 我 们使用变量&amp;lt;code&amp;gt;mu&amp;lt;/code&amp;gt;来接受返回值.&lt;br /&gt;
* 行号17: 使用&amp;lt;code&amp;gt;mem_map &amp;lt;/code&amp;gt;方法根据在行号9处声明的地址, 映射2MB用于模拟执行的内存空间. 所有进程中的CPU操作都应该只访问该内存区域. 映射的内存具有默认的读,写和执行权限.&lt;br /&gt;
* 行号20: 将需要模拟执行的代码写入我们刚刚映射的内存中. &amp;lt;code&amp;gt;mem_write&amp;lt;/code&amp;gt;方法接受2个参数: 要写入的内存地址和需要写入内存的代码.&lt;br /&gt;
* 行号23~24: 使用&amp;lt;code&amp;gt;reg_write&amp;lt;/code&amp;gt;方法设置&amp;lt;code&amp;gt;ECX&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;EDX&amp;lt;/code&amp;gt;寄存器的值&lt;br /&gt;
* 行号27: 使用&amp;lt;code&amp;gt;emu_start&amp;lt;/code&amp;gt;方法开始模拟执行, 该API接受4个参数: 要模拟执行的代码地址, 模拟执行停止的内存地址(这里是 &amp;lt;code&amp;gt;X86_CODE32&amp;lt;/code&amp;gt;的最后1字节处), 模拟执行的时间和需要执行的指令数目. 如果我们像样例一样忽略后两个参数, Unicorn将会默认以无穷时间和无穷指令数目的条件来模拟执行代码.&lt;br /&gt;
* 行号32~35: 打印输出&amp;lt;code&amp;gt;ECX&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;EDX&amp;lt;/code&amp;gt;寄存器的值. 我们使用函数&amp;lt;code&amp;gt;reg_read&amp;lt;/code&amp;gt;来读取寄存器的值.&lt;br /&gt;
&lt;br /&gt;
要想查看更多的python示例, 可以查看文件夹[https://github.com/unicorn-engine/unicorn/tree/master/bindings/python bindings/python]下的代码. 而C的示例则可以查看[https://github.com/unicorn-engine/unicorn/tree/master/samples sample]文件夹下的代码.&lt;br /&gt;
&lt;br /&gt;
== 参考链接 ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.unicorn-engine.org/ Unicorn Official Site]&lt;br /&gt;
* [http://www.unicorn-engine.org/docs/ Quick tutorial on programming with Unicorn - with C &amp;amp;amp; Python.]&lt;br /&gt;
&lt;br /&gt;
[[Category: Reverse_Overview]]&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>