1.执行流程
- 通过apktool反编译apk(输入参数apk路径)
- 得到反编译后的AndroidManifest.xml文件
- 通过FindActivity.py得到Activity_List(activity列表)
- 删除Activity_List中含有不需要调起的activity
- 运行NullPointer.py,输出log在指定文件夹
- 手动分析log
2.环境
- MacBook
- Python 2.7
- apktool(https://ibotpeaches.github.io/Apktool/install/)
3.遇到的问题
1.只能用启动activity来测试空指针,无法做其他操作,例如传参点击操作
2.activity不允许外部被调用,无法测试
报错:java.lang.SecurityException: Permission Denial: starting Intent
因为在AndroidManifest.xml文件中activity默认是android:exported="false"不允许被外部调用
4.总结
所以使用空指针脚本来测试空指针问题,并不是很完美。
5.代码示例
- 找出所有activity
''' import xml.dom.minidom as minidom import sys def find_activities(filePath): xml = minidom.parse(filePath) root = xml.getElementsByTagName('manifest') appNode = None for node in root[0]._get_childNodes(): if(node._get_localName() == "application"): appNode = node break content = '' for item in appNode._get_childNodes(): if(item._get_localName() == 'activity'): content = content + item.getAttribute("android:name") + '\n' fs = open("Activity_List", 'w') fs.write(content) fs.close() if __name__ == '__main__': filePath = sys.argv[1] find_activities(filePath) '''
- 空指针检查脚本
''' import os import sys import time import threading PATH = sys.path[0] PKG_NAME = sys.argv[1] #先判断设备是否连接 os.popen("adb wait-for-device") os.popen("adb logcat -c") #遍历文件获得activities 的值 def CheckNullPoint(): f = open(PATH + "/" + "AC_list_filter", "r") for line in f.readlines(): os.popen('adb shell am start -n %s/%s' % (PKG_NAME, line)) # print("adb shell am start -n %s/%s" % (PKG_NAME, line)) time.sleep(3) f.close() def CatLog(): os.popen('adb logcat >> %s/log.txt' % PATH) def kill_adb(): os.popen('adb kill-server') def quit_app(): os.popen('adb shell input keyevent 4') t2 = threading.Thread(target=CatLog) t1 = threading.Thread(target=CheckNullPoint) t2.start() t1.start() t1.join() print("Success") #back键退出应用 for i in range(10): quit_app() kill_adb()'''
- sell脚本
''' if [[ -d "apkFile" ]]; then rm -r AC_list_filter Activity_List apkFile log.txt fi WORKSPACE=`pwd` #apk地址 echo "Please enter the apk file address:" read apk_address #读取包名 echo "Please enter the package name:" read pkg_name #反编译 apktool d ${apk_address} -o apkFile #获取安卓manifest文件 ANDROID_MANIFEST=${WORKSPACE}/apkFile/AndroidManifest.xml #通过FindActivity.py获取Activity列表 python FindActivity.py ${ANDROID_MANIFEST} #删除包含"loader.a.ActivityN1/loader.a.ActivityP0/loader.a.ActivityP1/loader.a.ActivityP2"的Activity sed '/ads.naga/d;/ss.android/d;/baidu.mobads/d;/qq/d;/bytedance/d' Activity_List > AC_list_filter #运行python nullpointer.py,输出log在指定文件夹 echo "Starting..." python NullPointer.py ${pkg_name} echo "log文件:${WORKSPACE}/log.txt" '''
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦