Android 敏感 API 的说明
从中国的国情来看,Google 的诸多产品,包括 gmail,Android 官方市场 Google Play 正处于并将长期处于访问不了的状态。国内几亿网民也要生活,于是墙内出现了“百家争鸣”的场面,各家硬件厂商、三大运营商和游戏应用商城都推出了自己的Android市场,出现了豌豆荚,91助手,MIUI 应用商店、360手机助手、搜狗手机助手、酷安网等。Android市场鱼龙混杂,有很多优秀的阅读、影音、游戏、办公软件等,也有很多吸费、广告推送、泄露或上传用户隐私信息的 APK,让人又爱又恨。有人比喻,Android 就像当年的 Windows XP。
Android 已然成为市场占有量最大的移动智能设备平台,同时也成为了移动恶意应用最大的温床。得到 ROOT 权限,就可以执行任意操作了。全民掀起刷机热,但手机用户被硬件厂商告知对 ROOT 过的手机不予保修。刷机成功能给人一种成就感,刷机不当就沦为“砖头”。(那么问题就来了,手机变砖头,是发生了物理变化还是化学变化?无法使用了,自然给用户的心理留下了阴影,请问阴影部分的面积有多大?)回到正题,关于保护隐私、控制应用权限,月光博客也列举了五种方法,可以看看。
由于Android APK 很容易做手脚后二次打包放到网上,所以下载应用的时候最好去官网下载,也可以安装一些杀毒软件防御着。前一阵子报道了酷派手机内置 CoolReaper 后门程序,官网也可能不靠谱,手机厂商内置很多无用的APP到手机ROM包,卸载不了就有些可恶了。Android 代码是开源的,漏洞发现的也不少。最近出现的 launchAnywhere 和 boardAnywhere 漏洞通杀 Android 5.0 以下设备,防不胜防啊!
通常,恶意软件的实现需要调用特定 API 来完成,如恶意计费软件会调用发送短信 API,隐私窃取软件会调用访问通讯录 API,此类 API 被称为敏感 API。下面表格列举了一些例子。
敏感API | 解释 | 严重级别 |
sendTextMessage | 发送短信 | 高 |
sendMultipartTextMessage | 同时发送短信多条短信 | 高 |
abortBroadcast | 可以拦截短信 | 高 |
content://sms/inbox | 操作短信收件箱 | 高 |
getLine1Number | 获取手机号码 | 高 |
com.android.contacts | 通过ContentProviderOperation操作联系人 | 高 |
ContactsContract.CommonDataKinds.Phone.NUMBER | 通过ContentValues操作联系人 | 高 |
APK 中含有两个classes.dex文件 | 检查签名漏洞 | 高 |
getDisplayMessageBody | 收到短信时读取短信内容 | 高 |
Email.CONTENT_LOOKUP_URI 或 com.android.contacts/data/emails/lookup |
通过ContentValues操作邮件 | 高 |
getAccountsByType | 账号操作 | 高 |
getInstalledPackages | 得到安装列表 | 中 |
chmod | root操作 | 高 |
rm <filename> | 可能是删除操作,需要分析确认 | 中 |
pm install/uninstall | 后台自动安装或卸载 | 中 |
以上操作的反射api形式(需要详细分析) | 通过反射方式可以隐藏api | 高 |
getSubscriberId | 得到设备IMSI | 低 |
getLastKnownLocation | 得到地理位置信息 | 高 |
TelephonyManager.CALL_STATE_RINGING | 监听或拦截电话 | 中 |
广告,包名待定,也可能是后台服务 | 含有广告 | 低 |
Browser.BOOKMARKS_URI | 浏览器书签操作 | 低 |
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN | 激活设备管理器 | 中 |
android.intent.action.CALL | 拨打电话 | 中 |
getNeighboringCellInfo | 获取基站信息 | 中 |
MediaRecorder | 录音 | 中 |
沙盒扫描 | 发送短信,连接非法站等 | 高 |
敏感词 | 出现和游戏不相关的暴力,色情,危害社会的词语 | 中 |
APK 中含有两个classes.dex文件
在BlackHat USA 2013上漏洞发现者讲,原理就是解压apk(zip压缩包)时,若同时存在两个classes.dex,第二个dex会覆盖第一个,导致签名检验到的是第二个dex,而执行dex时又会以第1个为准,因此只需要在apk中放置两个classes.dex,顺序依次为正常dex、恶意dex即可绕过签名检验。
libcore/luni/src/main/java/java/util/zip/ZipFile.java
private void readCentralDir()
String entryName = newEntry.getName();
APK其实是一个压缩的ZIP文件,可以尝试使用不同的压缩级别0-9(0是store模式,不压缩,9是最大压缩,用时间换空间,会多耗一点时间),包体积会小一点,但不影响安装。这里是ZIP文件的格式规范 https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
4.3.7 Local file header: local file header signature 4 bytes (0x04034b50)
version needed to extract 2 bytes
general purpose bit flag 2 bytes
compression method 2 bytes
last mod file time 2 bytes
last mod file date 2 bytes
crc-32 4 bytes
compressed size 4 bytes
uncompressed size 4 bytes
file name length 2 bytes
extra field length 2 bytes file name (variable size)
extra field (variable size) - nameLength = it.readShort();
- int extraLength = it.readShort();
- int commentByteCount = it.readShort();
+ nameLength = it.readShort() & 0xffff;
+ int extraLength = it.readShort() & 0xffff;
+ int commentByteCount = it.readShort() & 0xffff;
Android 校验 APK 文件的时候,会调用 ZipFile 的 public InputStream getInputStream(ZipEntry entry) 函数。
int localExtraLenOrWhatever = Short.reverseBytes(is.readShort());

pm 是PakcageManger的缩写,用pm命令可以在控制台操作安装或卸载应用程序。Android基于Linux内核,也充分利用了Linux的用户权限管理方法。应用程序需要使用的权限都列在AndroidManifest.xml文件里,解析权限的代码在 frameworks/base/core/java/android/content/pm/PackageParser.java
private Package parsePackage(
Resources res, XmlResourceParser parser, int flags, String[] outError)
throws XmlPullParserException, IOException {
...
else if (tagName.equals("permission")) {
if (parsePermission(pkg, res, parser, attrs, outError) == null) {
return null;
}
...
} private Permission parsePermission(Package owner, Resources res,
XmlPullParser parser, AttributeSet attrs, String[] outError)
throws XmlPullParserException, IOException
parsePermission
有时候 getLastKnownLocation 返回为 null,需要注意一下。
添加权限到 AndroidManifest.xml,并在设置里需要打开 GPS;如果是模拟器,请执行 geo fix <longitude value> <latitude value>命令。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
因为这个方法是非阻塞的,不会等到有值才返回。可以使用 LocationListener 这个类,每隔多少时间刷新一下。如:locationManager.requestLocationUpdates(provider, 1000, 15/* minDistance */, locationListener);
private Location getLastKnownLocation() {
mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
List<String> providers = mLocationManager.getProviders(true);
Location bestLocation = null;
for (String provider : providers) {
Location l = mLocationManager.getLastKnownLocation(provider);
if (l == null) {
continue;
}
if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
// Found best last known location: %s", l);
bestLocation = l;
}
}
return bestLocation;
}
getLastKnownLocation
Android 敏感 API 的说明的更多相关文章
- Android 设备管理API概览(Device Administration API)
原文:http://android.eoe.cn/topic/android_sdk Android 2.2通过提供Android设备管理API的支持来引入企业应用支持.在系统级的设备管理API提供了 ...
- com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/com.xx.xx
完整的Error 信息(关键部分) Error:Execution failed for task ':fanwe_o2o_47_mgxz_dingzhi:transformResourcesWith ...
- Sorry, but the Android VPN API doesn’t currently allow TAP-based tunnels.
Sorry, but the Android VPN API doesn’t currently allow TAP-based tunnels. Edit .ovpn configfile “dev ...
- Android 系统API实现数据库的增删改查和SQLite3工具的使用
在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...
- 【NFC】Android NFC API Reference中英文
0 Near Field Communication Near Field Communication (NFC) is a set of short-range wireless technol ...
- Android开发-API指南-应用程序开发基础
Application Fundamentals 英文原文:http://developer.android.com/guide/components/fundamentals.html 采集(更新) ...
- Android SDK API (2.2,2.3,3.0)中文版文档
转的一篇.觉得很有用. Android SDK API (2.2,2.3,3.0)中文版文档 地址:http://android.laoguo.org固定连接:http://www.laoguo.or ...
- 【Xamarin挖墙脚系列:Xamarin.Android的API设计准则】
原文:[Xamarin挖墙脚系列:Xamarin.Android的API设计准则] 前言 楼主也是看着Xamarin的官方文档来的.基本也是照猫画虎.英语勉强凑合.翻译的不对的地方,大家多多指教.(这 ...
- Android 中文 API (40) —— RatingBar
Android 中文 API (40) —— RatingBar 前言 本章内容是 android.widget.RatingBar,译为"评分条",版本为Android 2.2 ...
随机推荐
- 矩阵或多维数组两种常用实现方法 - python
在python中,实现多维数组或矩阵,有两种常用方法: 内置列表方法和numpy 科学计算包方法. 下面以创建10*10矩阵或多维数组为例,并初始化为0,程序如下: # Method 1: list ...
- easyUI时间控件 使用
1,时间格式化,分隔符为 “—” // 日期格式化 function myformatter(date){ var y = date.getFullYear(); var m = date.g ...
- 构造函数忘记new? 看这里看这里
方法一:自调用构造函数 function Person(name){ if( !(this instanceof Person)){//一定要放在开头.检查this是否为构造函数的一个实例 retur ...
- 高端大气上档次的fullPage.js
简介 4月15日,网易邮箱升级到6.0版本,并发布了介绍页面,页面采用了时下非常流行的"全屏"效果,文字.图片再加上 CSS3 动画,让用户非常直观.清晰的了解6.0版本的功能及特 ...
- ReportServices如何在一页中将报表分成两列显示
创建两个数据集 DataSet1 DataSet2 DataSet1 SELECT TOP (SELECT (COUNT(*) + 1) / 2 A ...
- 浅谈Android样式开发之View Animation (视图动画)
引言 一个用户体验良好的App肯定少不了动画效果.Android为我们提供了2种动画框架,分别是视图动画(View Animation)和属性动画(Property Animation).视图动画比较 ...
- Bubble Cup 8 finals F. Bulbo (575F)
题意: 给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动, 查询时需要花费当前位置到区间内最近的点的距离,求最小代价. 1<=n<=5000,1<=所有位置< ...
- G:首页调用“图片视频”的分类和文章(难点)
1:后台获取:自定义分类的ID (默认分类也可获取) 2:动态获取"自定义分类的ID($cat)" $cat_title = single_cat_title(' ', f ...
- 语言模型kenlm的训练及使用
一.背景 近期研究了一下语言模型,同事推荐了一个比较好用的工具包kenlm,记录下使用过程. 二.使用kenlm训练 n-gram 1.工具介绍:http://kheafield.com/code/k ...
- Android中Context的理解及使用(二)——Application的用途和生命周期
实现数据共享功能: 多个Activity里面,可以使用Application来实现数据的共享,因为对于同一个应用程序来说,Application是唯一的. 1.实现全局共享的数据App.java继承自 ...