Androguard
Android逆向-Androguard
环境
先贴上安装好后的环境:
1 | androguard==4.0 |
即使是这样了还是有一堆小bug。
安装
pip安装(失败)
1 | pip install python3-virtualenv |
git
1 | proxychains4 git clone --recursive https://github.com/androguard/androguard.git |
注意
Androguard现在最高只支持到了API 29。
Doc
Welcome to Androguard’s documentation! — Androguard 3.4.0 documentation
基本涵盖了Androguard的所有使用情况。
比较有用的其实是xref分析。其他没啥好看的。
基础使用
解析AndroidManifest.xml
1 | androguard axml AndroidManifest.xml |
解析resources.arsc
1 | androguard arsc resources.arsc |
展示APK签名
1 | androguard sign <apk_path> |
综合分析
1 | androguard analyze <apk_path> |
弹出来IPython交互界面进行操作。
反编译
1 | python cli.py decompile -o output -f jpg /root/Documents/AndroidRev/b.apk |
修Bug
我的天,怎么这么多bug
IPython报错
好像8.10也能用,不知道为什么一开始不行,反正现在OK了,这一个就不管了
8.0版本以上的IPython移除了一些Androguard支持的特性,导致bug出现。所以最高安装6.0版本即可。
我可以考虑提出一个issue让他们改一下。
1 | pip install ipython==6.0.0 |
quit时报错
暂时不知道怎么处理,不过问题不大
androguard/main.py
290行:
1 | if ipshell is not None: |
find_fields报错
androguard/androguard/core/analysis/analysis.py
1838行:
1 | def find_fields(self, classname=".*", fieldname=".*", fieldtype=".*", accessflags=".*", encoding="utf-8"): |
decompile报错
报错点主要围绕在hashlib库上。
androguard/androguard/core/bytecode.py
287行
1 | _tmp = mx.get_method().get_class_name() + mx.get_method().get_name() + mx.get_method().get_descriptor() |
304行:
1 | _tmp = sha256 + basic_block.get_name().encode() |
356:
1 | child_id = hashlib.md5(sha256 + DVMBasicMethodBlockChild[-1].get_name().encode()).hexdigest() |
372:
1 | exception_id = hashlib.md5(sha256 + exception_block.get_name().encode()).hexdigest() |
381:
1 | block_id = hashlib.md5(sha256 + basic_block.get_name().encode()).hexdigest() |
androguard/main.py
添加
1 | from androguard.core import dex |
175行:
1 | bytecode_buff = dex.get_bytecodes_method(vm, vmx, method) |
脚本
读取通话记录
Android获取手机通话记录的方法 - 经验笔记 (nhooo.com)
1 | import android.content.ContentResolver; |
CallLog.Calls里面的这些都是常量,猜测应该是字符串什么的。这种东西不太适合xref分析,可以考虑直接查String?
1 | _apk, _dex, _dx = AnalyzeAPK() |
1 | "date" |
读取通讯人记录
检索联系人列表 | Android 开发者 | Android Developers
Android–读取通讯录并添加联系人-阿里云开发者社区 (aliyun.com)
Android读取手机通讯录联系人到自己项目-腾讯云开发者社区-腾讯云 (tencent.com)
ContactsContract
1 | android.provider.ContactsContract |
判断方式:
- 导入了android.provider.ContactsContract
- 包含了如下字符串:”data1”,”display_name”
读取日历
日历提供程序概览 | Android 开发者 | Android Developers
Android 获取日历日程事件_unknown url content://com.android.calendar/calenda_Choi晨的博客-CSDN博客
确实有read calendar这种权限,但主要是给Google自己的原生日历用的。
1 | import android.provider.CalendarContract; |
表(类) | 描述 |
---|---|
CalendarContract.Calendars |
此表储存日历特定信息。此表中的每一行都包含一个日历的详细信息,例如名称、颜色、同步信息等。 |
CalendarContract.Events |
此表储存事件特定信息。此表中的每一行都包含一个事件的相关信息,例如事件的标题、地点、开始时间、结束时间等。事件可一次性发生,也可多次重复发生。参加者、提醒和扩展属性存储在单独的表内。它们各自都有一个 EVENT_ID ,用于引用 Events 表中的 _ID 。 |
CalendarContract.Instances |
此表储存每个事件实例的开始时间和结束时间。此表中的每一行都表示一个事件实例。对于一次性事件,实例与事件为 1:1 映射。对于重复事件,系统会自动生成多个行,分别对应多个事件实例。 |
CalendarContract.Attendees |
此表储存事件参加者(来宾)信息。每一行都表示事件的一位来宾。每一行会指定来宾类型,以及来宾是否参加该事件的响应。 |
CalendarContract.Reminders |
此表储存提醒/通知数据。每一行都表示事件的一个提醒。一个事件可以有多个提醒。您可以在 MAX_REMINDERS 中指定每个事件的最大提醒数量,后者由拥有给定日历的同步适配器设置。提醒需指定为在事件发生前的某个时间(分钟)发出,而且其拥有一个可决定用户提醒方式的方法。 |
1 | String[] EVENT_PROJECTION = new String[] { |
读取短信
Android读取与接收短信 - 掘金 (juejin.cn)
android 短信 读取 android读取短信权限_mob6454cc7966b9的技术博客_51CTO博客
Android 开发者 | Android Developers
content://sms/inbox
收件箱
content://sms/sent
已发送
content://sms/draft
草稿
content://sms/outbox
发件箱
1 | android.permission.READ_SMS |
读取蓝牙匹配信息
安卓读取蓝牙BLE设备信息_android获取当前连接的ble设备-CSDN博客
手记|Android 获取已配对蓝牙列表和已连接蓝牙名称 - 掘金 (juejin.cn)
Android获取蓝牙列表 - 简书 (jianshu.com)
1 | import android.bluetooth.BluetoothAdapter |
读取wifi连接记录
Android 如何获取所有的wifi连接历史记录?-CSDN博客
读取导航记录
参考
Welcome to Androguard’s documentation! — Androguard 3.4.0 documentation
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/10/30/Android逆向-Androguard/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!