使用Unicorn-engine 续1
续上次,在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。附成功截图(在写入时没有报错):

使用Unicorn-engine 续1的更多相关文章
- QLGame 2D Engine编写环境搭建
QLGame 2D Engine编写 (win7环境搭建) 广州麒麟网络工作室,计划制作一款2d game engine,基于opengl(es)平台,暂时支持android,以后考虑支持linux, ...
- Cloud Engine
Cloud Engine:大杀器如何炼成 郑昀 创建于2016/6/18 最后更新于2016/6/19 点击查看我的<如何从零搭建一个技术平台>,这是一个系列.转载时请注明“转载自旁观 ...
- 游戏音频技术备忘 (五)Wwise Unreal Engine 集成代码浅析 二
AkAmbientSound类的实现 Unreal Engine提供了一个基本对象的构造器ObjectInitializer,一般来说用户创建的类总是拥有很多变量,因此 AkAmbientSound ...
- 黑科技抢先尝(续2) - Windows terminal中Powershell Tab的极简美化指南
目录 安装python 安装git 安装powerline字体 主题定制 安装oh-my-posh 查看策略组的执行权限 使用choco 安装终端模拟器 - ConEmu 优化 PowerShell ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- express路由探析(续)
上一篇分析了express的路由机制,这次主要补充一些没有说到的东西. 之前说到,Router是中间件容器,Route是路由中间件,他们各自维护一个stack数组,里面存放layer,layer是封装 ...
- ArcGIS Engine开发之图形查询
图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...
- ArcGIS Engine开发之属性查询
属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作. 相关的类与接口 与属性查询功能相关的类主要有QureyFi ...
随机推荐
- ios打包应用程序,生成ipa文件
假设我的程序调试好了,怎么才干发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,可是我们没有证书,这样输出会产生错误. 以下教你怎样生成ipa文件: 1.到你当前proje ...
- Centos 7 python升级(2.7.5-》2.7.11)
1.安装升级GCC yum install gcc* openssl openssl-devel ncurses-devel.x86_64 bzip2-devel sqlite-devel pyth ...
- System.AccessViolationException: 尝试读取或写入受保护的内存 解决办法
netsh winsock reset --运行此命令解决 错误描述: 之前装的vs2010后 再又安装了vs2013 ,运行之前的vs2010项目 就出现以上错误 错误应用程序名称: w3wp. ...
- Func 委托 和 Action 委托 初步谈论
继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托. msdn对于两者的解释: Func<TResult>:封装一 ...
- Know Thy Complexities!
http://bigocheatsheet.com/ Hi there! This webpage covers the space and time Big-O complexities of c ...
- String()与toString()区别和应用
首先,String()和toString()方法都是将其它类型的变量转换为字符串的方法.但两者存在一定的区别: x.toString(): 无法转换null和undefined: 来看下面的小例子: ...
- 关于onpropertychange与oninput的兼容问题
关于onpropertychange与oninput的用法,网上一大堆,但还是有不兼容的时候,比如说,我想计下,一个input的值改变了多少次,如果写成兼容写法就为 <!doctype html ...
- spl_autoload_register()
5.3版本增加了命名空间prepend函数 <?php // function __autoload($class) {// include 'classes/' . $class ...
- PXE简要配置过程
目录 1.所需服务 2.简要配置过程 1.dhcp服务 2.tftp服务 3.提供pxelinux.0配置文件 4.提供系统所需文件 1.所需服务: dhcp服 ...
- c++基础五个题(二)
一.c++中static的作用 1.隐藏:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,static函数作用就是为了隐藏 2.可以保持变量的持久:存储在静态数据区的变 ...