安卓jar文件用什么打开(Android安全知识笔记合集)

首页常识更新时间:2023-06-21 14:10:57

作者:MrGeekr极氪

反编译

反编译代码

反编译资源

没有反编译资源之前,AndroidManifest.xml和activity_main.xml这样的资源文件都是非明文的,无法阅读。

重新打包

smali文件夹的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。

使用smali语法,修改代码,就能重新编译自己的apk。但是apk还不能安全,因为还没签名。
因为无法获得原来正版的签名,可以使用Android Studio生成自己的签名,进行打包,生成自己的apk。

参考:

混淆

混淆的好处:

启动混淆

android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }

不能被混淆的元素

枚举类内部存在 values 方法,混淆后该方法会被重新命名,并抛出 NoSuchMethodException。Android 系统默认的混淆规则中已经添加了对于枚举类的处理,我们无需再去做额外工作。

原因在于:代码混淆过程中,被反射使用的元素会被重命名,然而反射依旧是按照先前的名称去寻找元素,所以会经常发生 NoSuchMethodException 和 NoSuchFiledException 问题。

实体类即我们常说的"数据类",当然经常伴随着序列化与反序列化操作。很多人也应该都想到了,混淆是将原本有特定含义的"元素"转变为无意义的名称,所以,经过混淆的"洗礼"之后,序列化之后的 value 对应的 key 已然变为没有意义的字段,这肯定是我们不希望的。
反序列化的过程创建对象从根本上来说还是借助于反射,混淆之后 key 会被改变,所以也会违背我们预期的效果。

Android 中的四大组件同样不应该被混淆。原因在于:

  1. 四大组件使用前都需要在 AndroidManifest.xml 文件中进行注册声明,然而混淆处理之后,四大组件的类名就会被篡改,实际使用的类与 manifest 中注册的类并不匹配,故而出错。
  2. 其他应用程序访问组件时可能会用到类的包名加类名,如果经过混淆,可能会无法找到对应组件或者产生异常。

当 JNI 调用的 Java 方法被混淆后,方法名会变成无意义的名称,这就与 C 中原本的 Java 方法名不匹配,因而会无法找到所调用的方法。

参考

WebView

问题:WebView明文存储密码带来的安全漏洞

WebView组件默认开启了密码保存功能,会提示用户是否保存密码,当用户选择保存在WebView中输入的用户名和密码,则会被明文保存到应用数据目录的databases/webview.db中。攻击者可能通过root的方式访问该应用的WebView数据库,从而窃取本地明文存储的用户名和密码。

开发者调用 WebView.getSettings().setSavePassword(false),显示调用API设置为false,让WebView不存储密码

四大组件

问题:动态注册Receiver风险

使用BroadcastReceiver组件需要动态注册或者静态注册,如果动态注册广播,即在代码中使用registerReceiver()方法注册BroadcastReceiver,只有当registerReceiver()的代码执行到了才进行注册,取消时则调用unregisterReceiver()方法。但registerReceiver()方法注册的BroadcastReceiver是全局的并且默认可导出的,如果没有限制访问权限,可以被任意外部APP访问,向其传递Intent来执行特定的功能。因此,动态注册的BroadcastReceive可能会导致拒绝服务攻击、APP数据泄漏或是越权调用等安全风险

1:在 AndroidManifest.xml 文件中使用静态注册 BroadcastReceiver,同时设置 exported="false",不被外部应用调用。

2:必须动态注册 BroadcastReceiver时,使用registerReceiver(BroadcastReceiver,IntentFilter,broadcastPermission,android.os.Handle)函数注册。

3:Android8.0新特性想要支持静态广播、需要添加intent.setComponent(new ComponentName()),详情可以自行查阅

问题:公共组件配置风险

Activity、Service、Provider、Receiver四大组件若配置为android:exported =”true”,将可以被外部应用调用,这样存在安全隐患的风险。

在应用的AndroidManifest.xml文件中,设置组件的android:exported 属性为false或者通过设置自定义权限来限制对这些组件的访问。值得一提的是,若部分功能使用前提是配置必须使用exported为true,这种情况开发者应该根据实际情况来进行集成

问题:数据越权备份风险

Android 2.1以上的系统可以为APP提供应用程序数据的备份和恢复功能,该功能由AndroidMainfest.xml文件中的allowBackup 属性值控制,其默认值为true。当该属性没有显式设置为false时,攻击者可通过adb backup和adb restore对APP的应用数据进行备份和恢复,从而可能获取明文存储的用户敏感信息,如用户的密码、证件号、手机号、交易密码、身份令牌、服务器通信记录等。利用此类信息攻击者可伪造用户身份,盗取用户账户资产,或者直接对服务器发起攻击。

将AndroidMainfest.xml文件中的allowBackup属性值设置为false来关闭应用程序的备份和恢复功能;也可以使用专业安全加固方案的本地数据保护功能,避免本地数据泄露。

数据存储安全:加密和JNI写入Native层

1、秘钥及敏感信息

此类配置应当妥善存放,不要在类中硬编码敏感信息,可以使用JNI将敏感信息写到Native层。

2、SharePreferences

首先不应当使用SharePreferences来存放敏感信息,sharedpreferces存储的xml文件数据可能被反编译拿到。存储一些配置信息时也要配置好访问权限,如私有的访问权限 MODE_PRIVATE(Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容),避免配置信息被篡改。

3、SQLite数据库文件的安全性

– 描述:敏感信息是否明文存储
– 检测:检测数据库里面的重要信息,比如账号密码之类的是否明文存储
– 建议:重要信息进行加密存储

日志数据泄露:Log控制,正式环境不打印

问题:日志数据泄露风险

调试信息函数可能输出重要的调试信息,常见的就是Log日志类其中包含的信息可能会导致用户信息泄露,泄露核心代码逻辑等,为发起攻击提供便利,例如:Activity的组件名;通信交互的日志;跟踪的变量值等

应用内使用统一的Log控制基类,可以灵活的控制Log的输出打印。(测试环境允许打印日志、正式环境不打印);或者使用第三方的日志框架

参考:

网络安全:HTTPS、使用签名和数据加密加密

1.1 无处不在的安全隐患

因为http协议是明文传输的,可以采取MD5值传输和存储,近几年MD5破解能力提高,所以现在通常生成MD5值时都需要加盐,例如MD5(name pwd)作为密码存储,同样的密码生成的值是不一样的,在一定程度上提高了安全性。

攻击不一定需要用户名密码,或许可以直接打token和uid的主意。,一旦用户登录后,服务器就通过token来标识身份。如果这个token被黑客劫持了,他就可以冒充你的身份进行攻击,如果token机制设计不合理,攻击者甚至可以直接暴力去撞token。大部分网站的机制也类似,服务器通过一个sessionId标识用户,攻击者一旦拿到这个sessionId,就可以去冒充一个合法用户。

1.2 使用https是否就万事大吉

1.3 使用签名和加密数据

上面可以看到,https并不能阻挡攻击者分析请求接口并发起恶意请求攻击,为了增加攻击者分析请求的难度,通常可以采用两种方式:

参考:

JNI:储存敏感信息,核心算法和秘钥

一些常量是不会/不能被混淆的,这种敏感信息就需要额外保护
核心算法和秘钥,一般选择放到native层

native代码的安全性保证

参考:

加壳与脱壳

无论是编译java代码生成的dex文件,还是编译C/C 代码生成的so文件,反编译成本都不是特别的高。

加壳直观理解就是给程序加一层壳,可以用来对原程序进行资源压缩、防调试、防注入、防反编译,也就是说通过一个壳把原来的程序保护了起来。

我们知道一个常规Android程序它的所有代码都在dex文件中,程序启动时要先把这个dex文件载入到内存中,所以如果要加壳的话,主要工作就是把原dex文件加密或者隐藏起来,放一个新的壳dex到apk中,程序启动时运行这个壳dex,然后这个壳dex在运行时再加载原dex,用一张图表示如下:

补充:hook和xposed

什么是 Hook

Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码。

Xposed

通过替换 /system/bin/app_process 程序控制 Zygote 进程,使得 app_process 在启动过程中会加载 XposedBridge.jar 这个 Jar 包,从而完成对 Zygote 进程及其创建的 Dalvik 虚拟机的劫持。

Xposed 在开机的时候完成对所有的 Hook Function 的劫持,在原 Function 执行的前后加上自定义代码

Xposed是Github上rovo89大佬设计的一个针对Android平台的动态劫持项目,通过替换/system/bin/app_process程序控制Zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。

因为Xposed工作原理是在/system/bin目录下替换文件,在install的时候需要root权限,但是运行时不需要root权限。

看到这里很多人会很懵,什么是Zygote?简单来说在Android系统中,应用程序进程都是由Zygote进程孵化出来的,而Zygote进程是由Init进程启动的。Zygote进程在启动时会创建一个Dalvik虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面去,而一个应用程序进程被Zygote进程孵化出来的时候,不仅会获得Zygote进程中的Dalvik虚拟机实例拷贝,还会与Zygote一起共享Java运行时库。这也就是可以将XposedBridge这个jar包加载到每一个Android应用程序中的原因。

XposedBridge有一个私有的Native(JNI)方法hookMethodNative,这个方法也在app_process中使用。这个函数提供一个方法对象利用Java的Reflection机制来对内置方法覆写。。。。等等这些都会借鉴各路大神的思路和分析,总而言之,就是从底层替换方法,可以让我们在不修改APK源码的情况下,通过自己编写的模块来影响程序运行的框架服务,实现类似于自动抢红包、微信消息自动回复等功能。 其实,从本质上来讲,Xposed模块也是一个Android程序。但与普通程序不同的是,想要让写出的Android程序成为一个``Xposed 模块,要额外多完成以下四个硬性任务:

1、让手机上的xposed框架知道我们安装的这个程序是个xposed模块。
2、模块里要包含有xposed的API的jar包,以实现下一步的hook操作。
3、这个模块里面要有对目标程序进行hook操作的方法。
4、要让手机上的xposed框架知道,我们编写的xposed模块中,哪一个方法是实现hook操作的。

参考:

加密算法

加密主要有对称加密、非对称加密,不可逆加密。

对称加密AES

AES主要是用在数据本身的加密,即使传输过程中被截取了,也是加密过后的数据。但AES的弊端的是,客户端加密的话,密钥肯定是储存在app中,如果app被成功破解了,数据也就被暴露了。所以只有app本身程序的安全也解决了,app才能相对安全。

非对称加密RSA

因为RSA加密有个长度限制,这就导致了RSA加密不能用于所有的数据交互。但是可以用到一些短数据,比如用户个人信息之类的,在交易中,一次订单的数据也不是很大等。

不可逆加密

比如MD5加密、SHA加密等。所谓的不可逆加密就是,只能单向加密,不能反向解密。MD5把数据加密,最后得到固定长度的16进制编码。这个加密的作用一般是匹配验证,验证某个数据是否改变。比如密码,在向服务器存储密码,一般不会存储明文密码。安卓本地存储个标志也一般不会明文存储。

Android官方

推出了JetPack Security 。

确保数据安全 - 深入解读加密与安全开发 | AndroidDevSummit 中文字幕视频


感谢大家能耐着性子看完啰里啰嗦的文章

在这里我也分享一份私货,一位大佬收录整理的Android学习PDF 架构视频 面试文档 源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

如果你有需要的话,可以点赞 评论 转发关注我,然后私信我【进阶】我发给你

,
展开阅读全文
推荐内容
热门内容
热门文章

© 2007-2022 http://www.anhuiqq.cn,All Rights Reserved.