luoyesiqiu/DexRepair

无效

Gunkkk opened this issue · 13 comments

瞬间执行完成all done, 并没有merge进去

log显示 offset问题但fart提供的替换是能够成功的
Skip invalid offset

  1. dump下来bin是否有函数信息?
  2. bin里的函数信息偏移是否正确?
  1. dump下来bin是否有函数信息?
  2. bin里的函数信息偏移是否正确?

有的 用fart.py是可以复原出smali的
offset确实比文件大,可能壳把dexitem拿出来导致的,也就是说这种直接的找offset插入好像不太能应对这种情况
至于fart.py为什么可以复原还没有仔细研究过代码

方便提供一下dex和bin吗,不想在这里发可以私发我邮箱:eWFud2VuZHJlYW1AMTYzLmNvbQ==

eWFud2VuZHJlYW1AMTYzLmNvbQ==

已发送

收到了,也想到了一种更好的方案,后续会把这个代码给写出来

收到了,也想到了一种更好的方案,后续会把这个代码给写出来

大佬🐂

尽力了...你导出的bin有问题,字节码比原本的区段长

尽力了...你导出的bin有问题,字节码比原本的区段长

确实用的原版frida脚本导出的,原版复原脚本可以还原出来,具体是什么问题还没有对dex仔细研究过
现在这个版本是解决了吗
辛苦啦 🙏

现在是能合进去,但是不能完全合进去,还得继续研究

现在是能合进去,但是不能完全合进去,还得继续研究

您好,
阅读了fart.py之后发现了如下问题:
methoditem结构:

名称 | 格式 | 说明
-- | -- | --
registers_size | ushort | 此代码使用的寄存器数量
ins_size | ushort | 此代码所用方法的传入参数的字数
outs_size | ushort | 此代码进行方法调用所需的传出参数空间的字数
tries_size | ushort | 此实例的 try_item 数量。如果此值为非零值,则这些项会显示为 insns 数组(正好位于此实例中 tries 的后面)。
debug_info_off | uint | 从文件开头到此代码的调试信息(行号 + 局部变量信息)序列的偏移量;如果没有任何信息,则该值为 0。该偏移量(如果为非零值)应该是到 data 区段中某个位置的偏移量。数据格式由下文的“debug_info_item”指定。
insns_size | uint | 指令列表的大小(以 16 位代码单元为单位)
insns | ushort[insns_size] | 字节码的实际数组。insns 数组中的代码格式由随附文档 Dalvik 字节码指定。请注意,尽管此项被定义为 ushort 的数组,但仍有一些内部结构倾向于采用四字节对齐方式。此外,如果此项恰好位于某个字节序交换文件中,则交换操作将只在单个 ushort 上进行,而不在较大的内部结构上进行。
padding | ushort(可选)= 0 | 使 tries 实现四字节对齐的两字节填充。只有 tries_size 为非零值且 insns_size 是奇数时,此元素才会存在。
tries | try_item[tries_size](可选) | 用于表示在代码中捕获异常的位置以及如何对异常进行处理的数组。该数组的元素在范围内不得重叠,且数值地址按照从低到高的顺序排列。只有 tries_size 为非零值时,此元素才会存在。
handlers | encoded_catch_handler_list(可选) | 用于表示“捕获类型列表和关联处理程序地址”的列表的字节。每个 try_item 都具有到此结构的分组偏移量。只有 tries_size 为非零值时,此元素才会存在。

可见除了insns还有padding tries handlers 这三部分 您的解析方式是通过dex.offset+16作为插入位置, (而fart存入bin的ins似乎是整个codeitem)dex.readCode(method).getInstructions().length作为插入长度 这部分长度是不是会包含tries部分呢?
但现在尝试过后 直接插在offset的位置会导致整个class结构破坏,不知道是我哪里理解错了

谢谢

dex.readCode(method).getInstructions()得到的字节码是包含tries部分的,强行插入导致class被破坏的原因是bin中的ins的长度比dex中的insns_size要长

dex.readCode(method).getInstructions()得到的字节码是包含tries部分的,强行插入导致class被破坏的原因是bin中的ins的长度比dex中的insns_size要长

重新试了下 用dex.readCode(method).getInstructions().length作为插入位置, bin 中长度作为插入长度之后 修复的文件还原出了很多函数

不知道您用您自己的数据试验过后如何