[转]Android 代码混淆和加固 so库 简单教你一行代码实现

混淆

因为开启混淆会使编译时间变长,所以debug模式下不开启。我们需要做的是:
1.将release下minifyEnabled的值改为true,打开混淆;
2.buildConfigField 不显示log日志

 

为什么要混淆:

 

  • 优化java的字节码
  • 减小apk文件的大小,在混淆过程中会删除未使用过的类和成员
  • 代码安全,使类、函数、变量名随机变成无意义的代号形如:a,b,c...之类。防止app被反编译之后能够很容易的看懂代码

 

 

APP需要保留的公共部分(通用)

  1. 四大组件以及子类;
  2. 自定义Application;
    1. native方法
    2. R下面的资源
    3. 序列化(Parcelable,Serializable)
    4. support下面的继承子类
    5. Activity中参数是view的方法
    6. 枚举
    7. 自定义View
    8. 带有回调函数(On*Listener,OnEvent)
    9. WebView

 

1. 判断程序是否运行在模拟器上

boolean isRunningInEmualtor() {boolean qemuKernel = false;Process process = null;DataOutputStream os = null;try{  process = Runtime.getRuntime().exec("getprop ro.kernel.qemu");  os = new DataOutputStream(process.getOutputStream());BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));os.writeBytes("exit\n");  os.flush();process.waitFor();// getprop ro.kernel.qemu == 1  在模拟器// getprop ro.product.model == "sdk"  在模拟器// getprop ro.build.tags == "test-keys"  在模拟器qemuKernel = (Integer.valueOf(in.readLine()) == 1);Log.d("com.droider.checkqemu", "检测到模拟器:" + qemuKernel);             } catch (Exception e){  qemuKernel = false;Log.d("com.droider.checkqemu", "run failed" + e.getMessage()); } finally {try{  if (os != null) {  os.close();  }  process.destroy();  } catch (Exception e) {}  Log.d("com.droider.checkqemu", "run finally"); }return qemuKernel;}

2. 检测keystore签名,再与之前得做比较

public int getSignature(String packageName) {      PackageManager pm = this.getPackageManager();PackageInfo pi = null;int sig = 0;try {pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);Signature[] s = pi.signatures;sig = s[0].hashCode();  } catch (Exception e1) {sig = 0;e1.printStackTrace();}return sig;}
 

3. 检测包名,版本名和版本号,然后做判断:

private String getAppInfo() {try {String pkName = this.getPackageName();String versionName = this.getPackageManager().getPackageInfo(pkName, 0).versionName;int versionCode = this.getPackageManager().getPackageInfo(pkName, 0).versionCode;return pkName + "   " + versionName + "  " + versionCode;} catch (Exception e) {}return null;}

 4.完整性校验

  • 对签名文件中classes.dex哈希值的校验

Android工程代码经编译打包生成apk包后,开发者需要对其签名才能在安卓市场上发布供用户下载和安装。对apk包签名后,会在原apk包结构基础上加入META-INF文件目录。

META-INF文件目录下含有三个文件:MANIFEST.MF文件、ANDROIDD.SF文件、ANDROIDD.RSA文件,META_INF目录文件结构如下图所示:

其中,MANIFEST.MF文件描述了在签名时,签名工具对apk包中各个文件摘要计算后的哈希值,并对哈希值做了Base64编码。MANIFEST.MF文件中描述的classes.dex文件的SHA-1哈希值如下图所示:

一旦攻击者对APK中反编译并篡改代码,经二次打包签名后的classes.dex文件的SHA-1必定改变,因此,我们可以将该文件中的classes.dex文件的SHA-1哈希值保存起来作为校验对比值,应用程序启动时读取apk安装包中的MANIFEST.MF文件,解析出classes.dex的SHA-1哈希值,然后与原SHA-1哈希值进行比较,判断此APK包代码文件是否被篡改。
通过检查签名文件classes.dex文件的哈希值来判断代码文件是否被篡改的java实现代码如下所示:

通过检查签名文件classes.dex文件的哈希值来判断代码文件是否被篡改
@param orginalSHA 原始Apk包的SHA-1值

public static void apkVerifyWithSHA(Context context, String baseSHA) {  String apkPath = context.getPackageCodePath(); // 获取Apk包存储路径  try {  MessageDigest dexDigest = MessageDigest.getInstance("SHA-1");  byte[] bytes = new byte[1024];  int byteCount;  FileInputStream fis = new FileInputStream(new File(apkPath)); // 读取apk文件  while ((byteCount = fis.read(bytes)) != -1) {  dexDigest.update(bytes, 0, byteCount);  }  BigInteger bigInteger = new BigInteger(1, dexDigest.digest()); // 计算apk文件的哈希值  String sha = bigInteger.toString(16);  fis.close();  if (!sha.equals(baseSHA)) { // 将得到的哈希值与原始的哈希值进行比较校验  Process.killProcess(Process.myPid()); // 验证失败则退出程序  }  } catch (NoSuchAlgorithmException e) {  e.printStackTrace();  } catch (FileNotFoundException e) {  e.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  }  } 

5.Android逆向-.so文件动态调试步骤

 

so库加密的方法

1.是在有源码的基础上进行对特定的section进行加密

2.基于二进制级别的特定函数的加密

 

参考博客:

https://blog.csdn.net/nicolelili1/article/details/79243744

 

https://blog.csdn.net/feibabeibei_beibei?t=1

 


---------------------
作者:深南大盗
来源:CSDN
原文:https://blog.csdn.net/WHB20081815/article/details/88960114
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS微课1000例】0004:值提取至点(Extract value to point)

文章目录 问题描述值提取至点工具介绍案例实现过程注意事项问题描述 研究区分布有成千上万个离散的矢量点(根据范围创建随机点),但是点上没有高程值,研究区DEM是有的,那么怎样在ArcGIS中提取每个点对应的高程值? 离散点分布情况: DEM数据(ArcGlobe中三维显示):

C语言试题159之计算字符串中子串出现的次数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:两个字符串连接程序 2 、温馨…

关于Android studio找不到sqlite数据库的解决方法

打开Android Device Monitor,剩下的与Eclipse相同。转载于:https://blog.51cto.com/10237758/1761397

linux ubuntu deepin apache2 rewrite

2019独角兽企业重金招聘Python工程师标准>>> apache php 环境装好了,下载了TP5的项目,然后部署上去之后,端口81,,但是 访问 127.0.0.1:81 正常 127.0.0.1:81/admin,报错 404 Not Found 原因是,…

论DATASNAP远程方法支持自定义对象作参数

论DATASNAP远程方法支持自定义对象作参数 DATASNAP远程方法已经可以支持自定义对象作参数,这是非常方便的功能。 1)自定义对象 type TMyInfo class(TObject) public AccountNo: string; SQL: string; Params: string; end; 2)远程方法定义 f…

[转]Android-Proguard(代码混淆)

一:混淆是什么,该怎么做? 如果我们的app正常发布就必须要经历混淆这一步,混淆可以使我们的app不那么容易被别人用反编译工具破解,就算被破解,想要读懂我们的源码也是非常费劲的,因为混淆过的源码…

学妹,你要的C语言版AOE网络数据结构来了,就这么简单!

文章目录AOE关键路径编程AOE完整求解程序AOE关键路径编程 不难发现AOE图最大特点是没有回路,并且有向图方向始终是从源点走向汇点,且源点汇点都是一个。 把图1写成邻接矩阵文件,见文件P200G736.TXT,并在此复制G0.C到AOE.C&#x…

C语言试题160之某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交换,第二位和第三位

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:某个公司采用公用电话传递数…

C# 关于状态机的实现(案例版)

大部分的状态机都是有限状态机,某些业务环境,或者其他环境中,如果有状态机其实还是很方便的。比如,我是用在了单个客户的Socket通信上,未连接状态,我就等连接。已连接状态,就等待下一步指令状态…

测试并发应用 (一)监控Lock接口

声明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernndez Gonzlez 译者:郑玉婷 校对:方腾飞 监控Lock接口 Lock 接口是Java 并发 API提供的最基本的机制来同步代码块。它允许定义临界区。临界…

[There will be more story......]

This blog will keep on updating.转载于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根据生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "双鱼", "白羊", "金牛", "双子"…

[转]Android 项目的代码混淆,Android proguard 使用说明

简介 Java代码是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。 ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆,当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要…

数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

文章目录邻接矩阵存储图的广度优先遍历过程分析C语言实现队列编程程序中加入图的处理函数结果的再次分析C#语言实现图的广度优先遍历、并显示广度优先遍历生成树JavaScript语言实现图的广度优先遍历、并显示广度优先遍历生成树邻接矩阵存储图的广度优先遍历过程分析 对图1这样…

C语言试题161之求100000以内的自守数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款刷算法、笔试、面经、拿大公司offer神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:自守数是…

改造.NET遗留应用

浅议.NET遗留应用改造TLDR:本文介绍了遗留应用改造中的一些常见问题,并对改造所能开展的目标、原则、策略进行了概述。一、背景概述1、概述或许仅“遗留应用”这个标题就比较吸睛,因为我听过太多人吐槽了。Robert Martin在《修改代码的艺术》…

GitHub的DGit改进了平台的可靠性、性能以及可用性

GitHub最近悄悄地发布了DGit,全称为“分布式Git”。这是一种基于Git创建的分布式存储系统,其目标是改进使用GitHub时的可靠性、可用性以及性能。\\DGit是一个应用层面的协议,它利用了Git分布式的特性,将每个仓库在三台不同的、独立…

用静态NAT实现外网PC访问内网服务器

在我们的生产环境中常常处于安全考虑将服务器置于内网环境中,但同时得向外网提供各种服务功能,此时就需要用到NAT技术。下面是我用思科的仿真软件搭建的一个实验环境,实现外网PC访问内网服务器。先说明一下实验环境:路由器R0左边为…

[转]分布式事务之TCC服务设计和实现注意事项

1、TCC简介 TCC是一种比较成熟的分布式事务解决方案,可用于解决跨库操作的数据一致性问题; TCC是服务化的两阶段编程模型,其Try、Confirm、Cancel 3个方法均由业务编码实现; 其中Try操作作为一阶段,负责资源的检查和…

量化投资策略的评估标准及其计算公式

收益率指标:分为策略的总收益率和策略的年化收益率 策略的总收益率: 策略的总收益率是评价一个策略盈利能力的最基本的指标,其计算方法为: 公式中Vt表示策略最终的股票和现金的总价值,V0表示策略最初的股票和现金的总…