美文网首页
Unicorn 框架使用疑问

Unicorn 框架使用疑问

作者: 大发明家达文西 | 来源:发表于2020-05-28 11:29 被阅读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

    相关文章

      网友评论

          本文标题:Unicorn 框架使用疑问

          本文链接:https://www.haomeiwen.com/subject/iljoahtx.html