逆向分析dex的话,个人还是比较中意VTS,JEB(穷人买不起),IDA等。之前有尝试使用过androguard,感觉还是不咋习惯,虽然基于其基础上演变的一些项目挺有吸引力。不过作为项目的基础,androguard确实再适合不过了。至少静态分析很多功能直接调用或者在其上修改效果倒是事半功倍。也正因为这个目的,才有了第二篇体验。
其实官网的wiki写的很详细了,包括一些使用方法,api参考,都挺丰富的。但是官网提供的demo不多,我觉得通过对androlyze.py的一些常见功能的使用,可以帮助我们完善程序demo。这一篇主要内容正是介绍androlyze.py的一些使用样例,官网 wiki http://code.google.com/p/androguard/wiki/RE
这次采用的样本还是之前第一篇分析的。这次借助分析触发sendsms的条件作为例子,记录一下关于androlyze.py部分的一些常用函数。
首先,./androlyze.py -s 进入交互分析界面
1. apk, d, dx = AnalyzeAPK("./sampleapk/ee6bcd35c.apk",decompiler="dad") 开启分析模式吧,接着先查看对应apk使用了哪些权限,可以采用 apk.get_permissions() 获取权限
2.知道可能使用的权限之后,我们接下来看看对应权限时候有使用吧,这时候可以用 show_Permissions(dx) 查看对应权限的使用点
内容比较多,我就列出SENDSMS的部分
根据输出我们可以知道,Lcom/zsh/RegService;->sendSms()V 是对应SEND_SMS权限使用点。
3.这时候可以使用d.CLASS_Lcom_zsh_RegService.METHOD_sendSms.source() 查看对应源代码,确实使用了发短信的函数。
4.接下来我们就要根据这个使用点找到之前的调用点,一步一步回溯找到触发这个时间的入口点可以使用 d.CLASS_Lcom_zsh_RegService.METHOD_sendSms.show_xref() 查找这个函数的调用关系,有的步骤直接省略了,组后找到是由MainTask线程触发的。
那么最后是那个函数调用了这个线程呢,由于这是了run,写过代码都知道,一般是创建了线程对象之后,start开始的,这是后run才启用,那么我们就找一下创建该线程对象的调用点吧。
确定了是由这个服务的回调产生的,那么确定一下这个类是不是真的是服务吧。
这么一条命令可以查看对应的类信息。可以看出确实是继承Service的。
5.走到这一步了,剩下就是考虑是那个intent触发这个service的,从androidmenifest开始吧,使用命令,可以通过 x = apk.xml xml = x[‘AndroidManifest.xml‘] 以及
In [109]: for e in xml.getElementsByTagName(‘service‘):
.....: print e.toxml() 获取service信息
6.可以想象会有一个intent,他的action为com.zsh.action.regservice,那么我们就开始查找对应的字符串引用吧 z = dx.tainted_variables.get_string(‘com.zsh.action.regservice‘)
7.最后我们发现 apk.get_main_activity() 正是入口
那么我们关于这个程序的短息调用路径大致摸清楚了~
开源静态分析工具androguard体验(二),布布扣,bubuko.com
原文:http://blog.csdn.net/xbalien29/article/details/28007547