能力值:
( LV2,RANK:10 )
|
-
-
2 楼
学习一下..............................
|
能力值:
( LV12,RANK:1010 )
|
-
-
3 楼
楼主请教几个问题:
问题(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刚入门没几天,望指点
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
hi,能留个联系方式么。。关于这个工具的
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
你好认真啊!因为是基于IDA python所有只能获得已经在内存中的部分,像tecent这种运行时解密的确实无能无力。其实我没试过dexhunter和indroid,懒得编译。。我写过另外一个基于Xposed的dex dump你也可以在我的github上找到,是可以脱tecent的壳
只有对于那些在某一时刻内存中具有完整dex结构的才需要关心脱壳时机,像tecent尤其baidu这种其实是不存在,baidu会在运行时解密并在该方法调用完成后立刻擦除,当然也是有一些办法对抗的,最近正在尝试,成功的话分享给大家
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
有什么问题可以直接在看雪上问我经常来逛。姑且留个邮箱:cwt965@163.com
(一看163就知道我不会经常去看。。。。)
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
啰嗦一句,你不小心启发了我。tecent相比baidu是没有擦除这一步的,理论上来说只要你触发了所有解密操作,那么需要的东西都已经在内存中了,只是有些地址偏移不好获得。有一点思路了就把它当作我的version3.0好了
|
能力值:
( LV12,RANK:1010 )
|
-
-
8 楼
多谢,刚学安卓安全没几天,看了看dex加固什么的,有很多问题可能比较肤浅
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
你好 能否留一个联系方式找你看一个python程序
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
不错支持一下子
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
好帖,顺便学习一下py
|
能力值:
( LV3,RANK:30 )
|
-
-
12 楼
厉害啊,以前早就想找这么个东西了!
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
cwt965@163.com
|
能力值:
( LV5,RANK:60 )
|
-
-
14 楼
DexHunter中时机是核心点之一,ppt中详细进行了讨论包括时机的选取,包括动态method指令的处理在github中的注释也有说明。你说的是上交的工具,是进行指令插桩实现的,与DexHunter的思路不一样。
|
|
|