Android 混淆使用及其字典混淆(Proguard)

2023-09-18 20:42:04

1.使用背景

ProGuard能够通过压缩、优化、混淆、预检等操作,检测并删除未使用的类,字段,方法和属性,分析和优化字节码,使用简短无意义的名称来重命名类,字段和方法。从而使代码更小、更高效、更难进行逆向工程。

Android代码混淆,又称Android混淆,是一种Android APP保护技术,用于保护APP不被破解和逆向分析。

所以在大部分的项目里,基本都会把混淆打开。

Tips:如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三方包是不能混淆的,这就需要我们手动编写混淆规则来保持不能被混淆的部分。例如Gson库,Litepal库,有些东西用到的话,就得去proguard-rules.pro文件里配置一下。

2.开启混淆

需要在app的build.gradle文件里进行配置。

android {
    ......
    defaultConfig {
         
   }
    buildTypes {
        release {
            minifyEnabled true      // 开启代码混淆(必须的哈)
            zipAlignEnabled true   
            shrinkResources true   
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    
}
  1. minifyEnabled:是否进行代码混淆(开混淆就必须要这个哈)
  2. zipAlignEnabled:是否进行Zip压缩优化(可选)
  3. shrinkResources:是否移除未被使用的资源(可选)
  4. proguardFiles:混淆规则配置文件
  5. proguard-android.txt:AndroidStudio默认自动导入的规则,这个文件位于Android SDK根目录\tools\proguard\proguard-android.txt。这里面是一些比较常规的不能被混淆的代码规则。
  6. proguard-rules.pro:针对自己的项目需要特别定义的混淆规则,它位于项目每个Module的根目录下面,里面的内容需要我们自己编写。

3.Proguard配置规则

即在proguard-rules.pro里进行编写配置。

这儿我就不细说了,因为平时我也用不了那么多,这儿贴一个比较全的链接

Android 代码混淆规则 - 掘金

Tips:

AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的(我目前看来是如此的)

4.字典混淆

我的配置:

# 混淆的压缩比例,0-7
-optimizationpasses 5
# 指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers
# 指定混淆是采用的算法
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# 指定外部模糊字典 proguard-chinese.txt 改为混淆文件名,下同
-obfuscationdictionary proguard-1il.txt
# 指定class模糊字典
-classobfuscationdictionary proguard-1il.txt
# 指定package模糊字典
-packageobfuscationdictionary proguard-1il.txt

其实就是指定

  • -obfuscationdictionary dictionary_path:指定外部模糊字典
  • -classobfuscationdictionary dictionary_path:指定class模糊字典
  • -packageobfuscationdictionary dictionary_path:指定package模糊字典

这三个的模糊字典。让你的代码,搞起来特别没得可读性。

这个txt文件怎么生成,你可以自己写个脚本生成,也可以用网上已经写好的。

https://github.com/WrBug/FrenziedProguard/tree/master/proguard-file

下载好文件后,放在和proguard-rules.pro同级的文件目录里面:

我使用的是 proguard-1il.txt,使用后反编译查看,首先是包名:

其次是内容:

可以看到,里面的各种对象,方法,变量名,参数等等都被混淆了,变化非常之大。

5.是否生效

使用反编译工具Jadx查看

GitHub - skylot/jadx: Dex to Java decompiler

更多推荐

TCP并发服务器的多进程实现与多线程实现

TCP并发服务器的多进程实现与多线程实现一、TCP并发服务器的多进程实现代码#include<my_head.h>#defineSERVER_IP"192.168.125.11"//服务器IP#defineSERVER_PORT6666//服务器端口//子进程处理客户端信息函数intdeal_client_messag

小插曲 -- 使用Linux编写 判断程序是否在运行的小程序

编写思路首先,在执行“ps-elf|grepxxx”时,如果xxx存在,通常会有两条结果,一个是xxx对应的PID,一个则是grep对应的PID,但是如果我希望执行命令后,xxx存在就只有xxx对应的PID,不存在就什么都不显示的话,可以将指令修改成:“ps-elf|grepXXX|grep-vgrep”,这样就可以屏

雷电9模拟器抓包

背景本人一开始使用fiddler,然后使用wireshark。然后一直没能成功对雷电9完成JDapp的抓包任务,后来发现一款新产品Reqable,实现了JD请求抓包。思路经过查找资料,我发现核心思路都相差不大,基本使用模拟器wifi代理+证书的形式,把同一局域网下的请求由本地端口代理,再通过工具进行抓包。实战本文以Re

有多条业务线,mysql建多库多表比较好还是一个库多个表比较好呢?

这个问题的答案取决于您的具体需求。以下是一些需要考虑的因素:数据独立性:如果您的业务线之间的数据是独立的,并且不太可能需要进行跨业务线的查询,那么将它们分成多个数据库可能是有意义的。这样可以使每个业务线的数据更加独立,减少潜在的冲突和竞态条件。查询性能:在某些情况下,将数据分为多个表可能会提高查询性能。例如,如果您的数

Qt(day5)

思维导图将登录操作和数据库绑定mywnd.h#ifndefMYWND_H#defineMYWND_H#include<QMainWindow>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QDebug>#include<QMessage

程序人生,中秋共享

程序人生,中秋共享随着科技的迅速发展,中秋节也悄然发生了变化。在这个传统的团圆节日里,程序人生与中秋共享形成了新的气象。在本文中,我将结合自己的职业经历,探讨程序人生与中秋共享之间的联系与意义。【中秋与程序人生的交融】作为程序员,我们每天都在和代码打交道,通过一行行指令来构建世界。然而,在这个机械化的过程中,我们也不忘

LLM预训练之RLHF(一):RLHF及其变种

在ChatGPT引领的大型语言模型时代,国内外的大模型呈现爆发式发展,尤其是以年初的LLaMA模型为首的开源大模型和最近百川智能的baichuan模型,但无一例外,都使用了「基于人类反馈的强化学习」(RLHF)来提升语言模型的性能,并在模型重注入了人类的偏好,以提高模型的有用性和安全性。不过RLHF也早已更新换代,我们

【Spring Boot】操作Redis数据结构

🌿欢迎来到@衍生星球的CSDN博文🌿🍁本文主要学习【SpringBoot】操作Redis数据结构🍁🌱我是衍生星球,一个从事集成开发的打工人🌱⭐️喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路⭐️💠作为一名热衷于分享知识的程序员,我乐于在CSDN上与广大开发者交流学习。💠我希望通过每一次学习,让更多读

【MySql】1- 基础篇(上)

文章目录1.1前言1.2基础架构1.2.1MySql基本架构示意图1.2.2SQL语句执行顺序1.3日志系统:一条SQL更新语句如何执行1.3.1两阶段提交1.4事务隔离1.4.1隔离性与隔离级别1.4.2事务隔离的实现-展开说明“可重复读”1.4.3事务的启动方式1.5深入浅出索引1.5.1索引常见模型1.5.1In

双周赛113(枚举、分类讨论 + 二分查找、枚举值域两数之和、换根DP)

文章目录双周赛113[2855.使数组成为递增数组的最少右移次数](https://leetcode.cn/problems/minimum-right-shifts-to-sort-the-array/)暴力枚举贪心O(n)[2856.删除数对后的最小数组长度](https://leetcode.cn/problem

91. 面试官:JSONP的原理是什么?

91期1.JSONP的原理是什么?2.css优先级是什么样的?3.display的值有哪些,分别有什么作用?上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布90期问题及答案1.什么是前后端分离,好处是什么?前后端分离是一种软件架构模式,它将前端和后端开发分离为两个独立的工作流程和技术栈,它们通过API或We

热文推荐