安卓的代码加固和其他安全问题
文章目录
- 安卓加固
- apk文件结构
- dex加固过程
 
- 其它安全问题
安卓加固

 从App的加固技术来看:主流分为dex加密和so加密,目前来看保护dex文件更为重要,因为dex反编译后的java代码可读性更强。
android-ndk: Native Development Kit
 官网解释:这套工具使您能在 Android 应用中使用 C 和 C++ 代码

apk文件结构
| 文件或目录 | 说明 | 
|---|---|
| assets | 存放资源文件 | 
| lib | 存放ndk编译出来的so文件 | 
| META-INF | 签名信息 | 
| res | 存放资源文件 | 
| AndroidManifest.xml | 清单文件 | 
| classes.dex | java源码编译后的dalvik字节码 | 
| resources.arsc | 编译后的二进制资源文件 | 
dex加固过程

 上图中的重打包签名的详细图:
 
 ProxyApplication就是壳dex的入口。
其它安全问题
除了混淆源码、加固源码,还有以下问题需要注意:
| 风险名称 | 风险 | 解决方案 | 
|---|---|---|
| 篡改和二次打包 | 修改文件资源,添加病毒、广告, 窃取支付密码,拦截短信 | 混淆资源文件, 对签名过后的hash进行验签 | 
| 资源文件被窃取 | 钓鱼网站 | 混淆资源文件 | 
| webview明文存储密码风险 | 用户使用webview默认存储密码到databases/webview.db root的手机可以产看webview数据库 | 关闭webview存储密码的功能 | 
| 调试日志函数调用 | 日志中含有敏感信息 | 关闭调试日志函数,删除日志文件 | 
| 不安全加密 | ECB模式和OFB模式 | 改用CBC或CFB | 
| 密钥硬编码 | 逆向窃取密钥 | 应该模仿best practice去随机生成 | 
| 动态调试 | gdb调试,java调试 | 在so文件中对调试进程进行监听 android:debuggable=“false” | 
| 应用数据被备份 | 清单文件中allowbackup=true 攻击者可以使用adb命令对APP应用数据进行备份 | allowbackup=false | 
| 全局可读写内部文件 | 不同软件之间不必要的数据共享 其它应用可以读取或修改内部文件 MODE_WORLD_READABLE android: sharedUserId | 使用MODE_PRIVATE模式创建内部存储文件;加密后存储;或者干脆脱敏 | 
| 内网测试信息残留 | 通过测试的Url,测试账号等对正式服务器进行攻击等 | 清除测试痕迹 | 
| 随机数不安全使用 | 不够随机 | 不使用setseed方法 使用/dev/urandom /dev/random | 
| http/https | 明文传输,中间人攻击 | X509TrustManager checkServerTrusted校验函数要按需实现,不能留空白 HostnameVerifier 检查证书的主机名和使用证书的主机名是否一致 | 
| 输入监听 | 窃取密码等 | 自定义键盘 | 
| 截屏攻击 | 对app界面进行截图或录屏 | 添加属性getWindow().setFlags(FLAG_SECURE) 不让用户截图和录屏 | 
| 模拟器运行风险 | 刷单,模拟位置 | 禁止在模拟器上运行 | 
| 四组件导出风险 | Activity被第三方应用访问导致被任意应用恶意调用 | 自定义权限 | 
| 动态注册Receiver风险 | 使用带权限检验的registerReceiver API进行动态广播的注册 | |
| PendingIntent错误使用Intent风险 | 使用PendingIntent的时候,如果使用了一个空Intent,会导致恶意用户劫持修改Intent的内容 | 禁止使用一个空Intent去构造PendingIntent | 
| Intent组件隐式调用风险 | 使用隐式Intent没有对接收端进行限制导致敏感信息被劫持 | 对接收端进行限制 建议使用显示调用方式发送Intent | 
| fragment注入攻击风险 | PreferenceActivity的子类中,没有加入isValidFragment方法,进行fragment名的合法性校验,攻击者可能会绕过限制,访问未授权的界面 | (1).如果应用的Activity组件不必要导出,或者组件配置了intent filter标签,建议显示设置组件的“android:exported”属性为false(2).重写isValidFragment方法,验证fragment来源的正确性 | 
| webview远程代码执行风险 | 风险:WebView.addJavascriptInterface方法注册可供JavaScript调用的Java对象,通过反射调用其他java类等 | 建议不使用addJavascriptInterface接口,对于Android API Level为17或者以上的Android系统,Google规定允许被调用的函数,必须在Java的远程方法上面声明一个@JavascriptInterface注解 | 
| zip文件解压目录遍历风险 | Java代码在解压ZIP文件时,会使用到ZipEntry类的getName()方法,如果ZIP文件中包含“…/”的字符串,该方法返回值里面原样返回,如果没有过滤掉getName()返回值中的“…/”字符串,继续解压缩操作,就会在其他目录中创建解压的文件 | (1). 对重要的ZIP压缩包文件进行数字签名校验,校验通过才进行解压。 (2). 检查Zip压缩包中使用ZipEntry.getName()获取的文件名中是否包含”…/”或者”…”,检查”…/”的时候不必进行URI Decode(以防通过URI编码”…%2F”来进行绕过),测试发现ZipEntry.getName()对于Zip包中有“…%2F”的文件路径不会进行处理。 | 
| Root设备运行风险 | 已经root的手机通过获取应用的敏感信息等 | 检测是否是root的手机禁止应用启动 | 
| 从sdcard加载Dex和so风险 | 未对Dex和So文件进行安全,完整性及校验,导致被替换,造成用户敏感信息泄露 | (1).放在APP的私有目录 (2).对文件进行完成性校验。 | 
相关文章:
 
安卓的代码加固和其他安全问题
文章目录 安卓加固apk文件结构dex加固过程 其它安全问题 安卓加固 从App的加固技术来看:主流分为dex加密和so加密,目前来看保护dex文件更为重要,因为dex反编译后的java代码可读性更强。 android-ndk: Native Development Kit 官网解释:这套工具使您能在 Android 应…...
 
关于Linux Docker springboot jar 日志时间不正确 问题解决
使用Springboot项目的jar,制作了一个Docker镜像,启动该镜像后发现容器和容器中的Springboot 项目的日志时间不正确。 解决 查看容器时间命令为: docker exec 容器id date 1. 容器与宿主机同步时间 在启动镜像时候把操作系统的时间通过&q…...
 
提高批量爬虫工作效率
大家好!作为一名专业的爬虫程序员,我今天要和大家分享一些关于提高批量爬虫工作效率的实用技巧。无论你是要批量采集图片、文本还是视频数据,这些经验都能帮助你在大规模数据采集中事半功倍。废话不多说,让我们开始吧!…...
 
E96系列电阻阻值和代码、乘数对照表
1、为什么要用代码表示? 0805封装还可以简单易懂写下四位丝印,比如10K的1002,但0603的封装上面再想写下四位丝印就没空间了,就算写了也不容易看不清。 2、E96系列电阻阻值和代码、乘数对照表 下面是E96系列的对照表,…...
 
基于CentOS7.9安装部署docker(简洁版)
安装部署 1基于官方脚本安装(不推荐 不能自行选择版本) 官方文档:https://docs.docker.com/engine/install/centos/ 2 使用yum安装 阿里云文档:docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 # ste…...
MySQL常用练手题目
数据库表名和字段设计 1.学生表 Student(s_id,s_name,s_birth,s_sex) 学生编号,学生姓名, 出生年月,学生性别 2.课程表 Course(c_id,c_name,t_id) 课程编号, 课程名称, 教师编号 3.教师表 Teacher(t_id,t_name) 教师编号,教师姓名 4.成绩表 Score (s_id,c_id,s_score) 学生编号…...
 
Oracle字段长度不足位数补零
Oracle字段长度不足位数补零 有时候从数据库中取出的月份值是1,而不是01,该怎么办呢 SELECTLPAD( CODE_MONTH, 2, 0 ) FROMtb_cube_TY001 WHERECODE_BM_MEATYPE TY20 AND code_measure MYLX01 AND code_month <> ~ AND CODE_ENTITY 01A AND…...
 
<数据结构与算法>二叉树堆的实现
目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念 二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构 三、二叉树的顺序结构及实现 1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删…...
 
FPGA:RS编码仿真过程
FPGA:RS编码仿真过程 RS码是一种纠错性能很强的线性纠错码,能够纠正随机错误和突发错误。RS码是一种多进制BCH码,能够同时纠正多个码元错误。 之前已经记录了在MATLAB中进行rs编解码的过程,现在利用FPGA的IP核实现RS编码的过程&…...
 
RocketMQ 5.0 架构解析:如何基于云原生架构支撑多元化场景
作者:隆基 本文将从技术角度了解 RocketMQ 的云原生架构,了解 RocketMQ 如何基于一套统一的架构支撑多元化的场景。 文章主要包含三部分内容。首先介绍 RocketMQ 5.0 的核心概念和架构概览;然后从集群角度出发,从宏观视角学习 R…...
Android su
1. userdebug和user版本 2. 关闭selinux system/core diff --git a/init/selinux.cpp b/init/selinux.cpp index 5a0255acd..787917274 100644--- a/init/selinux.cpp b/init/selinux.cpp -104,6 104,8 EnforcingStatus StatusFromCmdline() { } bool IsEnforcing() { …...
 
微信小程序真机调试异常cmdId 1006, errCode-50011-已解决
cmdId 1006, errCode-50011 起因 小程序在模拟器上预览没问题,真机调试和体验版首页打不开,点展开显示cmdId 1006, errCode-50011 解决 查了下1006, 说是广告, 我没接广告,这个也不是错误码 1006广告组件被驳回你的广告正在被审核,无法展现广告后来找到几个类似的帖子…...
36.SpringMVC视图
SpringMVC视图 SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户 SpringMVC视图的种类很多,默认有转发视图(InternalResourceView)和重定向视图(RedirectView) 配置视图: 当工程引入jstl的依赖&a…...
 
LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表
一.48. 旋转图像 题目要求:就是一个顺时针的旋转过程。 思路:观察矩阵,得出翻转前第i行的第J个元素 等于 翻转后倒数第i列的第J个元素,举例说明,第1行第2个元素为“2”,翻转后到了 倒数第1列的第2个元素…...
Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(二)
修改qt5 7zip源码编译及使用(含展示进度)一文中的封装类ZlibHelper代码类,继承多线程,使解压,压缩时进度条不影响界面,同时添加压缩文件中的文件预览功能,建议直接看源码 导读 相关代码内容扩展预览内容时获取文件修改…...
 
224、仿真-基于51单片机音乐播放器流水灯控制Proteus仿真设计(程序+Proteus仿真+原理图+程序流程图+元器件清单+配套资料等)
毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…...
 
虹科展会 | 自动驾驶展品:上海汽车测试展精彩回顾
2023年8月9日-8月11日,上海国际汽车测试及质量监控博览会在上海圆满落幕。本次展会提供了一个了解最新汽车测试及质量监控技术、产品和趋势的机会,同时也是汽车测试及质量监控领域的专业人士和业内人士的重要交流平台。 雅名特是虹科旗下子公司ÿ…...
 
Unity自定义脚本的 初始模版
参考博主:Unity修改创建的脚本模板,Unity脚本模板路径_unity hub 怎么改脚本模板_先生沉默先的博客-CSDN博客 【100个 Unity实用技能】 ☀️ | Unity自定义脚本的初始模版_unity 模板脚本_呆呆敲代码的小Y的博客-CSDN博客 一,将脚本放到Ed…...
 
vue3中使用第三方插件mitt实现任意组件通讯
vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一,现在我在写代码时,一个组件的代码超过了200行,基本都会拆分组件。组件拆分后,组件之间的通讯就很重要,总结了一下,目前有这…...
 
(五)、深度学习框架源码编译
1、源码构建与预构建: 源码构建: 源码构建是通过获取软件的源代码,然后在本地编译生成可执行程序或库文件的过程。这种方法允许根据特定需求进行配置和优化,但可能需要较长的时间和较大的资源来编译源代码。 预构建: 预…...
 
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
 
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
 
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
 
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
 
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
 
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
 
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
