本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
Android是开源的,内部API相对比较透明,因此App的威胁会多一些,了解一些安全知识,有助于用户体验和产品稳定性。
1、App组件方面,慎用android:export=true(Activity、Service、BroadcastReveiver如果组件有超过一个intent-filter则默认为true;ContentProvider在16即4.1系统及以下默认为true,以上为false;),防止被程序恶意调用;对放出的组件,进行权限限制和数据校验,Intent设置包名。
2、WebView使用webView.addJavaScriptInterface的方式注入开放给H5的接口,使用注解的方式@JavaScriptInterface来标明接口。
4.2以下防攻击方案:http://blog.csdn.net/zhouyongyang621/article/details/47000041
3、防止反编译,造成接口被攻击、数据泄露,进行混淆加固处理;同时可以将apk的md5发给服务端进行校验,如果二次打包,则可以分辨出;用Cipher对数据库包括SharePreference加密,后者使用MODE_PRIVATE;核心功能写入so,通过jni调用。
4、防止DNS劫持,使用https加密传输;升级和下载时往往容易被劫持链接而下载别的App,同时防止被hook导致安装其他路径的安装包。升级和下载使用https,安装时要比较下载包的Md5与服务端返回是否一致、包名是否一致来保证下载包正常;将数据设置失效时间。
5、接口数据校验,注意频繁请求某一接口、虚拟注册、验证码接口被刷,防止服务端被拖垮。
6、打包上传后验证签名信息,下载应用市场apk,解压出META-INF下CERT.RSA文件,使用如下命令查看签名
Collections.unmodifiableList(list);
Intent intent = new Intent("com.android.settings.action.SWITH_AGED_MODE"); intent.setPackage("com.android.settings"); sendBroadcast(intent,"com.android.settings.permission.SWITH_SETTING");并对四大组件中传递的intent进行合法性校验。
10、防御措施一般如下三种:
第一、寄托在破坏攻击者的工具。第二、寄托在Java层代码逆向、调试和阅读的难度。第三、寄托在c层代码逆向、调试和阅读的难度上。
11、对于动态注册的广播,尽量使用LocalBroadcastReceiver来进行本地注册,这样只在本应用内通信;如果使用registerReceiver()则要做好权限控制。
附硬件信息查询方式,通过拨号盘输入如下参数即可
12、onPause时,通过ProcessManager.getRunningAppProcess来检测自己是否位于栈顶,防止第三方应用悬浮
13、使用TrustMangerFactory导入证书,自签校验
14、getRecentTask,使自己的进程不可见
在AndroidManifest.xml配置android:exclueFromRecents=false或Intent设置此flag,仅5.0以下有效,以上底层已经封掉getRecentTask方法
15、android:allowBackup="false" 防止设为true后,通过 adb backup 和adb restore来备份和恢复数据。
16、敏感信息不要使用socket通信,使用可以检验身份的方式会更好。
通用功能
代码 | 功能描述 | 备注 |
---|---|---|
*#*#7780#*#* | 恢复手机出厂设置,清除应用数据以及设置,移除手机绑定的谷歌账号,卸载下载的应用 | 不会删除系统内置应用,不会删除SD Card上的文件 |
*2767*3855# | 重新安装手机操作系统,恢复手机出厂状态,删除包括安装在内部存储上的所有APP并清除设置 | |
*#*#197328640#*#* | 进入调试模式 | |
*#*#4636#*#* | 电话基本信息,电话使用情况,电池信息 | |
*#*#34971539#*#* | 摄像头系统信息 | 注意不要点击不要点击升级摄像头系统信息,小心1秒变砖 |
*#*#7594#*#* | 改变电源按键的功能,允许直接关机而不是询问用户选择操作(无声模式,飞行模式,关机) | |
*#*#273283*255*663282*#*#* | 备份所有的媒体文件,打开文件拷贝界面让你能够备份图片,视屏和音频等媒体文件 | |
*#*#8255#*#* | 启动GTalk服务监控 | |
*2767*4387264636* | 显示产品信息 | |
*#0228# | 显示电池状态 | |
*#12580*369* | 软件和硬件信息 | |
*#32489# | 查看加密信息 | |
*#273283*255*3282*# | 数据创建菜单 | |
*#3282*727336*# | 数据使用状态 | |
*#8736364# | OTA升级菜单 | |
##778 | 显示EPST菜单 | |
*#228# | ADC读取菜单 |
WIFI,GPS和蓝牙检测
代码 | 功能描述 | 备注 |
---|---|---|
*#*#526#*#* | WLAN检测 | |
*#*#528#*#* | WLAN测试 | |
*#*#232339#*#* | WLAN测试 | |
*#*#232338#*#* | 显示WIFI网卡的MAC地址 | |
*#*#1472365#*#* | 快速GPS测试 | |
*#*#1575#*#* | 不同类型的GPS测试 | |
*#*#232331#*#* | 蓝牙测试 | |
*#*#232337#*#* | 显示蓝牙设备地址 |
系统固件版本信息
代码 | 功能描述 | 备注 |
---|---|---|
*#*#1111#*#* | FTA软件版本 | |
*#*#2222#*#* | FTA硬件版本 | |
*#*#4986*2650468#*#* | 硬件信息 | |
*#*#1234#*#* | PDA和手机系统信息 | |
*#2263# | 基带选择 | |
*#9090# | 诊断配置 | |
*#7284# | USB模式控制 | |
*#872564# | USB日志控制 | |
*#745# | RIL日志输出菜单 | |
*#746# | 调试日志输出菜单 | |
*#9900# | 系统日志输出模式 | |
*#*#44336#*#* | 显示构建时间,更新列表 | |
*#03# | NAND闪存串号 | |
*#3214789# | GCF模式状态 | |
*#4238378# | GCF配置 |
工厂测试
代码 | 功能描述 | 备注 |
---|---|---|
*#*#0283#*#* | 网络数据包回路测试 | |
*#*#0*#*#* | LCD测试 | |
*#*#0673#*#* | 音频测试 | |
*#*#0289#*#* | 音频测试 | |
*#*#0842#*#* | 震动与背光测试 | |
*#*#2663#*#* | 触摸屏测试 | |
*#*#2664#*#* | 触摸屏测试 | |
*#*#0588#*#* | 近距离感应器测试 | |
*#*#3264#*#* | 内存硬件版本 | |
*#0782# | 实时钟测试 | |
*#0589# | 光感应器测试 | |
*#7353# | 快速测试菜单 | |
*#3214789650# | LBS测试 | |
*#8999*8378# | 测试菜单 | |
*#07# | 测试历史 |
PDA和电话
代码 | 功能描述 | 备注 |
---|---|---|
*#*#7262626#*#* | 场测试 | |
*#06# | 显示手机IMEI号码 | |
*#*#8351#*#* | 打开语音拨号记录日志 | |
*#*#8350#*#* | 关闭语音拨号记录日志 | |
**05***# | 从紧急拨号屏幕解锁PUK码 | |
*#301279# | 网络制式HSDPA HSUPA控制菜单 | |
*#7465625# | 查看手机锁定状态 | |
*7465625*638*# | 配置网络锁定MCC/MNC | |
*7465625*782*# | 配置网络锁定NSP | |
*7465625*77*# | 插入网络锁定键SP | |
*7465625*27*# | 插入网络锁定键NSP/CP | |
*#272886# | 自动接听选择 |
其他
代码 | 功能描述 | 备注 |
---|---|---|
*#0*# | Galaxy S3服务菜单 | Samsung |
*#1234# | 软件版本 | Samsung |
*#12580*369# | 硬件与软件信息 | Samsung |
*#0228# | 查看电池状态 | Samsung |
*#0011# | 打开服务菜单 | Samsung |
*#0283# | 网络回路测试 | Samsung |
*#0808# | 访问USB服务 | Samsung |
*#9090# | 打开服务模式 | Samsung |
*#7284# | FactoryKeystring菜单 | Samsung |
*#34971539# | 访问摄像头系统 | Samsung |
*#7412365# | 摄像头固件菜单 | Samsung |
##7764726 | Motorola DROID 隐藏服务菜单 | Motorola 默认密码6个0 |
1809#*990# | LG Optimus 2x 隐藏服务菜单 | LG 默认密码6个0 |
3845#*920# | LG Optimus 3D 隐藏服务菜单 | LG 默认密码6个0 |
3845#*850# | LG G3 诊断测试菜单 | LG AT&T |
5689#*990# | LG G3 诊断测试菜单 | LG Sprint |
3845#*851# | LG G3 诊断测试菜单 | LG T-Mobile |
##228378 | LG G3 诊断测试菜单 | LG Verizon |
3845#*855# | LG G3 诊断测试菜单 | LG 网络变种 |
*#*#3424#*#* | HTC 测试功能 | HTC |
##8626337# | 运行VOCODER | HTC |
##33284# | 场测试 | HTC |
##3282# | 显示EPST菜单 | HTC |
##3424# | 运行诊断模式 | HTC |
##786# | 反转诊断支持 | HTC |
##7738# | 协议修订 | HTC |
*#*#786#*#* | 硬件重置 | Nexus 5 |
*#*#7873778#*#* | 启动Superuser应用 | Nexus 5 |
*#*#1234#*#* | 启动Superuser应用 | Nexus 5 |
*#123# | 是否连接到家庭网络,仅用于加拿大和美国 | Nexus 5 |
*#*#2432546#*#* | 检查系统升级 | Nexus 5 |
日志输出办法:
adb logcat -b main -v time>app.log 打印应用程序的log
adb logcat -b radio -v time> radio.log 打印射频相关的log
adb logcat -b events -v time 打印系统事件的日志,比如触屏事件
6、权限问题
try { PackageManager packageManager=mContext.getPackageManager(); Drawable drawable=packageManager.getResourcesForApplication("com.tencent.qq").getDrawable(0x7f020110); mOnlineTv.setBackground(drawable); }catch (Exception e){ showToast(e.getMessage()); }
如上代码可以获取QQ的一张图片来设置到自己的App来,原因在于QQ设置了export=true,破解其App得到资源即可实现。延伸讲一个activity的安全性,一般通过action、设置应用包名可以直接打开,那么可以做的就是给activity设置一个权限,同时将传过来context的package做判断,如果在后台注册过则同意打开,否则拒绝打开。
再举一例:
Intent intent = new Intent(Intent.ACTION_MAIN); ComponentName cn = new ComponentName("com.tencent.qq", "com.tencent.qq.activity.LoginActivity"); intent.setComponent(cn); startActivity(intent);
7、安全一点的intent(设置selector为null,chrome默认设置component为null)
- // convert intent scheme URL to intent object
- Intent intent = Intent.parseUri(uri);
- // forbid launching activities without BROWSABLE category
- intent.addCategory("android.intent.category.BROWSABLE");
- // forbid explicit call
- intent.setComponent(null);
- // forbid intent with selector intent
- intent.setSelector(null);
- // start the activity by the intent
- context.startActivityIfNeeded(intent, -1);
劫持后如何防止用户数据被抓取
主要因为html中被插入js,同时弹出新的伪装页面
http://www.cnblogs.com/alisecurity/p/5408588.html
遇到下面这种,还是要自己多注意些
8、zip包里尽量不要出现../../file,对解压包的目录进行判断是否多级目录,防止数据被覆盖。
String entryName = entry.getName();
if (entryName.contains("..")){
throw new Exception("unsecurity zipfile!");
}
伪基站传播分析
伪基站能够伪装成电信运营商的服务号,向手机用户群发钓鱼短信,收到的钓鱼短信跟正常短信显示在一起,真假难辨。钓鱼网站的仿真度很高,并抓住了人们贪小便宜的弱点,先收集用户信息,再引导安装仿冒应用。
美国联邦调查局认为:密钥长度需要设置56位,几乎不可破解,而30位以下可以通过暴力破解-入侵的艺术。