【转】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应用破解及防护秘籍
本文来自网易云社区. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学”希 ...
随机推荐
- JBPM4入门——6.流程实例的创建和执行
本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.6.重新配置与缷载11R2 Grid Infrastructure
1.[root@linuxrac1 ~]# /u01/app/oraInventory/orainstRoot.sh 2.[root@linuxrac2 ~]# /u01/app/oraInvento ...
- mipmap 目录和drawable 目录有什么区别
Q :最近使用studio 发现drawle-hdpi 都没有了换成了mipmap-hdpi,这两个目录有什么区别呢,哪个比较好呢??? A: 我简单总结一下: 使用上没有任何区别,你把它当drawa ...
- linux 开机自动运行
1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /et ...
- HDU 2151 Worm
Worm Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- [搜片神器]直接从DHT网络下载BT种子的方法
DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr DHT系 ...
- memcache、memcached、groupcache的区别
对PHP语言来说,PHP使用memcache有两个模块,分别叫memcache和memcached,他们的区别看下表: 参考:http://hi.baidu.com/tony_wd/item/605e ...
- C语言实现memcpy和memmove
0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被 ...
- CSS抗锯齿 font-smoothing
CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...
- python测试api接口
在开发中,需要测试web-api的接口 spring mvc 使用单元测试非常方便,但是,受不了单元测试的启动速度.用python写了一个小脚本,用于测试接口, 测试脚本配置文件 api.yaml s ...