使用Unicorn-engine 续1
2016-05-24 16:39
246 查看
续上次,在ubuntu server 14.04交叉编译好后,下一步就是在windows上使用了。
在windows上,我主要是用python进行分析程序,因此我最初安装的是官网上的 unicorn-0.9-python2.7-win32.exe。至于我为什么要用32位的版本,因为64位的版本不能在IDAPython里使用,就像下面:
后来,我干脆统一了IDA是32位的程序,python是32位的,unicorn也是32位的,这样的话在IDAPython里可以使用unicorn了。
安装unicorn-0.9-python2.7-win32.exe会在site-packages目录下存在以下dll:
他们的依赖关系如下(用dependency walker看的):
在python2.7/Lib/site-packages/unicorn.py里也看到定义了这些动态链接库的加载顺序:
下面我来讲下官网上的unicorn-0.9-python2.7-win32.exe有什么bug,导致我去自己编译源码。
问题是这样的:
Example 1:
Error:
Python>uc = Uc(UC_ARCH_X86, UC_MODE_64)
Python>uc.mem_map(0x19000c000,0x1000)
Python>uc.mem_write(0x19000c000, '\x00')
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\site-packages\unicorn\unicorn.py", line 232, in mem_write
raise UcError(status)
unicorn.unicorn.UcError: Invalid memory write (UC_ERR_WRITE_UNMAPPED)
Correct:
Python>uc.mem_map(0x9000c000,0x1000)
Python>uc.mem_write(0x9000c000, '\x00')
Python>
我使用的是UC_MODE_64,但是发现mem_map的时候地址只能在32位内,大于32位的地址将会在往地址写内容时报错。在测试时发现,如果指令的地址在32位以上,也不能模拟执行,那这个UC_MODE_64就感觉没什么用了。
我在Github上发现,有人已经提出这个问题了,而且给出了对源代码的修改方案,并进行了pull request。链接:https://github.com/unicorn-engine/unicorn/issues/523 代码还没有被合并到主分支里,所以如果直接从github上下载的话,还是有问题的,所以要自己手动的去修改。
编译完成后,按照github上的说明,我主要使用的是unicorn python bindings,在bings/python目录下,运行python setup.py install进行安装。
同时将编译完成的unicorn.dll,/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libglib-2.0-0.dll,/usr/lib/gcc/x86_64-w64-mingw32/4.8/libgcc_s_sjlj-1.dll,/usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll拷贝到Lib/site-packages/unicorn目录下就可以了。他们的依赖关系是这样的:
因此,我们修改下unicorn.py里定义的动态链接库加载顺序。
到此,完工,可以完美使用了,并且解决了bug。附成功截图(在写入时没有报错):
在windows上,我主要是用python进行分析程序,因此我最初安装的是官网上的 unicorn-0.9-python2.7-win32.exe。至于我为什么要用32位的版本,因为64位的版本不能在IDAPython里使用,就像下面:
后来,我干脆统一了IDA是32位的程序,python是32位的,unicorn也是32位的,这样的话在IDAPython里可以使用unicorn了。
安装unicorn-0.9-python2.7-win32.exe会在site-packages目录下存在以下dll:
他们的依赖关系如下(用dependency walker看的):
在python2.7/Lib/site-packages/unicorn.py里也看到定义了这些动态链接库的加载顺序:
下面我来讲下官网上的unicorn-0.9-python2.7-win32.exe有什么bug,导致我去自己编译源码。
问题是这样的:
Example 1:
Error:
Python>uc = Uc(UC_ARCH_X86, UC_MODE_64)
Python>uc.mem_map(0x19000c000,0x1000)
Python>uc.mem_write(0x19000c000, '\x00')
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\site-packages\unicorn\unicorn.py", line 232, in mem_write
raise UcError(status)
unicorn.unicorn.UcError: Invalid memory write (UC_ERR_WRITE_UNMAPPED)
Correct:
Python>uc.mem_map(0x9000c000,0x1000)
Python>uc.mem_write(0x9000c000, '\x00')
Python>
我使用的是UC_MODE_64,但是发现mem_map的时候地址只能在32位内,大于32位的地址将会在往地址写内容时报错。在测试时发现,如果指令的地址在32位以上,也不能模拟执行,那这个UC_MODE_64就感觉没什么用了。
我在Github上发现,有人已经提出这个问题了,而且给出了对源代码的修改方案,并进行了pull request。链接:https://github.com/unicorn-engine/unicorn/issues/523 代码还没有被合并到主分支里,所以如果直接从github上下载的话,还是有问题的,所以要自己手动的去修改。
编译完成后,按照github上的说明,我主要使用的是unicorn python bindings,在bings/python目录下,运行python setup.py install进行安装。
同时将编译完成的unicorn.dll,/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libglib-2.0-0.dll,/usr/lib/gcc/x86_64-w64-mingw32/4.8/libgcc_s_sjlj-1.dll,/usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll拷贝到Lib/site-packages/unicorn目录下就可以了。他们的依赖关系是这样的:
因此,我们修改下unicorn.py里定义的动态链接库加载顺序。
到此,完工,可以完美使用了,并且解决了bug。附成功截图(在写入时没有报错):
相关文章推荐
- typedef与#define的区别
- JPA query 基本语法解释
- ACM--两圆交集的面积--HDOJ 1798--Tell me the area
- JS+Canvas绘制时钟效果
- xlsxwriter使用啊
- 主题样式切换代码:jQuery Theme Switcher
- 低权重网站通过外链获得流量的办法
- 二位数组的排序
- R语言学习之路(一)向量
- WebViewJavascriptBridge工程结构和源码解析
- 页面速度优化个人总结
- linux上安装Eclipse
- 练习 2:高斯分布,正态分布
- java小知识点 2015/10/6
- 操作系统 面试资料
- scala的内部类和外部类
- 小米线刷机教程
- Java网络编程笔记
- java连接连接数据库、分析分析身份证号
- Dex Loader] Unable to execute dex: Multiple dex files define Lde/measite/smack/AndroidDebugger$1;异常处