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 的应用 https://bbs.pediy.com/thread-253868.htm