能力值:
( LV12,RANK:270 )
|
-
-
2 楼
例如内存动态加载,走的是Dalvik_dalvik_system_DexFile_openDexFile_bytearray,里面要调用addToDexFileTable在哪里下断点都能截到dex文件,只要能解size大小问题。 只要不自己运行时解析指令的话,这里应该都能拦到,或者盯着gDvm.userDexFiles,但gDvm.userDexFiles不是一直都有效的。 总之还是要动态解析指令啊,但是动态解析的方法不能做产品,稳定性太差了。
本来是希望能有人一起讨论一下,不过看来只能自言自语了。简单补充一下吧。由于本人刚刚转行做Android研究,如果说的哪里不对,欢迎指正
1. 有人说,你这种方法完全是侥幸,dex文件缺少的部分,刚好map到了dex原始内容的后面,使得多dump一段内存之后,就能获取完整的dex文件。
其实呢,要知道,在dex文件结构中,表示偏移的量都是unsigned的,也就是说只要定位到了dex文件头,那么剩余的数据,都是在文件头之后。同时呢,对于现在的Android系统而言,都是32位的,内存的寻址空间是4GB,去掉内核空间,忽略dex文件头之前的空间,假设dex文件头之后有2GB的内存可用(实际上远远小于这个值),那么我们完全可以从dex文件头开始,将之后的2GB空间完全dump出来,然后baksmali一下,再重新打包,新的完整dex文件就出来了。简单粗暴。
2. 根据上面这条方法,结论就是只要在内存中有完整的dex文件存在,那么就有很大可能被dump出来。那么对于这种情况怎么办呢?一种简单有效的办法就是在dex文件加载过程中(之后),将部分dex文件信息抹去,至于什么能抹,什么时候抹掉,这些就不能说了,有兴趣的可以自己尝试一下。
3. 另外一种方法,就是动态解密了。但是由于Android的碎片化严重,造成了方法的兼容性很差。动态解密的话,目前的想法是hook dalvik执行的handler,定位方法暴搜,不过兼容性~唉~~~
4. 大盗不操戈~那么操戈又该如何做呢? 简单地说,就是在gDvm里面有一个loadedClasses项,里面是一个HashTable,用来记录每一个已经加载的class,可以通过注入,把特定class的字节码dump出来,并进行解析。当然,这个工作很麻烦,但却是一种王道的方法,可以应对大部分情况。目前在研究,通过dump的方式,能否从gDvm里面自己拼出一个dex文件来。理论上应该是可以的,但代码尚未完成。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢 mk~
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
不错不错。很有意思啊
|
能力值:
( LV12,RANK:530 )
|
-
-
5 楼
谢谢分享
|
能力值:
( LV9,RANK:310 )
|
-
-
6 楼
感谢分享!
|
能力值:
(RANK:270 )
|
-
-
7 楼
纯动态的方法,漂亮!尤其喜欢标题。节后记得更新~
|
能力值:
( LV6,RANK:90 )
|
-
-
8 楼
楼主的方法给力,支持一下。
选过几个位置,刚加载,过程中,以及所有so加载完毕,到加载系统字体的位置,找出来的dex都不太完整。最后dump了1g+的数据,里面寻找完整dex无果,因为陷入思维定势,总是将0x20位置大小计算然后dump,没试过额外dump再baksmali,待回头测试下。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
mark 学习中
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
感谢分享,学习
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
dump无果后再往下找都是0的地方再dump,我怎么木有想过
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
mark....
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
正在学这个,太有用了…………
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
不懂额,感谢分享了
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
来发一个动态分析的~视频见
http://pan.baidu.com/share/link?shareid=4134563823&uk=4010119447
具体的原理在今年的互联网安全大会ISC 2014上讲过
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
mark,多谢楼主分享!
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
mark,thanks.
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
楼主写的深入浅出,受教
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
在第3步attach com.ali.encryption后IDA处于 "Searching for crypto constants..."的状态,点取消后停在 libc.so下图位置
然后“jdb -connect ....”
F9后发现libmobisec.so开始加载,但是IDA并没有停下来…,下图
Debug options中按以前 http://bbs.pediy.com/showthread.php?t=178659 这个帖子中的设置
请问有人遇到这样的问题了吗? 补充:IDA-pro-plus-6.5
|
能力值:
( LV12,RANK:1000 )
|
-
-
20 楼
这IDC脚本怎么执行没反应
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
标记,多谢分享。
|
能力值:
( LV12,RANK:270 )
|
-
-
22 楼
应该是IDA版本的问题。可以尝试在libdvm.so的dvmLoadNativeCode函数下断点,对照源码,在调用dlopen之后,在so里面下断点
|
能力值:
( LV12,RANK:270 )
|
-
-
23 楼
在IDA的output window里面会有提示信息,看那个就行了。
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
非常的棒,,,,顶上,。。。
|
能力值:
( LV12,RANK:1000 )
|
-
-
25 楼
楼主能否告知一下,你的AVD的配置,例如Target Name/Platform/API Level/CPU/ABI
我试了很多种,程序启动时解密都是失败,直接奔溃退出,就看到了个标题栏。还有那个IDC脚本,应该是要动态调试解密成功后运行才有效。现在不懂安卓就等于不懂逆向,所以学习一下还是必须的。
|
|
|