用过fart的大佬都知道,拖出来的dex文件一般是需要修复一下的...
最近遇到一个apk需要脱壳,直接使用大神编译好的镜像刷入手机,脱壳一切顺利,上网搜了几个fart.py修复...
拖进jadx,开始分析代码:
我看到了这些:
于是我又修复了一边,然后,还是老样子...,此时我一脸懵逼!!!
到底哪里出现了问题???
难道加固又升级了吗,还是方法的inis没有拖出来,让我来打开bin文件看看
打开bin文件,随便找一条拖出来的ins看看是不是没有成功拖出来
{name:void com.*.AccountLockActivity$1.<init>(com.*.AccountLockActivity, android.app.Activity, boolean, java.lang.String),method_idx:2013,offset:5953880,code_item_len:28,ins:BQAFAAQAAAAUV5wABgAAAFsB/gBwQLshIEMOAA==}
解出来
050005000400000014579c00060000005b01fe007040bb2120430e00
然后手动贴到dex文件对应的偏移中,使用jadx打开正常了。
就是dex修复的python有问题了...
准备下载hanbing大佬的python看看,代码太复杂被劝退了,于是在github上冲浪了好久,发现了几个简单的脚本,研究了一下,发现就是简单的读取offset,然后把inis解码后写进去就好了,原理很简单,为什么就没修复正确呢?
重新观察一下bin文件
{name:void com.*.onError(java.lang.Throwable),method_idx:2014,offset:-1658796796,code_item_len:73,ins:BgACAAEAAQAAAAAAFgAAABIwIwCsJBIBTQQAARIRTQUAARIhEwNNAHEQPJEDAAwCTQIAAXEQggYAAA4AFQAAAAEAAQABAfosAA==}
这个的offset是负值,应该就是这个问题了
现在怎么办呢?拖出来的方法信息包括:
name, method_idx, offset, code_item_len, ins
似乎只能通过method_idx来确定了,打开一个正确的dex,先看看encoded_method:
可以通过method_idx_diff属性值的叠加计算出method_idx,尝试读取原始dex的code_off来获取正确的偏移,然后完成修复。
第一个问题,是否有python版本的dex文件结构解析脚本...
通过google终于找到了,感谢kaitaistruct
顺便找到了uleb128的解析python脚本
下来就是解析修复dex了
到这里就结束了,就可以尝试修复dex文件了
安装kaitaistruct
pip install --upgrade
git+https://github.com/kaitai-io/kaitai_struct_python_runtime.git
使用
python fart_fix_dex.py -d dexfile -b binfile
Android下的修复app
实现了一个Android版本的修复dex的app,基本原理与python版本一致,再次感谢KaitaiStruct,让我们有了java版本的dex文件解析方法。
https://github.com/sepyeight/FartDexFix.git
原文始发于微信公众号(映山红coin安全团队):脱壳后修复>fart脱壳后修复
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论