Unicorn 框架使用疑问

2020-05-28  本文已影响0人  大发明家达文西

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

上一篇下一篇

猜你喜欢

热点阅读