版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android系统混淆与反混淆技术介绍技术创新,变革未来#不冲突, 可联用!混淆VS加固混淆将代码变得难以阅读配置复杂需要开发配合加固隐藏代码对抗自动化工具反调试/反篡改/反注入一键搞定不需要开发配合#Ref: /comparison-proguard-and-dexguard工具ProGuardDexGuard#缺点:接口相关的名字无法替换反射很难自动识别优点:代码可读性差减少文件大小名字替换替换类名替换函数名替换成员名替换所有引用#超长名字oooooooooooooo.找茬Oo0o0OO00oooOOo0oo ijijijjiiiJiIIjii $_$ $_java语法关键字 int in
2、t = 5;Unicodeava u0237CJK字符难以阅读字符盲文点字模型2800-28FF名字替换:奇葩的名字#-dontshrink-dontoptimize-dontusemixedcaseclassnames-keepattributes *Annotation*# 几大组件-keep public class * extends Activity/Application/. #其他keep, 这里略去-dontwarn *-printmapping mapping0.txt-injars obad-dex2jar.jar-outjars aaa.jar-libraryjars a
3、ndroid.jar名字替换:如何对付奇葩 ?相对来说abc是比较好阅读的Proguard再混淆一次!#处理前处理后名字替换:结果比较#名字替换:如何对付abc ?没办法自动化, 只能靠阅读代码高富帅JEB普通大众Proguard#1. 生成默认的mapping文件-dontshrink-dontoptimize-injars aaa.jar-libraryjars android.jar-keep class *-printmapping mapping1.txtcom.android.system.admin.x - com.android.system.admin.x: java.lan
4、g.String a - ajava.lang.String d - d int e - e.Proguard配置Mapping文件名字替换: Proguard重命名#2. 修改mapping文件, 重新运行Proguard-dontshrink-dontoptimize-injars aaa.jar-outjars bbb.jar-libraryjars android.jar-applymapping mapping1.txtcom.android.system.admin.x - .ObadSQLiteOpenHelper: android.database.sqlite.SQLiteD
5、atabase f - database byte g - encoded_data_arrayjava.lang.String a(int,int,int) - decryptProguard配置Mapping文件名字替换: Proguard重命名#Proguard重命名结果#再混淆一次自动化重命名a Clz_a b fld_b c mtd_cd Clz_d_List自动化分析Source EnumACC_BRIDGEGetter/setter识别开源SDK自动反编译手工调整手工分析代码+源码在手日志toString反混淆大项目(名字恢复)#将字符串在运行时恢复DexGuardString
6、a(int, int, int)OtherString a(String)优点:静态看不到字符串缺点:内存消耗增加性能降低Class.forName(a(130, 1, -10).getMethod(a(53, 19, -21),Class.forName(a(79, 1, -11).invoke(j, instance);字符串加密#getstatic System.out LDC “hello world!”invokevirtual println(String)getstatic System.out sipush 130sipush 1sipush -10invokestatic a
7、(int,int,int)invokevirtual println(String)System.out.println(“hello world!”);字符串加密:简单实现Java bytecode 使用LDC指令加载字符串替换对应的LDC指令即可实现加密#使用= 比较字符串void fa() fb(“1.0”);void fb(String version) if(version = “1.0”)print(“yes!”);void fa()fb(new String(.);void fb(String version) if(version = new String(.)print(“y
8、es!”);条件不成立, 什么都没有条件成立, 打印yes解决办法: 使用equals 比较字符串字符串加密:带来的问题#private static String decrypt(int n, int n2, int n3) String a = decrypt(-20, 842, -576);解决办法:找到对应的函数和参数, 反射调用, 将结果写回.字符串加密: 如何应对?静态函数返回值是String解密函数没有对外引用参数是固定值#解密前解密后注:t.q(.)也是解密函数字符串解密结果#反射替换将函数替换为等价的反射API调用String c = abc.substring(2,3);S
9、tring c = (String)Class.forName(java.lang.String).getMethod(substring, int.class, int.class).invoke(abc, 2, 3)优点:与字符加密串结合效果更佳缺点:代码大小增加性能降低#LocalStackOpcodeldc abc“abc”sipush 2“abc”, 2sipush 3“abc”, 2, 3invokevirtual substring(II)String c = abc.substring(2,3);1.将Stack的数据保存到Local2.构建Class对象3.构建Method对
10、象4.重新加载Local中的值到Stack5.调用invoke函数思路:反射替换: 简单实现#LocalStackOpcode“abc”, 2, 3astore 1, istore 2, istore 3“abc”, 2, 3ldc “java.lang.String” invokestatic Class.forName“abc”, 2, 3String.classldc “substring”,. #构建参数类型 invokevirtual Class.getMethod“abc”, 2, 3substringaload 1, iload 2, iload 3,“abc”, 2, 3sub
11、string, “abc”, 2, 3invokevirtual Method.invoke()String a=”abc”; int b=2; int c=3;String c = (String)Class.forName(java.lang.String).getMethod(substring, int.class, int.class).invoke(a, b, c)等价于反射替换: 简单实现#1. 将所有的Class.forName恢复成class对象String c = (String)Class.forName(java.lang.String).getMethod(subst
12、ring, int.class, int.class).invoke(abc, 2, 3)String c = (String)String.class.getMethod(substring, int.class, int.class).invoke(abc, 2, 3)反射替换:如何处理?#反射替换:如何处理?2. 将getMethod恢复成对应对象String c = (String)String.class.getMethod(substring, int.class, int.class).invoke(abc, 2, 3)String c = (String) String.sub
13、string(II).invoke(abc, 2, 3)表示一个Method对象#3. 将invoke函数展开String c = (String) String.substring(II).invoke(abc, 2, 3)String c = (String) ”abc”.substring(2,3)反射替换:如何处理?#清理前:清理后:清理反射结果#日志清除清理android日志输出代码实现原理Ref: /questions/5553146/disable-logcat-output-completely-in-release-android-app/5553290#5553290-as
14、sumenosideeffects class android.util.Log public static * d(.);public static * w(.); public static * v(.); public static * i(.);#Ref: /questions/22713166/removing-log-calls-with-proguard-leaves-behind-stringbuildersnew StringBuilder(version is: ).append(n);Log.d(“tag”, “version is ” + version );原因:“v
15、ersion is” + version 会被转换成new StringBuilder(“version is ”).append(version).toString().而Proguard只负责删除Log.d的函数调用, 没有删除StringBuilder相关的代码清理后:源代码:日志清除: Proguard缺陷#Ref: /blog/2013/04/07/dexguards-assets-encryption/优点:隐藏资源于无形缺点:必须调用AssetManager.open()性能降低将apk中asset目录的文件加密, 使用前解密Asset加密#InputStream is = th
16、is.getAssets().open();Cipher cipher = Cipher.getInstance(AES/CFB/NoPadding); cipher.init(DECRYPT_MODE, /* key */);return new CipherInputStream(is, cipher).available();等价于Asset加密: 原理拦截open函数 返回解密流#原理:AndroidManifest中同时包含ResourceId和namespace/name信息.而Android部分使用ResourceId查找对应的xml标签.这部分的namespace/name信息是多余的, 可以删除.AndroidManifest混淆namespace和name信息被
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 48021.2-2026信息技术计算机图形图像处理及环境数据表示第2部分:类人动画动作数据动画
- 2026年秋季开学高中军训集合与离散课件
- 2026年秋季开学大学开学第一课(目标清单)课件
- 新质生产力产业赛道的投资逻辑与潜在机遇分析
- 数字营商环境优化路径及其综合评价体系构建
- 平台经济环境下数字治理的逻辑架构与实践研究
- 零售行业全渠道数字化转型路径与策略优化研究
- 多元行业盈利模式的差异化对比与竞争能力分析
- 基于区块链的可信溯源系统规模化应用框架研究
- 大学生入学教育7
- 2025届上海市金山区三下数学期末质量检测试题(含解析)
- 2026年人民法院聘用书记员考试重点试题及答案解析
- 2026海南省农业信贷担保有限责任公司招聘高层管理人员1人考试模拟试题及答案详解
- GB/T 47655-2026电力电子装备和系统的构网性能要求及试验方法
- 2026年新高考北京政治真题含答案
- 2026年博物馆社会教育活动策划方案
- 新版2026年高考政治(山东卷)真题详细解读及评析
- 2026年招聘消防文员笔试题库附答案
- 2026年企业法律顾问资格考试模拟卷
- 立克次体病防治指南(2025版)
- 2026新疆吐鲁番市托克逊县面向社会招聘警务辅助人员138人笔试参考题库及答案解析
评论
0/150
提交评论