dobby 的inlinehook,通过取出一页,插入跳转到新方法的汇编代码,然后 通过 mach_vm_remap 方法进行实现
PUBLIC MemoryOperationError CodePatch(void *address, uint8_t *buffer, uint32_t buffer_size) {
// 新创建一页,用于在新创建的页上patch 代码
addr_t remap_dummy_page =
(addr_t)mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, VM_MAKE_TAG(255), 0);
if ((void *)remap_dummy_page == MAP_FAILED)
return kMemoryOperationError;
// 复制原来的页到新创建页上
memcpy((void *)remap_dummy_page, (void *)page_aligned_address, page_size);
// 将需要插入的汇编代码,插入到新页指定地址
memcpy((void *)(remap_dummy_page + offset), buffer, buffer_size);
// 改变新页的权限为可读写
mprotect((void *)remap_dummy_page, page_size, PROT_READ | PROT_WRITE);
// 获取需要被替换的页地址
mach_vm_address_t remap_dest_page = (mach_vm_address_t)page_aligned_address;
vm_prot_t curr_protection, max_protection;
// 为当前进程,使用 mach_vm_remap 方法,使用新页 remap_dummy_page 替换 remap_dest_page 老页
kr = mach_vm_remap(self_port, (mach_vm_address_t *)&remap_d

本文探讨了Dobby的inlinehook实现方式,通过修改内存页并插入跳转汇编代码,利用mach_vm_remap系统调用在越狱的iOS设备上实现。在越狱状态下,该技术能够成功启动应用;而在非越狱环境下,由于代码签名验证失败,应用会收到SIGKILL信号导致启动失败。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



