【转】Android 防破解技术简介
http://www.cnblogs.com/likeandroid/p/4888808.html
Android 防破解技术简介
这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改代码,之后再重新编译上传到应用商店!到时候,如果用户下载了这些应用,就可能造成个人信息或者金钱的丢失!所以,作为开发者的我们,有必要学习一些防止被破解的技术手段了!
简介
现在想要破解一个 App, 大多数都是遵循着以下的几个步骤:
- 反编译 App
- 查看 App 源代码并修改
- 动态调试(有可能存在而已,毕竟修改源码之后也是要调试的,哈)
- 重新编译 App
- 上传破解的 App 到商店中
目前来讲大多数的破解只存在一二两步中,但是后面的几个步骤还是会有人弄的,所以我们不能掉以轻心呀!当然最后一步我们姑且不谈了!下面我就来一个一个的介绍防止这些步骤的方法!
防止反编译 App
目前来说,大多数人用的反编译工具都是:jdax,dex2jar,jd-gui等工具,但是对于我们来说有个好消息就是 这些工具很多都是开源的,我们可以在 Github
上找到这些工具的源码,我们可以通过阅读这些源码,从而找出防止他们反编译的方法,也就是让他在反编译你的 App 的时候,让他们的软件崩溃!对于这个我们可以忽略,因为去阅读这些代码并理解他们,是一项比较耗时的工作甚至有可能都读不通他们的程序,所以我们尽量把经历放在下面的几个步骤上!
防止查看源代码
其实并不能真正的做到防止别人查看我们的源代码,我们只是通过代码混淆的技术来使别人在查阅我们的源代码时变得更加的困难而已。在 Android 中我们可以使用 ProGuard 来混淆我们的代码。在这里先说明一下代码混淆的优缺点:
优点:
- 增加别人破解 app 的难度
- 压缩、优化、删除代码
- 通过删除代码功能实现的特殊作用
缺点:
- 增加我们自己的调试难度(相信混效过代码的同学都知道,在混淆之后,app会出各种错误)
- 反射方面的问题(就是找不到对应的类)
对于第一个缺点的问题的解决方案是:保存 mappinp.txt 这个保存映射关系的文件,当 app 在混淆运行之后可能出现的问题,可以根据这个映射关系来快速定位出 bug 所在的位置!对于第二个缺点的问题的解决方案是:不混淆该类,如果不知道是哪个类那只能运行的时候调试了!
接下来简要介绍一下 ProGuard 的常用语法:
-libraryjars class_path 应用的依赖包,如android-support-v4
-keep [,modifier,...] class_specification 不混淆某些类
-keepclassmembers [,modifier,...] class_specification 不混淆类的成员
-keepclasseswithmembers [,modifier,...] class_specification 不混淆类及其成员
-keepnames class_specification 不混淆类及其成员名
-keepclassmembernames class_specification 不混淆类的成员名
-keepclasseswithmembernames class_specification 不混淆类及其成员名
-assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等
-dontwarn [class_filter] 不提示warnning
在这里在给出 android 中标准的 proguard.cfg
文件内容
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
大家可以依据此模版在进行增删改查。另外,我还可以通过代码混淆来控制是否打印日志输出:
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
在我写此文章是,有些牛逼的公司已经可以进行资源文件名的混淆了,这样就更加增大了代码阅读难度了!在这里给出该文章:美团Android资源混淆保护实践
防止动态调试
所谓的动态调试就是使用 检测调试器
检测调试器
这个检测很简单:就是当我们的软件检测到连接到调试器的时候,就终止程序!
首先,我们在 AndroidManifest.xml
中的 Application
标签中添加 android:debuggable="false"
这个属性,使程序不可调试,如果有人想调试,必定要修改这个值,之后我们只要在代码中添加下面短代码来检测该值是否变改变过,如果改变过就停止程序。
if((getApplicationInfo().flags &=
ApplicationInfo.FLAG_DEBUGGABL)!=0){
android.os.Process.killProcess(android.os.Process.myPid());
}
这样就可以解决这个问题了
防止重新编译
代码在上传的时候是需要对 app 进行的签名的,而每个签名文件只有 app 开发者才有,所以我们可以根据签名的内容来进行对比。但是签名的文件过长不利于对比,我们用见面签名内容的 hashCode
来比较。获取这个值的代码:
public int getsignature(String packageName) {
try {
android.content.pm.Signature[] signatures= getPackageManager().getPackageInfo(packageName.toString(), PackageManager.GET_SIGNATURES).signatures;
return signatures[0].hashCode();
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return 0;
}
}
我们只要在本地打包之后获取到这个值,之后在每次程序运行的时候,在获取签名的 hashCode
的来与我们之前在本地打包的值进行比较就行了!如果不同就直接关闭程序就行了!
NDK保护
就是关键代码使用 C/C++ 代码来写,没有研究过
加壳
在现有的代码外加一层 C/C++ 代码来保护,也没有研究过
参考资料
- Android 软件安全与逆向分析
【转】Android 防破解技术简介的更多相关文章
- Android 防破解技术简介
Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改 ...
- 基于NDK的Android防破解& Android防破解 【转载】
两篇防破解文章转载 基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585 Android防破解:http:// ...
- Android插件化技术简介
https://blog.csdn.net/io_field/article/details/79084630 可以通过反射 事先定义统一接口的方式,访问插件中的类和方法 还可以在AndroidMan ...
- VB 共享软件防破解设计技术初探(一)
VB 共享软件防破解设计技术初探(一) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(二)http ...
- VB 共享软件防破解设计技术初探(三)
×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...
- Android App的破解技术有哪些?如何防止反编译?
现在最流行的App破解技术大多是基于一定相关技术的基础:如一定阅读Java代码的能力.有一些Android基础.会使用eclipse的一些Android调试的相关工具以及了解一些smali的语法规范 ...
- VB 共享软件防破解设计技术初探(二)
VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...
- App山寨疯狂 爱加密Apk加密平台防破解
App山寨疯狂 爱加密Apk加密平台防破解,Android系统由于其开源性,眼下已占领全球智能机近80%的市场,远超微软的WP系统和苹果的IOS系统.然而也正是由于开源性,Android盗版App在国 ...
- 知物由学 | 见招拆招,Android应用破解及防护秘籍
本文来自网易云社区. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学”希 ...
随机推荐
- 使用Nodejs+mongodb开发地图瓦片服务器
原先地图瓦片服务器采用的是arcgisserver发布的地图服务并进行切片,但ags发布的地图服务很占内存,发布太多的话服务器压力很大.再一个就是ags价太高了. 学习Nodejs之后,发现这是一个可 ...
- memcache保存php的session 解决多服务器的session问题
PECL :: Package :: memcache 2.1.1 版本的 Changelog 中有一条: - Added experimental session storage support. ...
- informatica9.5.1资源库为machine in exclusive mode(REP_51821)
错误信息: [PCSF_10007]Cannot connect to repository [Rs_RotKang] because [REP_51821]Repository Service is ...
- dzzoffice的树型结构用户管理设计
在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面. ...
- SNIFFER问题集锦
SNIFFER相关教程下载: Sniffer使用教程.pdf|Sniffer用法.ppt 具体问题解决: 1.SNIFFER4.75无法使用,打开后提示 No adapter is binding t ...
- Visual Basic相关图书推荐
Visual Basic从入门到精通(第2版) 作 者 国家863中部软件孵化器 编 出 版 社 人民邮电出版社 出版时间 2015-03-01 版 次 2 页 数 61 ...
- ps 图片提取线稿方法2种 转
- Mac下用命令行直接批量转换文本编码到UTF8
由于近期在Mac下写Android程序,下载的一些Demo由于编码问题源码里的汉字出现乱码,文件比较多,所以想批量解决下文件的编码问题. Mac下有以下两种方式可以解决: A. 文件名的编码:Mac的 ...
- 触控发布《Cocos开发者平台白皮书》
Cocos 2014 开发者大会(秋季)组委会今天正式发布了<Cocos开发者平台白皮书>,GameRes游资网得到Cocos官方授权发布该白皮书电子版. 白皮书主要内容包括对行业的趋势解 ...
- Configure the Struts Tag Libraries
In Struts framework, you always need to configure the Struts tag libraries in order to access it in ...