在Android中,开发者可以自由实现SSL通信,然而很多企业出于业务性能的考虑以及安全意识的欠缺,软件在实现https通信时忽略了证书校验或证书校验不严格,致使用户的敏感数据在传输过程中有可能遭受中间人攻击而泄露。
Android中SSL通信的不安全实现一般来源于下面5处:
1.自定义TrustManager,接管了系统原有的证书校验,checkServerTrusted()函数却是空实现。
2.自定义hostnameVerifier,verify()函数却总是返回true。
3.使用AllowAllHostnameVerifier进行实例化,信任任意的hostname。
4.使用不安全的SSLSocketFactory来禁用所有的SSL安全校验。
5.WebView遇到证书错误直接使用proceed()函数忽略继续。
常用路径
Context.getExternalFilesDir()方法和Context.getExternalCacheDir()方法获得的两个目录分别对应 设置->应用->应用详情里面的”清除数据“与”清除缓存“选项。
Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getExternalStoragePublicDirectory(“test”) = /mnt/sdcard/test
Environment.getRootDirectory() = /system
getPackageCodePath() = /data/app/com.my.app-1.apk
getPackageResourcePath() = /data/app/com.my.app-1.apk
getCacheDir() = /data/data/com.my.app/cache
getDatabasePath(“test”) = /data/data/com.my.app/databases/test
getDir(“test”, Context.MODE_PRIVATE) = /data/data/com.my.app/app_test
getExternalCacheDir() = /mnt/sdcard/Android/data/com.my.app/cache
getExternalFilesDir(“test”) = /mnt/sdcard/Android/data/com.my.app/files/test
getExternalFilesDir(null) = /mnt/sdcard/Android/data/com.my.app/files
getFilesDir() = /data/data/com.my.app/files
查看某app的签名版本
adb shell pm dump com.example|grep apkSigningVersion
命令行查看系统版本号
adb shell getprop ro.build.version.release
根据界面元素id定位代码
uiautomatorviewer
获取机器wlan0无限网卡的MAC地址:
adb shell cat /sys/class/net/wlan0/address
查看WIFI密码
root@hammerhead:/data/misc/wifi # cat wpa_supplicant.conf
列出所有的包名
$ adb shell pm list packages
拨打电话
$ adb shell am start -a android.intent.action.CALL -d tel:10086
打开网页
$ adb shell am start -a android.intent.action.VIEW -d https://www.baidu.com
查看后台service列表
$ service list
从已安装的包中得到其入口Activity
这种情况适用于apk已安装在设备上,不方便将其提取到本地,直接在adb shell中操作。
$ adb shell dumpsys package com.example.cctf|head -6
Activity Resolver Table:
Non-Data Actions:
android.intent.action.MAIN:
25d58f8 com.example.cctf/.MainActivity filter 1e3f12b9
Action: "android.intent.action.MAIN"
Category: "android.intent.category.LAUNCHER"
从apk的AndroidManifest.xml中提取入口Activity
这种情况适用于apk文件直接在本地,直接对其分析
方法一:python脚本
其实就是用Python的zipfile读取其AndroidManifest.xml文件然后用一个jar包工具解析二进制的manifest文件,从所有activity中找到属性为android.intent.action.MAIN
的Activity。
参考:
https://github.com/DrizzleRisk/BUnpacker/blob/8e92b42b0e02c0721656c870612cd1482bea73c2/bunpacker.py
import os, sys
import zipfile # 用于解压apk包
from xml.dom import minidom # 用于xml解析操作
PACKAGE_NAME = '' # 应用包名
START_ACTIVITY = '' # 启动的Activity
APK_PATH = sys.argv[1] # apk文件所在路径为从命令行传入的第一个参数
nxml = open('tmp/nxml.xml','w') # 打开空的xml文件待写入manifest信息
zf = zipfile.ZipFile(APK_PATH, 'r')
content = zf.read('AndroidManifest.xml') # 读取manifest文件内容
nxml.write(content) 将读取到的manifest文件写入xml中
nxml.close()
content = os.popen('java -jar ext-tools/AXMLPrinter2.jar tmp/nxml.xml').read()
mfest = minidom.parseString(content) # 使用minidom解析manifest内容
manifest = mfest.getElementsByTagName('manifest') # 得到根
activities = mfest.getElementsByTagName("activity") # 得到所有的activity
for node in manifest:
PACKAGE_NAME = node.getAttribute("package") # 遍历manifest的各个节点,找到package名
for activity in activities:
# 找到入口Activity
for sitem in activity.getElementsByTagName("action"):
val = sitem.getAttribute("android:name")
if val == "android.intent.action.MAIN" :
START_ACTIVITY = activity.getAttribute("android:name")
还挺好用的。
方法二:使用Android的SDK自带的build-tools/aapt工具
不过其实用build-tools/aapt
工具就可以了,基本信息就可以一目了然了。
[~/Downloads/apk/lanxin_v3.4.1_from_apkpure]$ aapt dump badging lanxin_v3.4.1.apk|head -1 [22:58:16]
package: name='com.unicom.gudong.client' versionCode='52508' versionName='3.4.1' platformBuildVersionName=''
[~/Downloads/apk/lanxin_v3.4.1_from_apkpure]$ aapt dump badging lanxin_v3.4.1.apk|grep "launchable-activity"
launchable-activity: name='com.comisys.gudong.client.LoadActivity' label='「蓝信」' icon=''
然后将两个命令通过 &&
合起来即可。
可以将其写成脚本。
$ mv apk_info.sh /usr/local/bin/apk_info
$ which apk_info [0:10:59]
/usr/local/bin/apk_info
查看当前前台Activity
[~/GitProjects]$ adb shell dumpsys activity top |head -2 [1:07:34]
TASK cn.nubia.launcher id=23520
ACTIVITY cn.nubia.launcher/com.android.launcher3.Launcher 6b836aa pid=1819
可显示pid,比下面的要好
[~/GitProjects]$ adb shell dumpsys window windows | grep -E 'mCurrentFocus' [1:07:02]
mCurrentFocus=Window{6ddf61 u0 cn.nubia.launcher/com.android.launcher3.Launcher}
使用jadx以反混淆的方式dump出apk
这里将unpack_demo.apk
以反混淆的方式dump到./jadx-gui
目录。
[~/Downloads/android]$ jadx unpack_demo.apk -d ./jadx-gui --deobf [0:00:40]
00:01:42 INFO - loading ...
00:01:42 WARN - Unknown 'R' class, create references to 'loading.androidmanual.R'
00:01:42 INFO - processing ...
00:01:49 INFO - done
结果为: