续上次,在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:Python27libsite-packagesunicornunicorn.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。附成功截图(在写入时没有报错):