本文来自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文件,使用如下命令查看签名
keytool -printcert -file META-INF/CERT.RSA
7、数据传递
Collections.unmodifiableList(list);
上面的方法可使当前list无法再添加对象,保持数据传递的安全性。
8、某些敏感Api为防止hook,可以设置setAccessiable(false),使得无访问权限来保证业务层实现安全。
9、设置包名和权限,防止部分攻击(仅打开此包下,具备此权限的页面)
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)
-
- Intent intent = Intent.parseUri(uri);
-
- intent.addCategory("android.intent.category.BROWSABLE");
-
- intent.setComponent(null);
-
- intent.setSelector(null);
-
- context.startActivityIfNeeded(intent, -1);
防止被注入选项和component进入其他app,被截取数据。
劫持后如何防止用户数据被抓取
主要因为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!");
}
9、
伪基站传播分析
伪基站能够伪装成电信运营商的服务号,向手机用户群发钓鱼短信,收到的钓鱼短信跟正常短信显示在一起,真假难辨。钓鱼网站的仿真度很高,并抓住了人们贪小便宜的弱点,先收集用户信息,再引导安装仿冒应用。
美国联邦调查局认为:密钥长度需要设置56位,几乎不可破解,而30位以下可以通过暴力破解-入侵的艺术。