[转]Android 代码混淆和加固 so库 简单教你一行代码实现
混淆
因为开启混淆会使编译时间变长,所以debug模式下不开启。我们需要做的是:
1.将release下minifyEnabled
的值改为true
,打开混淆;
2.buildConfigField
不显示log日志
为什么要混淆:
- 优化java的字节码
- 减小apk文件的大小,在混淆过程中会删除未使用过的类和成员
- 代码安全,使类、函数、变量名随机变成无意义的代号形如:a,b,c...之类。防止app被反编译之后能够很容易的看懂代码
APP需要保留的公共部分(通用)
- 四大组件以及子类;
- 自定义Application;
- native方法
- R下面的资源
- 序列化(Parcelable,Serializable)
- support下面的继承子类
- Activity中参数是view的方法
- 枚举
- 自定义View
- 带有回调函数(On*Listener,OnEvent)
- 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博客文章一键转载插件
[转]Android 代码混淆和加固 so库 简单教你一行代码实现相关推荐
- iOS代码混淆安全加固
文章目录 自己创建脚本文件进行代码混淆 iOS代码自动混淆 最近公司扫描App漏洞,提出要给App做代码混淆加固,以提高反编译逆向难度.对于Android应用直接用360安全加固即可:但对于iOS应用 ...
- python jit_牛掰的numba库jit模块:一行代码让 Python 的运行速度提高100倍
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. "一行代码让python的运行速度提高100倍" ...
- 行人重识别 代码阅读(来自郑哲东 简单行人重识别代码到88%准确率)
来自郑哲东 简单行人重识别代码到88%准确率 阅读代码 prepare.py 数据结构 部分代码 一些函数 model.py ClassBlock ResNet50 train.py 一些参数 使用f ...
- 网站变灰代码,一行代码让网站整体变灰,wordpress网站一行代码全站变灰教程
在遇到特殊情况的时候,我们作为站长需要紧急将网站变灰的需求,在此小编给大家总结了几种方法,通过简单修改一下站点样式即可实现.一段代码让网站整体变灰.这里主要介绍的利用 filter: grayscal ...
- Android代码混淆与加固技术一
1. 2. 3. ② ③配置文件proguard-android-optimize.txt和proguard-rules.pro proguard-a...-optimize.txt文件位于sdk/t ...
- android百度api配置,Android Studio 配置使用百度api (附带简单样例)(示例代码)
还是和同学开发的那个课程作业项目的app, 要使用到百度地图的api 但是,官方文档貌似只有Eclipse的例子,对Android Studio似乎没有说明. 难道,是因为后者是 "Doo ...
- 狠!删库跑路!一行代码蒸发10亿人民币!
年后复工大戏,又增加一出:删库跑路! 此举直接给公司带来数10亿的市值蒸发损失! 这次不是别人,正是微信生态的第三方服务商微盟,在这个"远程办公"的节骨眼出事了. 2月25日,微盟 ...
- 怎么抠图最简单 教你一行Python代码去除照片背景
哈喽大家好呀,我是IT界搬运喵 今天来教大家如何使用Python去除照片背景,说到去除照片背景的方法,我首先想到的是第三方接口(如:百度AI,或者说什么设计里面的一键抠图.),但本文重点在于免费使用, ...
- 高响应比优先算法代码_以梦为码丨让每一行代码都充满温情
本期热点 智能校园部招聘专场 小海 小海冲鸭 我们一直在打磨的多款产品在上周海亮教育研究院产品发布会上崭露头角,激动!!! 别说话,我在敲代码 发布了哪些呀? 小海冲鸭 iClass.海亮星课堂.模板 ...
最新文章
- mysql之优化小技巧
- python中insert()函数的用法_Python list insert()用法及代码示例
- WingIDE 5的安装与破解方法
- Python把数据存储到CSV
- Qt Creator调试Qt Quick示例应用程序
- 七、jdk工具之jconsole命令(Java Monitoring and Management Console)
- 面试官:谈谈 Tomcat 请求处理流程,我一脸懵逼。。
- 一分钟了解阿里云产品:安全产品评测:阿里云盾安全威胁情报“态势感知”...
- 计算机232接口接线,RS232接口
- 金山打字通计算机英语,关于英语打字的问题我现在在用金山
- win10如果虚拟化服务器,Win10内置虚拟化技术Virtualization在哪里 Win10查看CPU是否支持VT步骤...
- 米家小相机最新固件_不到1000元的米家小相机 都有哪些缺点
- OT网络安全-OT客户端安全防护要采取那些措施
- 线性代数入门指南:线性方程组
- 抽象工厂模式(优缺点、使用场景、具体实现)
- EV3文件打不开,闪退怎么办(完美解决,无弹窗,无警告)
- MySQL导入myi,myd,frm文件及浏览
- backupexec mysql_backup-mysql.sh
- 【Android应用】 苏州实时公交
- 思维启发之意外的收获(发现自己思维局限和掀开二级指针的虎皮)
热门文章
- NCC CAP 6.0 发布 —— 新增支持 OpenTelemetry
- 微服务组件记事本:Skywalking的ES索引 · 收藏篇
- Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
- 自定义验证规则ValidationAttribute的使用
- 领域驱动设计-从贫血模型到充血模型
- 限制IIS站点的内存,避免级联影响
- Asp.Net Core使用Skywalking实现分布式链路追踪
- C# 中 ConcurrentDictionary 一定线程安全吗?
- C# :异步编程的注意点
- 网络知识 | 《图解HTTP》读书笔记(上)