【Android】Android程序保护与破解浅析
此文源自组内成员分享的PPT,其他成员的文档由于没有得到授权,暂不公开。
本文命令如果没有特殊注明,均为windows 7环境。
本文只涉及大概的知识点,不涉及具体的细节,需要注意。
反编译
apktool
可反编译资源文件(xml,点九图)以及代码为smali代码
使用命令:apktool d xxx.apk output_filepath
dex2jar
反编译dex文件(解压apk获得的classes.dex)为jar
使用命令:dex2jar xxx.dex
jd-gui
查看jar文件代码
使用方法,直接打开jar文件即可
AXMLPrinter2 单个xml文件
java -jar AXMLPrinter2.jar xxx.xml >output.xml
反编译的应对
•代码混淆
•增加会引起反编译器异常的代码
•关键代码使用NDK
•软件加壳(如UPX)
•检测模拟器、调试器对抗动态调试
•检查签名、检验保护(classes.dex hash值)防止重编译
混淆
•混淆原理
在应用程序保持语句含义不变的前提下从程序P转换到了P'。
混淆技术是指对拟发布的应用程序进行保持语义的变换,使得变换后的程序和原来的程序在功能上相同或相近,但是更难以被逆向工程所攻击。
•常见方法
代码外形混淆(改名)
控制命令混淆(改变程序判断条件或者增加可控制条件以及其他对程序的结构以及流程进行调整)
内部数据混淆(数据结构的变换,变量的分裂、合并,数据结构变换,静态数据动态生成,类继承转换)
预防混淆(增加某些特定反编译反编译时会出错的代码)
•评价指标
强度,混淆算法对程序增加的复杂度
弹性,混淆后程序的抗机器攻击能力
开销,由代码转换带来的额外开销
Proguard
•代码外形混淆
•sdkpath\tools\proguard \proguard-android.txt
•项目proguard-project.txt
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html -dontusemixedcaseclassnames #包明不混合大小写
-dontskipnonpubliclibraryclasses #不去忽略非公共的库类
-verbose # Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize #优化
-dontpreverify #预校验
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file. -keepattributes *Annotation* #保护注解
-keep public class com.google.vending.licensing.ILicensingService #保护指定的类
-keep public class com.android.vending.licensing.ILicensingService # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
#不混淆jni方法
-keepclasseswithmembernames class * {
native <methods>;
} # keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
} # We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
} # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#不混淆Parcelable的子类,防止android.os.BadParcelableException
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#不混淆资源类
-keepclassmembers class **.R$* {
public static <fields>;
} # The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
原理图,经过压缩->优化->混淆->预校验4个步骤,默认优化以及预校验是没有打开的
•混淆注意事项
避免混淆泛型(fastjson)
-keepattributes Signature
排除反射、序列化相关的类
排除native方法,以及AndroidManifest.xml提到的类
忽略警告
-ignorewarnings
-dontwarn android.support.**
保留一个完整的包
-keep class com.sogou.appmall.**{*;}
•调试与bug追踪
1.dump.txt apk包内所有class的内部结构
2.mapping.txt 混淆前后的映射
3.seeds.txt 未混淆的类和成员
4.usage.txt 列出从apk中删除的代码
•还原日志
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
比如:retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果需要输出的日志有行号,需要添加
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable #输出错误信息行号
更多
•1. http://proguard.sourceforge.net/
•2.http://developer.android.com/tools/help/proguard.html
【Android】Android程序保护与破解浅析的更多相关文章
- 微信5.0 Android版飞机大战破解无敌模式手记
微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...
- Android 4.0 ICS SystemUI浅析——StatusBar结构分析
Android 4.0 ICS SystemUI浅析——StatusBar结构分析 分类: Android2012-06-30 14:45 23687人阅读 评论(8) 收藏 举报 androidsi ...
- Android开发学习之对话框浅析
对话框式程序运行中弹出的窗口.Android系统中有四种默认的对话框:警告对话框AlertDialog.进度对话框ProgressDialog.日期选择对话框DatePickerDialog以及时间选 ...
- Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder
Stack Overflow 排错翻译 - Closing AlertDialog.Builder in Android -Android环境中关闭AlertDialog.Builder 转自:ht ...
- [Android]Android端ORM框架——RapidORM(v2.1)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...
- [Android]Android端ORM框架——RapidORM(v2.0)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
- Android android:gravity属性介绍及效果图
转自: http://blog.csdn.net/aminfo/article/details/7784229 Android:gravity的属性官方说明如下: public static fina ...
- [转][Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
转自:http://blog.csdn.net/qiujuer/article/details/39754517?utm_source=tuicool [Android][Android Studi ...
- 图解Android - Android GUI 系统 (1) - 概论
Android的GUI系统是Android最重要也最复杂的系统之一.它包括以下部分: 窗口和图形系统 - Window and View Manager System. 显示合成系统 - Surfac ...
随机推荐
- 在Mac OS X中搭建STM32开发环境(1)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 本文方法必须好用!绝不坑爹!看了N多英文资料才搞明白的,适用于STM32F4DISCOVERY评估板,带 ...
- top每个参数的意义
上图来源于本人虚拟机,作为每个参数解释的参考 10:32:20:现在的时间 up 1 min : 服务器运行的时长 1 user:现在只有1个用户登录 load average: 0.74, 0.25 ...
- [可拖动DIV]刚开通博客顺便就写了点东西!
说说我自己的思路 首先需要一个初始div div { border: 1px #333 solid; width: 200px; height: 50px; } <div id="od ...
- JS获得QQ号码的昵称,头像,生日
这篇文章主要介绍了JS获得QQ号码的昵称,头像,生日的简单实例,有需要的朋友可以参考一下 http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?ui ...
- Python的进程间通信
进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等 1.共享内存 Python可以通过mmap模块实现进程之间的共享内存 mmap文件对象既像一个字符串也像一个普通文件对 ...
- 数位DP入门之hdu 3555 Bomb
hdu 3555 Bomb 题意: 在1~N(1<=N<=2^63-1)范围内找出含有 ‘49’的数的个数: 与hdu 2089 不要62的区别:2089是找不不含 '4'和 '62'的区 ...
- mysql数据库乱码
问题:mysql数据库的编码都设置为utf8的情况下,用jdbc往数据库中插入数据时仍然乱码, 解决方法:在jdbc的中加上参数characterEncoding=utf8&useUnicod ...
- CentOS PPTP配置LNMP+PPTP+FreeRADIUS+DaloRADIUS+流量控制
折腾了好几天,查阅了很多资料,终于搞定了,泪牛满面,下面记录详细操作过程!注:测试环境为CENTOS5.8 x86 安装PPTP 直接使用赵蓉的PPTP一键安装包即可 wget http://dl.z ...
- js和Jquery获取选中select值和文本
<body> <select name="PaymentType" style="width:110px" > <option v ...
- BZOJ 3929 Circle of digits 解题报告
首先,我们可以得到最高位的位数为:\(\lfloor\frac{n+k-1}{n}\rfloor\),记作 \(E\). 然后给这 \(n\) 个长为 \(E\) 的数字排序,后缀数组 \(O((n+ ...