Emulator

system_properties

        # Android
        self.system_properties = {"libc.debug.malloc.options": "",
                                  "ro.build.version.sdk": "24",
                                  "ro.product.cpu.abi": "armeabi-v7a",
                                  "init.svc.vbox86-setup": "",
                                  "init.svc.droid4x": ""}

这里设置了一些系统属性,使用的地方:

    @native_method
    def system_property_get(self, uc, name_ptr, buf_ptr):
        name = memory_helpers.read_utf8(uc, name_ptr)
        logger.debug("Called __system_property_get(%s, 0x%x)" % (name, buf_ptr))

        if name in self._emu.system_properties:
            memory_helpers.write_utf8(uc, buf_ptr, self._emu.system_properties[name])
        else:
            logger.warning('%s was not found in system_properties dictionary.' % name)
        #    raise ValueError('%s was not found in system_properties dictionary.' % name)

        return None
        modules.add_symbol_hook('__system_property_get', hooker.write_function(self.system_property_get) + 1)

        self.mu.mem_map(config.STACK_ADDR, config.STACK_SIZE)
        self.mu.reg_write(UC_ARM_REG_SP, config.STACK_ADDR + config.STACK_SIZE)

可以去config.py里面去修改大小,如果遇到不够用的情况的话。

Modules

解析elf的逻辑,有单独的系列了,不展开。

给so添加hook的逻辑也比较简单:

    def _elf_get_symval(self, elf, elf_base, symbol):
        if symbol.name in self.symbol_hooks:
            return self.symbol_hooks[symbol.name]

解析符号表的时候,会判断符号名是不是需要hook,如果需要直接返回了我们给的地址。这个地址会用来填需要重定位的符号位置。

InterruptHandler

用于处理中断:

        self._mu.hook_add(UC_HOOK_INTR, self._hook_interrupt)

参数中第一个参数 UC_HOOK_INTR 指明了 hook 类型是中断(interrupt)。第二个参数 self._hook_interrupt 是用户定义的回调函数,当中断事件发生时,Unicorn 会调用该函数。

回调函数会接收到一个 intno 参数,当该值为2的时候,

SyscallHandlers