《Android攻防实战》读书笔记——保护App安全

自动化脚本 — Android无障碍的攻防 — 如何保护自己的APP 现在无障碍技术越来越引起更多人的重视,很多公司都想借助这个技术从而减少人工成本,或者实现一些自动化的脚本,但是这个技术是一把双刃剑,因此在此普及一些和无障碍技术的实现以及预防等相关的内容。 阅读详情

保护app组件

  • 保护app组件的途径有两条:1.正确使用AndroidMenifest.xml文件 2.在代码层面上强制进行权限检查

AndroidManifest 文件加固

  • AndroidManifest文件中的 android:exported 定义是否允许组件被其它app调用,如果app中的组件不需要被其它app调用,或者需要明确的与android系统其它部分的组件的交互隔离开的话,应该在AndroidManifest文件中加入如下属性:
<[组件名]android:exported = false></组件名>
原理
  • 通过AndroidManifest.xml文件进行权限检查对于不同类型的app组件,作用是不同的,因为它们是通过不同的进程间通信(IPC)机制进行交互的,不同的app组件,android:permission的作用是不同的
效果
  • Activity:使得外部app中的组件,不能成功使用startActivity或startActivityForResult运行相应的Activity
  • Service:使外部app中的组件不能绑定(通过调用bindService())或启动(通过调用startService())相应的Service
  • Receiver 限制能向该receiver发送广播intent的外部app组件的数量
  • Provider 对能通过该content provider访问的数据进行访问限制

通过定制权限保护组件

Android平台定义了一系列用于保护系统服务和app组件的默认权限,可以对权限进行调整和定制

做法

  • 在string.xml中声明表示permission标签的字符串
<string name= "custom_permission_label">Custom Permission</string>
  • 在app中添加保护级别为normal的定制权限
在AndroidManifest.xml中
<permission android:name = "android.permission.CUSTOM_PERMISSION"
android:protextionLevel = "normal"
android:description = "My custom permission"
android:label = "@string/custom_permission_label"
>
  • 在组件中使用,为了让这个权限能和其他权限一样工作,需要将它添加到app中某个组件的android:permission属性中去
    • activity

      <activity ...
      android:permission = "android.permission.CUSTOM_PERMISSION">
      </activity>
    • content provider

      <provider ...
      android:permission = "android.permission.CUSTOM_PERMISSION">
      </provider>

      *service

      <service ...
      android:permission = "android.permission.CUSTOM_PERMISSION">
      </service>
  • 也可以通过声明user-permission的方式让其它app也能请求这一权限
<uses-permission android:name="android.permission.CUSTOM_PERMISSION"/>

定义权限组

  • 定制的权限还可以在逻辑上分组,可以通过分配语法,告知请求一个给定权限的app或者请求某几个权限的组件,
做法
  1. 添加一个表示权限组的标签(label)的字符串,可以在string.xml中添加
<string name = "my_permissions_group_label">Personal Data Access</string>

2.在AndroidManifest.xml中添加

<permission-group
android:name = "android.permissions.personal_data_access_group"
android:label ="@string/my_permissions_group_label"
android:description = "Permissions that allow access to personaldata"
>
  1. 分配定义的权限到组中
<permission ...
android:permissionGroup = "android.permission.personal_data_acess_group"/>

标签解释

  • android:name 定义名称
  • androidprotectionLevel:定义权限的保护级别
    • normal:定义非危险级别
    • dagerous:定义那些会使用户暴露在财务、名誉、或法律风险下权限
    • signature:自动赋予那些由定义该权限的app相同签名的app
    • signatureOrSystem:该权限会被自动赋予那些作为系统镜像的一部分或者有定义该权限的app相同签名的app

保护content provider路径

  • 确保已经为之注册了适当权限

做法

  • 需要设置一个用于管理所有与你的认证相关路径的读和写权限的permission,在AndroidManifest 添加provider元素
<provider android:enabled = "true" android:exported = "true" android:authorities = "com.android.myAuthority android:name = "com.myapp.provider"
android:permission="[permission name]"
>
  • permission name 是其他app在读或写任何content provider路径时必须拥有的权限。把相关权限添加在这一级别
可以要求提供读写权限
<provider android:writePermission = "[write permission name]"
    android:readPermission = "[read permission name]"
>
</provider>
  • 还可以加入元素
<provider...>
<path-permission android:path = "/[path name]"
android:permission = "[read/write permission name]"
</provider>
  • 可以使用URI授权
<provider...>
<grant-uri-permission android:path="[path name]"/>
</provider>

防御SQL注入攻击

  • 避免使用SQLiteDatabase.rawQuery() 改用一个参数化的语句,将参数转换
INSERT VALUES INTO [table name](?,?,?,?,....)

验证App签名 (防篡改)

*通过获取keytool工具签名时的证书指纹 SHA1,与app中读取出来的指纹进行比较。

* 获取当前运行的app的指纹代码:
 public String getCertificateSHA1Fingerprint(Context context) {
        //获取包管理器
        PackageManager pm = context.getPackageManager();

        //获取当前要获取 SHA1 值的包名,也可以用其他的包名,但需要注意,
        //在用其他包名的前提是,此方法传递的参数 Context 应该是对应包的上下文。
        String packageName = context.getPackageName();

        //返回包括在包中的签名信息
        int flags = PackageManager.GET_SIGNATURES;

        PackageInfo packageInfo = null;

        try {
            //获得包的所有内容信息类
            packageInfo = pm.getPackageInfo(packageName, flags);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        //签名信息
        Signature[] signatures = packageInfo.signatures;
        byte[] cert = signatures[0].toByteArray();

        //将签名转换为字节数组流
        InputStream input = new ByteArrayInputStream(cert);

        //证书工厂类,这个类实现了出厂合格证算法的功能
        CertificateFactory cf = null;

        try {
            cf = CertificateFactory.getInstance("X509");
        } catch (Exception e) {
            e.printStackTrace();
        }

        //X509 证书,X.509 是一种非常通用的证书格式
        X509Certificate c = null;

        try {
            c = (X509Certificate) cf.generateCertificate(input);
        } catch (Exception e) {
            e.printStackTrace();
        }

        String hexString = null;

        try {
            //加密算法的类,这里的参数可以使 MD4,MD5 等加密算法
            MessageDigest md = MessageDigest.getInstance("SHA1");

            //获得公钥
            byte[] publicKey = md.digest(c.getEncoded());

            //字节到十六进制的格式转换
            hexString = byte2HexFormatted(publicKey);

        } catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (CertificateEncodingException e) {
            e.printStackTrace();
        }
        return hexString;
    }

    //这里是将获取到得编码进行16 进制转换
    private String byte2HexFormatted(byte[] arr) {

        StringBuilder str = new StringBuilder(arr.length * 2);

        for (int i = 0; i < arr.length; i++) {
            String h = Integer.toHexString(arr[i]);
            int l = h.length();
            if (l == 1)
                h = "0" + h;
            if (l > 2)
                h = h.substring(l - 2, l);
            str.append(h.toUpperCase());
            if (i < (arr.length - 1))
                str.append(':');
        }
        return str.toString();
    }

通过检测安装程序、模拟器、调试标志位反逆向

  • 检查发布渠道是否正常
  • 检查自己是不是运行在一个模拟器中
  • 检查app的可调式标识位是否被打开

用ProGuard 删除所有日志信息

  • ProGuard是一个开源的java代码混淆器,Android SDK自带这个工具
  • Android studio 环境中设置
  minifyEnabled true
            proguardFile file('proguard-rules.pro')
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

用GexGuard进行高级代码混淆

  • GexGuard要比ProGuard的可维护性和可测试性更多,编译和输出则是经过优化和加固的。使用GexGuard可以获得更多的安全性,同时,它还具有:API隐藏和字符串加密的特性

    • API隐藏:使用API的反射机制对敏感API和代码的调用。
    • 字符串加密:把源代码中的字符串加密,增加逆向的难度
  • DexGuard是收费的,但是对于一个公司来说是可以承受的

  • DexGuard要比Proguard要强大,提供资源文件的混淆,和代码修改的检测
android安全攻防实战2024年字节跳动、阿里等大厂Android面试题 我最近从朋友那里收集到了2020-2021BAT 面试真题解析Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助大家深刻理解Android相关知识点的原理以及面试相关知识。这份资料把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节;还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。这里也分享给广大面试同胞们,希望每位程序猿们都能面试成功~点击直达GitHub。 阅读详情

相关推荐

App安全攻防实战:逆向分析与加固技术深度解析

在移动应用开发领域,逆向工程与代码加固是保障App安全的核心技术。逆向工程通过静态分析和动态分析,深入理解应用内部逻辑与数据流,帮助开发者发现潜在漏洞与风险点。其技术价值在于从攻击者视角审视自身防御体系,提升应用抗攻击能力。在实际应用场景中,逆向分析常用于安全审计、漏洞挖掘与竞品研究,而加固技术则通过代码混淆、反调试等手段增加攻击门槛。本文聚焦于Frida动态插桩与SSL Pinning绕过等热词技术,结合实战案例,系统阐述如何构建有效的App安全防线。

weixin_30932215的博客 686

无障碍(二)检测与防范

由无障碍(一)功能实现我们知道,无障碍服务可以获取界面上的控件和控件的文案信息。那么就可以通过文案做一些自动化操作。比如:自动刷新,找到列表中符合条件的票务信息、订单信息,找到抢票按钮,实现自动抢单操作。

NIIIICO的博客 6426

Android APK安全加固与脱壳技术:攻防实战深度解析

在移动应用安全领域,代码保护与逆向分析构成了持续演进的技术对抗。APK加固与脱壳技术作为这场攻防的核心,其本质是通过加密、混淆和运行时保护等手段,防止应用代码被静态分析和动态调试。从技术原理层面看,加固方案通过代码混淆、字符串加密、反调试检测等多层防护,提升逆向工程门槛;而加壳技术则采用“外壳程序”动态加载加密原程序的架构,实现静态分析的失效。这些技术的工程价值在于平衡应用安全与性能开销,广泛应用于金融、游戏等高价值场景。随着VMP(虚拟机保护)等高级加固方案的普及,脱壳技术也同步演进,其中基于Frida的

weixin_30764883的博客 565

Auto.js 注意事项

Autojs注意点前言一、查找控件总结 前言 最近心血来潮想弄一个安卓脚本,搜索几番,发现了autojs,Android7.0以上大部分功能可以免root(只需要开始无障碍服务)实现。 在此,记录一些关键点。 一、查找控件 查找控件时 加上className("")筛选条件成功率更高 默认的find()查找范围 我目前还不清楚。在一个很长的滑动页面中,经常会找到当前页面没有的控件,但是却点击不了,所以可以通过UiSelector.bounds(left, top, right, buttom)

qq_42581482的博客 6788

Android安全攻防实战(渗透测试).rar

非常有用的一本书,可以帮助你快速掌握移动端渗透测试技巧,

Android安全攻防实战(带书签目录版).pdf

Android安全攻防实战(带书签目录版).pdfAndroid安全攻防实战(带书签目录版).pdf

Android移动安全攻防实战 第四章 MobSF移动安全框架

MobSF

v_3483608762的博客 1827

Android安全攻防实战-高清-完整目录-2015年7月

Android安全攻防实战-高清-完整目录-2015年7月,分享给所有需要的人!

《Android攻防实战》——实践App安全

app证书原理Android app的签名实际上是对JAR签名的重新利用。用一个密码学意义上的hash函数计算app的内容,这个hash会与一张表示开发者身份的证书绑定在一起并发布出来,将hash与开发者的公钥,也就是和私钥联系在一起,证书通常是由开发者的私钥加密的,是一种自签名证书 app证书是一个app在推送到app市场中,表示开发者身份的。它是以把开发者的id和他们的app以密码学的方式关联起

So Now,Trust Me 3232

基于R和gephi做宏基因组与代谢组等多组学联合network相关性网络图

拿到多组学的数据后一直在找合适的方法将二者进行关联,比如我这里是三种体液的代谢组与一种体液的宏基因组。需求是对多组学进行关联分析,直到最近看到不少文章里利用Gephi将相关性表格进行可视化的图,效果还不错,于是写个过程记录自用。这里演示的是属水平的差异菌群相对丰度(宏基因组结果)与代谢组鉴定到的差异代谢物进行关联。先是计算相关性生成graphml格式文件使用Gephi软件进行可视化。

twocanis的博客 6786

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 527

【Android】App攻防之代码混淆

代码混淆(Obfuscation)是将计算机程序的源代码或机器代码,转换成功能上等价,但是难于阅读和理解的形式的行为。 — 维基百科 Android代码混淆,又称Android混淆,是伴随着Android系统的流行而产生的一种AndroidAPP保护技术,用于保护APP不被破解和逆向分析。 — 百度百科

宾有为的博客 6211

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 232

海云安:利益博弈,APP安全漏洞背后的攻防交锋

全球范围内移动设备的数量早就在多年前超越了世界人口总和。Statista的数据显示,2016年全球范围内智能手机的出货量约在15亿台左右,预计到2020年这个数字会增加到17.1亿;到2018年,全球手机用户总数将达到25.3亿人次——这其中1/4都来自中国。 而在国内,随着近年来移动互联网...

choupuwu4585的博客 305

基于RK3588边缘计算平台的人数统计系统设计与实现

针对人数统计场景优化的YOLOv5模型完整的模型转换和部署流程高效的嵌入式推理优化方案低成本、低功耗的部署方案实时性强,满足工业应用需求可扩展性好,适配多种应用场景引入注意力机制,提高小目标检测能力结合多模态信息,增强系统鲁棒性开发可视化管理平台,提升用户体验随着边缘计算和AIoT技术的快速发展,基于深度学习的智能视觉系统必将在更多领域发挥重要作用。本项目为相关应用的开发和部署提供了有价值的参考,为推动人工智能技术的产业化应用做出了积极贡献。

LXY_LOVE36的博客 145

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

Android安全实战指南:从环境搭建到漏洞挖掘的完整攻防体系

移动应用安全是信息安全领域的重要分支,其核心在于理解应用在Android系统上的运行机制与潜在风险。从原理层面看,Android应用基于Java/Kotlin及Native代码构建,通过逆向工程可分析其逻辑实现;而动态插桩技术则允许在运行时监控和修改应用行为,为安全评估提供动态视角。在技术价值上,掌握Android安全攻防能力不仅能帮助开发者构建更健壮的应用防御体系,也是安全研究员进行漏洞挖掘、恶意软件分析的基础。典型的应用场景包括移动应用渗透测试、数据安全审计、恶意代码分析等。本文聚焦于Android安全

weixin_30430169的博客 363

笔试题-2023-大疆-数字IC设计【纯净题目版】

笔试题-2023-大疆-数字IC设计【纯净题目版】

w0shishabi的博客 2511

android安全攻防实践_Android安全攻防实战 PDF 下载

相关截图:资料简介:Android是目前比较主流的移动设备操作系统,占据了全球近84%的市场份额。因此,Android系统中的安全问题也就变得十分重要。 本书通过大量极富针对性的实验,通过对常见的安全场景中解决方案的讲解,帮助读者全面掌握各种攻-防实用技能。因而,本书的实用性也很强,即使是一时不能完全理解其中的技术原理的新手,根据作者给出的方法,也能解决实践中遇到的大部分问题;而高手也能从中借鉴到...

weixin_32059509的博客 946

使用 MATLAB/Simulink 构建一个电机-液压联合控制系统的仿真模型

本文详细介绍了基于Simulink的电机与液压执行机构联合控制系统建模方法。通过7个步骤,系统讲解了从创建项目、搭建PMSM电机模型、建立逆变器与矢量控制模块,到构建液压泵和执行机构模型的完整过程。重点展示了如何设置关键参数、添加测量反馈模块,并提供了实用的代码片段。教程还包含仿真运行流程、结果分析指标及进阶建议,帮助读者掌握多物理场耦合系统建模的核心技术。该方法适用于机电液一体化系统设计,为工程实践提供有效参考。

amy_mhd的博客 613

vxWorks下dosFs文件系统的创建

文件系统,是指操作系统根据目录和文件的组织形式在磁盘设备上应用的一种设备驱动,不同的文件系统对目录和文件有不同的限制(如目录名限制,文件大小限制等)。VxWorks支持多种文件系统,比较重要的有:1、dosFs:适用于块存取设备(比如硬盘、软盘),和MS-DOS文件系统兼容;2、rawFs:提供了一种简单的原始文件系统。该文件系统将整个硬盘当作一个单独的大文件;3、cdromFs:允许系统从按照I

技术联盟 1万+

web攻防安全教程

web攻防安全教程

2302_76672693的博客 311

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

《Android安全攻防实战》读书笔记——利用App中的漏洞

App安全的目标 保护用户数据 口令 认证令牌 联系人 通信记录 敏感服务器的IP地址或域名 Logcat暴露信息通过ADB查看设备的logcat信息 启用adb调试 adb logcat * 过滤功能 adb logcat [options][filter] * -v<格式> 设置输出格式 brief,process,tag,thread,raw,time,threadtime,long * -

So Now,Trust Me 627

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android app 安全

App安全 从一款被篡改的软件谈 Android App 的安全之路 《Android攻防实战》读书笔记——保护App安全 安全问题 APP安全问题 反编译 APK反编译 apk加固 Apk源码的加固(加壳)原理解析和实现 Android中的Apk的加固(加壳)原理解析和实现 Android中的Apk的加固(加壳)原理解析和实现 Android中对Nativ...

vivian的专栏 589

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 《Android安全攻防实战》读书笔记——利用App中的漏洞
下一篇: 《Android攻防实战》读书笔记——Android安全评估工具——Drozer (日后学习)
ProbuINg
博客等级 码龄14年 10粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值