从中国的国情来看,Google 的诸多产品,包括 gmail,Android 官方市场 Google Play 正处于并将长期处于访问不了的状态。国内几亿网民也要生活,于是墙内出现了“百家争鸣”的场面,各家硬件厂商、三大运营商和游戏应用商城都推出了自己的Android市场,出现了豌豆荚,91助手,MIUI 应用商店、360手机助手、搜狗手机助手、酷安网等。Android市场鱼龙混杂,有很多优秀的阅读、影音、游戏、办公软件等,也有很多吸费、广告推送、泄露或上传用户隐私信息的 APK,让人又爱又恨。有人比喻,Android 就像当年的 Windows XP。

  Android 已然成为市场占有量最大的移动智能设备平台,同时也成为了移动恶意应用最大的温床。得到 ROOT 权限,就可以执行任意操作了。全民掀起刷机热,但手机用户被硬件厂商告知对 ROOT 过的手机不予保修。刷机成功能给人一种成就感,刷机不当就沦为“砖头”。(那么问题就来了,手机变砖头,是发生了物理变化还是化学变化?无法使用了,自然给用户的心理留下了阴影,请问阴影部分的面积有多大?)回到正题,关于保护隐私、控制应用权限,月光博客也列举了五种方法,可以看看。

  由于Android APK 很容易做手脚后二次打包放到网上,所以下载应用的时候最好去官网下载,也可以安装一些杀毒软件防御着。前一阵子报道了酷派手机内置 CoolReaper  后门程序,官网也可能不靠谱,手机厂商内置很多无用的APP到手机ROM包,卸载不了就有些可恶了。Android 代码是开源的,漏洞发现的也不少。最近出现的 launchAnywhereboardAnywhere 漏洞通杀 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()

        // Seek to the first CDE and read all entries.
        RAFStream rafs = new RAFStream(mRaf, centralDirOffset);
        BufferedInputStream bin = new BufferedInputStream(rafs, 4096);
        byte[] hdrBuf = new byte[CENHDR]; // Reuse the same buffer for each entry.
        for (int i = 0; i < numEntries; ++i) {
            ZipEntry newEntry = new ZipEntry(hdrBuf, bin);
            mEntries.put(newEntry.getName(), newEntry);
        }

String entryName = newEntry.getName();

            if (mEntries.put(entryName, newEntry) != null) {
                throw new ZipException("Duplicate entry name: " + entryName);
            }
恶意APK软件包包含两个 entryName="classes.dex" 的文件,对应的数据分别为 malicious.data 和 org.data,且 malicious.data 在压缩包字典中位于 org.data 之前。由于 APK解析中,当 entryName 相同时,后者会覆盖前者信息,签名验证的时候,会去验证原来的 classes.dex,但是执行的时候,是执行篡改过的 classes.dex。攻击的时候,可以用名字 classes.dey, classes.dex 与 classes.dey 塞入APK后,然后二进制查找"classes.dey"替换成"classes.dex"(有两处)。

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;
Java 与 C/C++ 不同,整型都是有符号的。读取结构体的 WORD、DWORD 字段需要考虑大于2^15、2^31情况的发生。
Android 校验 APK 文件的时候,会调用 ZipFile 的 public InputStream getInputStream(ZipEntry entry) 函数。
int localExtraLenOrWhatever = Short.reverseBytes(is.readShort());

// Skip the name and this "extra" data or whatever it is:
rafstrm.skip(entry.nameLength + localExtraLenOrWhatever);

 
  file name 填"classes.dex",classes.dex 文件的 magic number也是"dex",可以共用这三个字节。然后从file name 的'.'后写入classes.dex。extra field length 填 0xFFFD,然后 rafstrm.skip(entry.nameLength + localExtraLenOrWhatever); 就会去读取写入的 classes.dex zip格式中的extra filed length大于2^15时会整数溢出变成负数,造成字段索引错误,无法跳过file name 与 extra field,就可以在这两个域放原class.dex文件,后面再跟恶意dex,从而绕过签名检验。但被攻击的Apk里的classes.dex大小必须在64K以内。否则,就无法对其进行攻击,可利用场景比较受限。

  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 的说明的更多相关文章

  1. Android 设备管理API概览(Device Administration API)

    原文:http://android.eoe.cn/topic/android_sdk Android 2.2通过提供Android设备管理API的支持来引入企业应用支持.在系统级的设备管理API提供了 ...

  2. 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 ...

  3. 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 ...

  4. Android 系统API实现数据库的增删改查和SQLite3工具的使用

    在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...

  5. 【NFC】Android NFC API Reference中英文

    0 Near Field Communication Near Field Communication (NFC) is a set of   short-range wireless technol ...

  6. Android开发-API指南-应用程序开发基础

    Application Fundamentals 英文原文:http://developer.android.com/guide/components/fundamentals.html 采集(更新) ...

  7. 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 ...

  8. 【Xamarin挖墙脚系列:Xamarin.Android的API设计准则】

    原文:[Xamarin挖墙脚系列:Xamarin.Android的API设计准则] 前言 楼主也是看着Xamarin的官方文档来的.基本也是照猫画虎.英语勉强凑合.翻译的不对的地方,大家多多指教.(这 ...

  9. Android 中文 API (40) —— RatingBar

    Android 中文 API (40) —— RatingBar 前言 本章内容是 android.widget.RatingBar,译为"评分条",版本为Android 2.2 ...

随机推荐

  1. BZOJ4516: [Sdoi2016]生成魔咒

    果然SA比SAM+map快~加了fread目前rank1. 首先这是SAM裸题,然而SA求本质不同子串个数也很容易.考虑倒着建SA,这样没错加一个字符就变成加一个后缀,其他后缀都不变,那么i的答案就是 ...

  2. Python 类(一)

    这一篇让先抽象的了解下类与实例 一类的定义 从具体的程序设计观点来看: 类是一种数据结构.我们可以使用类来定义包含数据值和行为特性的对象(类对象). 类是封装逻辑和数据的另一种形式. 面向对象设计观点 ...

  3. MAC上安装 HLA(High Level Assembly)

    1.安装HLA 最新版的hla汇编器可在这里下载,支持MacOs,Linux,Windows平台 2.安装步骤 将下载好的hla程序包放在Mac根目录下 最重要的一步是设置好环境变量,打开Mac根目录 ...

  4. View绘制机制

    View 绘制机制 1. View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 me ...

  5. SQL Server 2008 R2 错误代码:233

    解决方法:打开SQL Server配置管理器,找到MSSQLSERVER的协议,启动TCP/IP和Named Pipes

  6. 【学习笔记】load-on-startup Servlet

    创建Servlet实例有两个时机:用户请求之时和应用启动之时.应用启动之时创建的通常用于某些后台服务的Servlet.配置load-on-startup的Servlet有两种方式: 在web.xml文 ...

  7. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  8. Html to Pdf 的另类解决方案

    Background 项目里要求将一个HTML页面(支付结果)生成pdf文档.页面有图片,有表格,貌似开源的iTextSharp应付不了. 在一番搜索之后,找到了wkhtmltopdf,一个命令行的开 ...

  9. html_随笔

    1 <h1>  </h> 标题 2 <p> </p> 段落 3 <br /> 换行 4 <!-- ...--> 注释 5 < ...

  10. js加载完所有的图片,适合电子相册哦~~~~

    有些时候要一口气加载完所有的图片,所以代码就要这么写.... var imgArray = [ 'http://s16.mogucdn.com/p1/160202/upload_ifqwcmlcmyy ...