Android 防破解技术简介

这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改代码,之后再重新编译上传到应用商店!到时候,如果用户下载了这些应用,就可能造成个人信息或者金钱的丢失!所以,作为开发者的我们,有必要学习一些防止被破解的技术手段了!

简介

现在想要破解一个 App, 大多数都是遵循着以下的几个步骤:

  • 反编译 App
  • 查看 App 源代码并修改
  • 动态调试(有可能存在而已,毕竟修改源码之后也是要调试的,哈)
  • 重新编译 App
  • 上传破解的 App 到商店中

目前来讲大多数的破解只存在一二两步中,但是后面的几个步骤还是会有人弄的,所以我们不能掉以轻心呀!当然最后一步我们姑且不谈了!下面我就来一个一个的介绍防止这些步骤的方法!

防止反编译 App

目前来说,大多数人用的反编译工具都是:jdax,dex2jar,jd-gui等工具,但是对于我们来说有个好消息就是 这些工具很多都是开源的,我们可以在 Github 上找到这些工具的源码,我们可以通过阅读这些源码,从而找出防止他们反编译的方法,也就是让他在反编译你的 App 的时候,让他们的软件崩溃!对于这个我们可以忽略,因为去阅读这些代码并理解他们,是一项比较耗时的工作甚至有可能都读不通他们的程序,所以我们尽量把经历放在下面的几个步骤上!

防止查看源代码

其实并不能真正的做到防止别人查看我们的源代码,我们只是通过代码混淆的技术来使别人在查阅我们的源代码时变得更加的困难而已。在 Android 中我们可以使用 ProGuard 来混淆我们的代码。在这里先说明一下代码混淆的优缺点:

优点:

  1. 增加别人破解 app 的难度
  2. 压缩、优化、删除代码
  3. 通过删除代码功能实现的特殊作用

缺点:

  1. 增加我们自己的调试难度(相信混效过代码的同学都知道,在混淆之后,app会出各种错误)
  2. 反射方面的问题(就是找不到对应的类)

对于第一个缺点的问题的解决方案是:保存 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 防破解技术简介的更多相关文章

  1. 【转】Android 防破解技术简介

    http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...

  2. 基于NDK的Android防破解& Android防破解 【转载】

    两篇防破解文章转载 基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585 Android防破解:http:// ...

  3. Android插件化技术简介

    https://blog.csdn.net/io_field/article/details/79084630 可以通过反射 事先定义统一接口的方式,访问插件中的类和方法 还可以在AndroidMan ...

  4. VB 共享软件防破解设计技术初探(一)

    VB 共享软件防破解设计技术初探(一) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(二)http ...

  5. VB 共享软件防破解设计技术初探(三)

    ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...

  6. Android App的破解技术有哪些?如何防止反编译?

     现在最流行的App破解技术大多是基于一定相关技术的基础:如一定阅读Java代码的能力.有一些Android基础.会使用eclipse的一些Android调试的相关工具以及了解一些smali的语法规范 ...

  7. VB 共享软件防破解设计技术初探(二)

    VB 共享软件防破解设计技术初探(二) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http ...

  8. App山寨疯狂 爱加密Apk加密平台防破解

    App山寨疯狂 爱加密Apk加密平台防破解,Android系统由于其开源性,眼下已占领全球智能机近80%的市场,远超微软的WP系统和苹果的IOS系统.然而也正是由于开源性,Android盗版App在国 ...

  9. 知物由学 | 见招拆招,Android应用破解及防护秘籍

    本文来自网易云社区. “知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道.“知物由学”希 ...

随机推荐

  1. ArcGIS 10 安装程序及破解文件

    1.下载 ArcGIS 10 安装程序及破解文件 后面提供电驴的下载地址(可以使用迅雷.QQ旋风等下载工具下载),下载文件是一个光盘镜像文件:‍ArcGIS_Desktop10_122519.iso. ...

  2. REST测试工具之curl(URL多参数)

    在微服务理念满天飞的今天,面对REST接口的机会越来越多. 除了打开浏览器的方法,我们还有一个很方便的方法测试REST接口,尤其是接口返回JSON数据格式时. 这就是curl. 一.安装篇 给一个可以 ...

  3. 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩

    现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大.启用gzip压缩,在一定程度上会大大的提高页面性能. 因此这写一个使用Node.js实现在http ...

  4. for循环中 i++和++i 是否有区别?

    正常情况下  i++和++i是有区别的: 前者是:先引用,后增加, 后者是:先增加,后引用, 但是在for循环中: for(var i=0;i<10;i++){ System.out.print ...

  5. Spring Cloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  6. putty自带工具plink自动登陆ssh

    PLINK.EXE -C -N -D 127.0.0.1:7000 root@111.111.111.111  -pw 123456 解释成中文: PLINK.EXE -启用数据压缩 -不要shell ...

  7. Atitit. Attilax企业框架 AEF的发展里程总结

    Atitit. Attilax企业框架 AEF的发展里程总结 1. Attilax企业框架and框架发展思想 1 2. AEF框架 2 2.1. 多语言支持,涉及的语言 java ,c# php py ...

  8. atitit.获取connection hibernate4

    atitit.获取connection hibernate4 1. SessionFactoryUtils法(推荐) 1 2. ConnectionProvider 法( ) 1 3. 嘎自实现法(不 ...

  9. Linux系统CPU频率调整工具使用

    现在的CPU耗电很大,按需调节CPU频率对普通桌面及移动设备节能有重要的意义,目前多数Linux发行版都已经默认启用了这个功能,但在一些像数据库,集群系统等特别需要CPU高性能的服务器环境中,Linu ...

  10. java 解压.gz文件

    1.//建立gzip压缩文件输入流 2.建立gzip解压工作流 fileInputStream = new FileInputStream(filePath + fileName); //解凍する G ...