# 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里面去修改大小,如果遇到不够用的情况的话。
解析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,如果需要直接返回了我们给的地址。这个地址会用来填需要重定位的符号位置。
用于处理中断:
self._mu.hook_add(UC_HOOK_INTR, self._hook_interrupt)
参数中第一个参数 UC_HOOK_INTR 指明了 hook 类型是中断(interrupt)。第二个参数 self._hook_interrupt 是用户定义的回调函数,当中断事件发生时,Unicorn 会调用该函数。
回调函数会接收到一个 intno 参数,当该值为2的时候,