Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

无效 #4

Open
Gunkkk opened this issue Apr 27, 2021 · 13 comments
Open

无效 #4

Gunkkk opened this issue Apr 27, 2021 · 13 comments

Comments

@Gunkkk
Copy link

Gunkkk commented Apr 27, 2021

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

@Gunkkk
Copy link
Author

Gunkkk commented Apr 27, 2021

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

@luoyesiqiu
Copy link
Owner

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

@Gunkkk
Copy link
Author

Gunkkk commented Apr 28, 2021

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

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

@luoyesiqiu
Copy link
Owner

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

@Gunkkk
Copy link
Author

Gunkkk commented Apr 28, 2021

eWFud2VuZHJlYW1AMTYzLmNvbQ==

已发送

@luoyesiqiu
Copy link
Owner

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

@Gunkkk
Copy link
Author

Gunkkk commented Apr 29, 2021

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

大佬🐂

@luoyesiqiu
Copy link
Owner

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

@Gunkkk
Copy link
Author

Gunkkk commented Apr 29, 2021

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

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

@luoyesiqiu
Copy link
Owner

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

@Gunkkk
Copy link
Author

Gunkkk commented May 1, 2021

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

您好,
阅读了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结构破坏,不知道是我哪里理解错了

谢谢

@luoyesiqiu
Copy link
Owner

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

@Gunkkk
Copy link
Author

Gunkkk commented May 2, 2021

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants