首页
社区
课程
招聘
[原创]基于IDA Python的Dex Dump
2015-10-27 13:43 16247

[原创]基于IDA Python的Dex Dump

2015-10-27 13:43
16247
之前写过一个基于IDA Python的dump dex脚本,但是是重新对dex文件结构进行解析,代码量大且复杂,参考了[DexHunter](https://github.com/zyq8709/DexHunter)之后,对代码进行了大幅修改,直接可以砍掉一半以上的代码。

同时参考[伪·MSC解题报告](http://bbs.pediy.com/showthread.php?t=197244),作者提出了一种基于gDvm获取cookie的办法。我采用的办法是通过IDA的module模块找到libdvm.so->dvminternalnatimeshutdown(保证光标停留在该函数的第一行即可),然后运行 findcookie.py,从控制台的输出中找到合适的DexFile address(通常有多个,通过name进行判断),修改dump2.py中倒数5行的address,然后运行dump2.py。具体使用方案可以见Github

代码见:
https://github.com/CvvT/dumpDex

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (13)
雪    币: 107
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Fido 2015-10-27 14:11
2
0
学习一下..............................
雪    币: 709
活跃值: (2295)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2015-10-27 16:13
3
0
楼主请教几个问题:

问题(1)

脚本中的类ClassdataItem调用dump方法将内存中加固的dex数据的部分内容填充到DexClassData*结构体指针中,类似于DexHunter中的函数ReadClassData
对于成员变量数组 DexField.fieldIdx 和 DexMethod.methodIdx,这些应该是相对偏移


比如这个
class Encodedfield:
    def __init__(self):
        self.len = 0
        self.field_idx_diff = 0
        self.access_flags = 0
        self.field_idx = 0      # need to set later

    def dump(self, addr):
        self.[COLOR="Blue"]field_idx_diff, length = readunsignedleb128(addr) [COLOR="Blue"]//读取到的是相对偏移
        self.len += length
        self.access_flags, length = readunsignedleb128(addr + self.len)
        self.len += length


而android源码中函数dexReadClassDataField的实现都用到一个lastIndex,这是绝对偏移

DEX_INLINE void dexReadClassDataField(const u1** pData, DexField* pField,
        u4* lastIndex) {
    u4 index =[COLOR="Blue"] *lastIndex + readUnsignedLeb128(pData);

    pField->accessFlags = readUnsignedLeb128(pData);
    [COLOR="Blue"]pField->fieldIdx = index;
    *lastIndex = index;
}


2015-10-27 16:35:54 更新
已经理解:
磁盘上的dex文件中的DexField.fieldIdx 和 DexMethod.methodIdx是相对偏移
而android源码在 loadClassFromDex0 函数中会调用 dexReadClassDataField 将磁盘上dex结构中的这个相对偏移转换成绝对偏移,仅仅是为了取得当前结点的类对应的成员名字、类型名字等信息,以便填充 pDvmDex-->newClass (ClassObject : Object)的成员

InstField*      ifields;
StaticField     sfields[0];
Method*         directMethods;
Method*         virtualMethods;

所以无论在磁盘上,还是在内存中,这个地方都是相对偏移,直接读取内存按格式解析后组装成DexClassData*结构体再按照leb编码写入到"classdef"文件块即可。
自己犯二了,一直纠结这个相对&绝对偏移的问题,实则是被系统源码误导了,问题1结贴!

问题(2)

(a)DexHunter是在系统加载类时会经过函数Dalvik_dalvik_system_DexFile_defineClassNative的时候做重构DEX处理,存在时机问题。
(b)楼主的脚本是通过另外一个脚本定位到想脱壳的DEX的内存地址,然后进行重构, 不存在时机问题。


我看DexHunter帖子中有跟帖说腾讯的壳用dexhunter脱出来的还是加固后的dex。

这是否和时机有关?
加固程序是不是在此函数执行后,才进入so里面做了二次解密?(如果是这样,那用楼主的脚本在等待加固程序解密完毕后是不是就可以dump了?)
脱壳时机难道就这一个函数点吗?
还有其他位置可以套用这套脱壳逻辑不?

(dalvik的源码只看了一部分,所以还不是很清楚load dex的整个流程的具体细节,所以问下时机问题)


这种方法没法对抗函数运行时解密吧?我搜索了一下去年阿里比赛,有个XX大学的团队基于dalvik的源码做了一个动态监控的东西,可以对这种运行时解密进行监控,能否提点一二。

android刚入门没几天,望指点
雪    币: 141
活跃值: (39)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
習生 1 2015-10-27 17:04
4
0
hi,能留个联系方式么。。关于这个工具的
雪    币: 8
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qgesxcwt 2015-10-27 20:26
5
0
你好认真啊!因为是基于IDA python所有只能获得已经在内存中的部分,像tecent这种运行时解密的确实无能无力。其实我没试过dexhunter和indroid,懒得编译。。我写过另外一个基于Xposed的dex dump你也可以在我的github上找到,是可以脱tecent的壳
只有对于那些在某一时刻内存中具有完整dex结构的才需要关心脱壳时机,像tecent尤其baidu这种其实是不存在,baidu会在运行时解密并在该方法调用完成后立刻擦除,当然也是有一些办法对抗的,最近正在尝试,成功的话分享给大家
雪    币: 8
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qgesxcwt 2015-10-27 20:33
6
0
有什么问题可以直接在看雪上问我经常来逛。姑且留个邮箱:cwt965@163.com
(一看163就知道我不会经常去看。。。。)
雪    币: 8
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qgesxcwt 2015-10-27 21:11
7
0
啰嗦一句,你不小心启发了我。tecent相比baidu是没有擦除这一步的,理论上来说只要你触发了所有解密操作,那么需要的东西都已经在内存中了,只是有些地址偏移不好获得。有一点思路了就把它当作我的version3.0好了
雪    币: 709
活跃值: (2295)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2015-10-27 22:05
8
0
多谢,刚学安卓安全没几天,看了看dex加固什么的,有很多问题可能比较肤浅
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxd小飞 2015-12-16 23:19
9
0
你好 能否留一个联系方式找你看一个python程序
雪    币: 218
活跃值: (193)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SANCDAYE 2015-12-17 09:45
10
0
不错支持一下子
雪    币: 18
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
deadxing 2015-12-17 10:34
11
0
好帖,顺便学习一下py
雪    币: 614
活跃值: (698)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
eastmaster 2015-12-20 16:21
12
0
厉害啊,以前早就想找这么个东西了!
雪    币: 8
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qgesxcwt 2015-12-24 17:51
13
0
cwt965@163.com
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
zyqqyz 1 2016-4-15 20:11
14
0
DexHunter中时机是核心点之一,ppt中详细进行了讨论包括时机的选取,包括动态method指令的处理在github中的注释也有说明。你说的是上交的工具,是进行指令插桩实现的,与DexHunter的思路不一样。
游客
登录 | 注册 方可回帖
返回