unicorn模拟android,Unicorn 框架使用疑问

Unicorn 框架主要用于对主流CPU指令,如Arm、x86、misp,进行模拟运行。 其中一个 Unicorn 实现名为 AndroidNativeEmu,可以模拟调用 Android jni 接口。

在使用 AndroidNativeEmu 框架的时候发现一些问题,比如首先需要加载被模拟的 so 库文件,代码如下:

lib_module = emulator.load_library("example_binaries/libnative-lib_jni.so")

在 load_library 函数最终会调用 pyelftools 库里的 load_module 函数来重定位,代码如下:

def load_module(self, filename):

logger.debug("Loading module '%s'." % filename)

......

rel_section = None

# 找类型为 SHT_RELA 的 section

for section in elf.iter_sections():

if not isinstance(section, RelocationSection):

continue

rel_section = section

break

......

但 Android 在加载 so 的时候根本不会根据 section 来操作内存,而是直接通过 segment ,遇到以下这样,section header 被删去重定位信息的so,就懵逼了,代码就会抛出异常:

Section Headers:

[Nr] Name Type Addr Off Size ES Flg Lk Inf Al

[ 0] emcpy DYNAMIC 00008dd4 008dd4 000110 08 WA 1 0 4

[ 1] xa_atexit STRTAB 000008a4 0008a4 00075e 00 A 0 0 1

Key to Flags:

W (write), A (alloc), X (execute), M (merge), S (strings), I (info),

L (link order), O (extra OS processing required), G (group), T (TLS),

C (compressed), x (unknown), o (OS specific), E (exclude),

y (purecode), p (processor specific)

按照参考文章的解决办法是加一段代码:

ELF 文件有两种视图,链接视图和执行视图。elftools 是基于链接视图解析ELF格式的,然而现在有一些ELF文件的section信息是被抹掉的,elftools就无法正常工作,我也没时间重写一个elf loader,就只能凑合用一下elftools。

我在源码中也看到了这段代码,不过仍然报错,好像没看到解决此问题的地方。

你可能感兴趣的:(unicorn模拟android,Unicorn 框架使用疑问)