androguard 功能分析与定制

0x00 前言

androguard是一款非常棒的开源Android APK静态分析工具;使用Python开发;androguard只能在Linux环境运行,因为它使用的几个python库仅支持Linux平台。并且由于复杂的库依赖,在Linux环境的安装也较困难;好消息是santoku已经集成了它,不用我们再折腾,androguard安装在santoku的/usr/share/androguard目录;下面分析其主要功能,并开发一些额外的实用功能;

相关链接:
https://github.com/androguard/androguard/
https://santoku-linux.com/

0x01 模块介绍

1.androapkinfo.py

用来查看apk文件信息,该工具输出apk文件的包、资源、权限、组件、方法等信息。使用方法:

./androapkinfo.py -i ./demo.apk

2.androxml.py

用来解密apk包中的AndroidManifest.xml文件。使用方法:

./androxml.py -i ./demo.apk

3.androcsign.py

用于添加apk文件的签名信息到一个数据库文件,其所有目录为signatures/dbandroguard。使用前首先要为apk编写一个sign文件,这个文件使用json格式保存。、
 [
     {
         "SAMPLE":"apks/demo.apk"
     },
     {
         "BASE":"AndroidOS",
         "NAME":"DroidDeram",
         "SIGNATURE":[
             {
                 "TYPE":"METHSIM",
                 "CN":"Lcom/droider/demo/MainActivity$SNChecker;",
                 "MN":"isRegistered",
                 "D":"()Z"
             }
         ],
         "BF":"0"
     }
 ]

使用方法:

./androcsign.py -i signatures/demo.sign -o signatures/dbandroguard

4.androdd.py

用于生成apk文件中,每个类的方法的调用流程图。使用方法:

./androdd.py -i ./demo.apk -o ./out -d -d PNG

5.androdiff.py

比较两个apk文件的差异。使用方法:

./androdiff.py -i ./demo.apk ./demo2.apk

6.androdump.py

用于dump一个linux进程的信息。使用方法:

./androdump.py -i pid

7.androgexf.py

用于生成apk的gexf格式的图形文件,该文件可以使用Gephi软件查看。使用方法:

./androgexf.py -i ./demo.apk -o ./demo.gexf

8.androlyze.py

交互式的Android静态分析程序,功能特别多。具体可以参考coreanalysis和corebytecodes下的代码。以及Xbalien的相关使用介绍。

9.andromercury.py

andromercury.py是Mercury工具的框架。功能上是对Mercury的包装。内网实验室的社区网站上有8篇2013年发的Mercury的使用介绍,已经使用,功能比较丰富。

10.androrisk.py

用于评估apk的潜在风险,最后会得出一个分。ICSL_androguard中使用了这个模块的分析结果。

11.androsign.py

用于检测apk的签名信息是否在数据库里,与androcsign.py功能恰好相反。

12.androsim.py

用于计算两个apk文件的相似度。是个开源的库。网上相关资料比较少,在androguard老的google source code网站wiki里面有介绍。

13.androxgmml.py

用于生成apk/jar/class/dex等文件的控制流程及功能调用图,生成格式为xgmml。使用方法:

./androxgmml.py -i ./demo.apk -o ./demo.xgmml

14.apkviewer.py

为apk文件中每个类生成一个独立的graphhml文件,可以使用Gephi查看。使用方法:

./apkviewer.py -i ./demo.apk -o ./output

0x02 androguard DIY

我们接下来将开发或适配下列功能:

  • 组件Activities,Services,Content Providers、Broadcast Receivers
  • Permissions 及对应使用代码
  • 敏感 APIs 监控
  • URL、IP、口令、加解密算法等信息监控
  • 检查动态注册的 Receivers
  • 检测 AllowBackup、Debuggable、ShareUserId、用户自定义权限
  • risk 评分

0x03 Code Show

下面记录一些关键代码实现:

一、敏感 API 调用

def show_Sensitive_APIs(dx):
    for i in Sensitive_APIs:
        print " ",i,Sensitive_APIs[i][0],Sensitive_APIs[i][1]
        paths = dx.get_tainted_packages().search_methods( Sensitive_APIs[i][0],Sensitive_APIs[i][1],".")
        show_Paths(dx.get_vm(), paths )
Sensitive_APIs = { 
    #log
    #0 : [ "Landroid/util/Log;","d"],
    #send sms
    1: ["Landroid/telephony/SmsManager;","sendTextMessage"],
    #read sms
    2: [".","getDisplayMessageBody"],
    3: [".","getMessageBody"],
    #IMEI
    4: ["Landroid/telephony/TelephonyManager;","getDecicedID"],
    #phone number
    5: ["Landroid/telephony/TelephonyManager;","getLine1Number"],
    #get Sim serial
    6: ["Landroid/telephony/TelephonyManager;","getSimSerialNumber"],
    #Location
    7: ["Landroid/telephony/TelephonyManager;","getCellLocation"],
    #GPS
    8: [".","getLastKnownLocation"],
    9: [".","requestLocationUpdates"],
    #Recorder
    10: ["Landroid/media/MediaRecorder;","prepare"],
    #native_code
    11: ["Ljava/lang/Runtime;","exec"],
    12: ["Ljava/lang/Runtime;","load"],
    13: ["Ljava/lang/System;","load"],
    #file io
    14: ["Llibcore/io/IoBridge;", "open"],
    15: ["Llibcore/io/IoBridge;", "read"],
    16: ["Llibcore/io/IoBridge;", "write"],
    17: ["Ljava/io/File;", "create"],
    18: ["Ljava/io/File;", "delete"],
    19: ["Ljava/io/File;", "get"],
    20: ["Ljava/io/File;", "mk"],
    21: ["Ljava/io/File;", "set"],
    #get resource
    22: [".","openRawResource"],
    23: [".","getAssets"],
    #http
    24: ["Lorg/apache/http/impl/client/AbstractHttpClient;", "execute"],
    25: ["Ljava/net/HttpURLConnection;","connect"],
    26: ["Ljava/net/URL;","openConnection"],
    27: ["Ljava/net/URLConnection;","connect"],
    28: ["Ljava/net/Socket;","."],
    #ssl
    29: ["Ljavax/net/ssl;","."],
    #WebView
    30: ["Landroid/webkit/WebView;","addJavascriptInterface"],
    31: ["Landroid/webkit/WebView;","searchBoxJavaBridge_"],
    #load jar
    32: ["Ldalvik/system/DexClassLoader;","."],
    33: ["Ljava/net/URLClassLoader;","."],
    34: ["Ldalvik/system/PathClassLoader;","."],
    #ReflectionCode
    35: ["Ljava/lang/reflect/Method;", "."],
    #encrypt or SHA
    36: [".", "doFinal"],
    37: [".","digest"],
    #use camera
    38: ["Landroid/hardware/Camera;","open"],
    #query SQL(read contact\SMS)
    39: ["Landroid/content/ContentResolver;","query"],
    #SharedPreferences
    40: ["Landroid/content/SharedPreferences;","edit" ],
    #sendBroadcast
    41: [".","sendBroadcast"],
    42: [".","sendOrderedBroadcast"],
    43: [".","sendStickyBroadcast"],
    44: [".","sendStickyOrderedBroadcast"],
    #start activity
    45: [".","startActivity"],
    46: [".","startActivityForResult"],
    #Service
    47: [".","startService"],
    48: [".","bindService"],
    #write to SD card ,add by Colbert 20150120
    49: [".","getExternalStorageDirectory"],
    #input check ,add by Colbert 20150120
    50: [".","readLine"]
}

二、关键字匹配

vm = dvm.DalvikVMFormat(apk.get_dex()) #dex转DalvikVMFormat
vmx = analysis.uVMAnalysis(vm)

vm.get_regex_strings("(?i)password") #Key Words
vm.get_regex_strings("AES")

vm.get_regex_strings("^((https?|ftp)://[^\s/$.?#].[^\s]*)$") #urls

vm.get_regex_strings("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") #ip

三、动态加载的Receivers

#Dynamically Registered Receiver
def show_Register_receiver(dx):
    paths = dx.get_tainted_packages().search_methods(".","registerReceiver",".")
    show_Paths(dx.get_vm(), paths )

四、SharedUserId、AllowBackup、Debuggable等

self.sharedUserId = self.xml[i].documentElement.getAttribute("android:sharedUserId") 
for item in self.xml[i].getElementsByTagName(‘application‘):
    self.allowbackup.append(str(item.getAttributeNS(NS_ANDROID_URI, "allowBackup")))

五、计算风险评分

ri = risk.RiskIndicator()
ri.add_risk_analysis( risk.RedFlags() )
ri.add_risk_analysis( risk.FuzzyRisk() )
analyze_app( options.input, ri, a )

def display_result(res) :
  for i in res :
    print "\t", i
    for j in res[i] :
      print "\t\t", j, res[i][j]

def analyze_app(filename, ri, a) :
    display_result( ri.with_apk( a ) )

六、扫描结果示例

[Activities]
    com.achievo.vipshop.activity.LodingActivity
    com.tencent.tauth.AuthActivity
[Services]
    com.achievo.vipshop.manage.service.SplashAlarmService
    com.vipshop.sdk.push.MqttService
[Content Providers]

[Broadcast Receivers]
    com.vipshop.sdk.viplog.batch.VipLogReceiver
    com.vipshop.sdk.push.VipsPushReceiver
[Permissions]   
USE_CREDENTIALS :
    1 Lcom/androidquery/auth/GoogleHandle;->reauth(Lcom/androidquery/callback/AbstractAjaxCallback;)Z (0x12) ---> Landroid/accounts/AccountManager;->invalidateAuthToken(Ljava/lang/String; Ljava/lang/String;)V
READ_PHONE_STATE :
[Sensitive APIs]    
    30 Landroid/webkit/WebView; addJavascriptInterface
        1 Lbolts/WebViewAppLinkResolver$2;->then(Lbolts/Task;)Lbolts/Task; (0x56) ---> Landroid/webkit/WebView;->addJavascriptInterface(Ljava/lang/Object; Ljava/lang/String;)V
[Dynamically registered receivers]
    1 Lcom/achievo/vipshop/newactivity/CartFloatView;->registerFavoriteRecever()V (0x3e) ---> Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver; Landroid/content/IntentFilter;)Landroid/content/Intent;
[SharedUserId|AllowBackup|Debuggable]
    SharedUserId:[]
    AllowBackup:[false]
    Debuggable[false]
[key words]   

[‘PWDCHARS_ARRAY‘, ‘PWDCHARS_STRING‘, ‘pwd‘, ‘pwdWatcher‘]
    [‘UserName‘, ‘userName‘, ‘username‘, ‘username=‘, ‘username_del‘]
    [‘secretKey‘]
    [‘ENCRYPTION‘, ‘ENCRYPTION_AES‘, ‘ENCRYPT_ACTION‘, ‘encrypt‘, ‘encryption error. ‘]
    [‘imei‘, ‘imei=‘]
    [‘imsi‘]
    [‘AES‘, ‘AES/CBC/PKCS5Padding‘, ‘AES/ECB/PKCS7Padding‘, ‘AESUtils‘, ‘AESUtils.java‘]
    [‘SHA-1‘]
    []
    []
    [‘MD5‘, ‘MD5.java‘, ‘MD5PatchVerifier.java‘, ‘MD5Util.java‘, ‘MD5_INSTANCE‘, ‘MD5_SALT‘]
    [‘RSA‘, ‘RSA/ECB/PKCS1Padding‘, ‘RSA_PKCS_V15‘, ‘RSA_PKCS_V21‘, ‘RSA_PRIVATE‘, ‘RSA_PUBLIC‘]

[urls]
    ftp://anonymous:[email protected]
    http://%1$s/diagnoses/v1/report
    http://%1$s/gslb/gslb/getbucket.asp?ver=3.0
    http://10.237.12.17:9085/pass/register
    http://400.vip.com/WebChat/chat/wapchat.jsp?
    http://800.vip.com/live800/chatClient/chatbox.jsp?companyID=8900&configID=17&enterurl=APP&pagereferrer=APP&syslanguage=0
    http://a.appsimg.com
    http://a.appsimg.com/upload/brand/
    http://a.appsimg.com/upload/merchandise/
    http://ap.vip.com/coupons_rules
    http://ap.vip.com/fwxy1015
    http://ap.vip.com/index.php?m=activity&code=coupon_help2&wapid=ap_2342
    http://ap.vip.com/index.php?m=activity&code=global_rule&wapid=ap_1881
[ip]
    1.1.3.61
    1.2.2.56
    1.3.4.60
    10.0.0.172
    10.0.0.200
    10.237.12.17
    10.237.12.2
    2.3.3.61
    2.4.0.61
    223.202.68.46
    42.62.48.181
    58.68.235.106
    58.68.235.232

[risk score]
    RedFlags
        DEX {‘NATIVE‘: 1, ‘DYNAMIC‘: 1, ‘CRYPTO‘: 1, ‘REFLECTION‘: 1}
        APK {‘DEX‘: 0, ‘EXECUTABLE‘: 0, ‘ZIP‘: 0, ‘SHELL_SCRIPT‘: 0, ‘APK‘: 0, ‘SHARED LIBRARIES‘: 87}
        PERM {‘PRIVACY‘: 6, ‘NORMAL‘: 9, ‘MONEY‘: 0, ‘INTERNET‘: 1, ‘SMS‘: 2, ‘DANGEROUS‘: 13, ‘SIGNATUREORSYSTEM‘: 1, ‘CALL‘: 0, ‘SIGNATURE‘: 0, ‘GPS‘: 2}
    FuzzyRisk
        VALUE 80.0

0x04 总结

定制androguard可用于大批量APK分析工作;通过迅速给出攻击面信息,辅助人工分析;但在进行加固APK分析时先天不足,需使用DroidBox、Xposed、adbi、Dozer等动态分析工具或手段来补齐短板;

时间: 2024-12-19 05:56:45

androguard 功能分析与定制的相关文章

二维码扫码积分系统定制开发

微信积分系统 二维码扫码积分系统定制开发找丽姐[158.1816.6626/电微]二维码营销模式系统定制开发 微信扫二维码营销系统开发 扫码领积分系统开发 一.如何实现扫二维码领红包功能? 1.使用扫描二维码领取红包对活动进行设置,包括红包数量.红包金额.促销地区.中奖概率等. 2.将生成的二维码赋到商品上面并赋涂层,一方面可以起到保证二维码的一次性,另一方面也可以引起消费者的好奇心. 3.通过手机微信打开扫一扫,扫码商品二维码关注公众号并领取红包,如果参与分享还可以获得抽奖的机会. 二.微信扫

微信小程序开发定制

上海软件定制专家:http://www.dzonly.com/?from=timeline

【转载】如何正确使用cnblogsCSS定制

转自:http://www.cnblogs.com/rvalue/p/7265386.html 用过cnblogs的估计都知道cnblogs提供了相对比较开放的个性化选项,其中最为突出的估计就是页面CSS定制了.但是没学过Web前端的人可能并不会用这个东西... 所以我打算在此分享一些定制CSS过程中使用的奇技淫巧一些方法来帮助大家定制blog qwq 以后如果想到新的主意或者更好的表述的话估计还会回来更新一波...本博文不定期更新吧w 博主并非专业Web开发,所以可能有些语言不够严谨或者不够准

定制windows环境下cmd替代软件ConEmu

定制windows环境下cmd替代软件ConEmu 公认的是Windows环境下命令行界面太难用. 不管是cmd还是powershell都不顺手!!窗口宽度不能全屏,字体太难看还不能调整,窗口背景不能更换,永远的黑白配,最痛苦的是复制和粘贴.都不知道MS是怎么想的?搞个这么个反人类的东西出来,还万年不变,从Windows诞生到Windows7不论是桌面版还是服务器版都一样,到了windows8/windows10换成powershell一样的鸡肋. 在百度搜了一下,找到cmd的替代软件conem

通过Qt4.2样式表定制程序外观

通过Qt4.2样式表定制程序外观 1. 何为Qt样式表2. 样式表语法基础3. 方箱模型4. 前景与背景5. 创建可缩放样式6. 控制大小7. 处理伪状态8. 使用子部件定义微观样式 8.1. 相对定位    8.2. 绝对定位 摘要 由于Qt样式表的引入,定制Qt部件的外观样式变得非常简单. 无论你是想仅仅修改一个现有部件的外观,还是想从零开始设计一套全新的界面风格, 现在都有了一种新的方法而不必再去继承并实现一个QStyle的子类. 1. 何为Qt样式表 Qt 样式表的思想很大程度上是来自于

定制WinEdt 优化Latex输入

前一个礼拜忙着准备讨论班的演示稿,顺带还有单位的一门考试的试题需要排版整理,所以微博更新的速度又被拖后了.说实话,Latex这种"所想即所得"的排版系统对人的确是一种折磨,它并不适合快速的文档编辑,倒是适合我们这种具有强烈强迫症倾向的人用来欣赏.所谓"慢工出细活",用Latex编辑文稿.书籍排版是集腋成裘的勾当,有许多东西是在这种折磨的过程中慢慢积累出来的.我在几年的考试命题出题过程中,从最开始的Word+Mathtype逐渐过渡到Word+Aurora,最后还是

20_Shell语言———VIM编辑器基础知识三之窗口属性定制、配置文件及查找替换功能

Vim编辑器可以让用户按照需求来定制一些使用属性. 一.窗口属性定义 1)显示行号 行号不是内容,只是用来帮助用户确认文本所在的行.在vim编辑器中,如果要显示行号,可以在末行模式下输入: set number 如果想关闭,则可以在功能名称前面加上no,即: set nonumber 命令可以被简写,如set number 可以简写为 set nu:set nonumber 可以简写为 set nonu. 注意,上述设定仅对当前vim的进程有效,一旦当前进程关闭,这些设定就会失效,如果要使设定永

RHEL定制可用的YUM源

一.配置网络YUM源( 仅以163源为例 ) 1.1 卸载RHEL原有YUM套件: [[email protected] Desktop]# rpm -qa | grep yum    ##记录下YUM套件的各个构成部分 [[email protected] Desktop]# rpm -qa | grep yum | xargs rpm -e --nodeps 1.2 下载对应RHEL发行版的CENT的yum套件(可借助浏览器完成): [[email protected] Desktop]# 

企业为什么需要定制自己的App?

随着越来越多的企业兴起,根据企业定制的APP也渐渐浮出水面.其中有不少企业已经开发出自己的专属定制APP应用软件,宣传自己的产品等非常方便.为什么企业要开发自己的APP?是赶潮流,是想扩大 宣传体,是把它当做微商铺,还是想获取自己的移动阵地?下面APICloud为大家介绍下APP能给企业带来什么样的优势或作用: 1.企业App定制开发便于接入新的客户 企业App客户端由于分享渠道变得越来越多,也越来越方便,轻轻一点.轻轻一扫就能分享给身边众多的朋友,企业App应用的传播也变得极为容易,只要企业寻