提高反编译难度的几种方式:

对于软件安全来说,有攻就要有防才对。不然,Android整个产业链就会被这样的Crack给毁掉。


第一种办法:将核心代码用JNI写进so库中。由于so库的反编译和破解的难度加大,所以这种方式防止反编译效果不错。关键代码使用jni调用本地代码,用c或c++编写,相对于class文件,so相对比较难于反编译。缺点是,对于Java层的代码没有保护作用,同样可以被篡改。很多搞java的程序员不太熟悉如何写c或c++代码,同时本地代码很难调试。出错容易导致整个虚拟机死掉,用户感受不好。


第二种办法:在线签名比较。在程序初始化时,联网将运行的程序的签名与服务器上的官方标准签名进行比较,从而达到让反编译后的程序无法正常运行的效果。缺点是,如果此部分联网检验的代码被篡改跳过,则整套机制失效。

第三种办法:代码混淆。为了加大反编译后代码分析的难度,对代码进行混淆。混淆是不改变代码逻辑的情况下,增加无用代码,或者重命名,使反编译后的源代码难于看懂。缺点是,治标不治本,同样可以修改(甚至据说还有反混淆工具,没用过,不多做评论)。

这三种办法都有各自的缺点,所以单单靠某一项要实现完美的软件保护都是不可能的。不过,我们可以采用联合几种办法的方式,来增强软件保护的力度。曾经反编译过Android版的卡巴斯基,它的保护思路似乎是这样的:

代码混淆,那是必须的,不过不指望它能有很好的效果。在程序初始化时,就直接通过JNI的so库初始化程序。程序激活部分也是通过JNI联网下载文件,然后在JNI层读文件并做相应激活与否的判断的。

卡巴斯基是将大部分功能模块都放在JNI层来实现的,如果我们的程序都这样处理,耗费的精力必然很大。所以,我们只是借鉴它的思路而已。具体操作思路如下:

代码混淆。

初始化时JNI层联网验证签名。

验证失败则直接在JNI层退出程序。

值得注意的是需要保证如果绕过JNI层的初始化,则程序无法正常启动。这点不保证的话,破解还是很容易……

更多相关文章

  1. 将android工程作为另一个工程的库
  2. android 自定义闪退Dialog 收集闪退信息
  3. android 一行代码,快速实现图片验证码(附android studio 版小demo)
  4. Android(安卓)keystore 签名证书的作用以及如何生成
  5. Android隐式启动Activity可能存在的坑
  6. Android多媒体开发 Pro Android(安卓)Media 第二章 创建自定义相
  7. 花椒Android客户端多变体构建实践
  8. 起来越像Android了?iOS 14从Android(安卓)中“窃取“ 了这8个有用
  9. Android的BUG(四) - Android(安卓)app的卡死问题

随机推荐

  1. Android支持下列所有单位。
  2. Android中实现程序前后台切换效果。
  3. Android中Java根据文件头获取文件类型的
  4. android与WEB服务器交互时的SESSION
  5. 安卓从入门到乞討 List View一键点击Item
  6. 基于web的android图像处理示例(Win7+Apac
  7. 赵雅智:android发短信操作
  8. 阿里巴巴 面试经历
  9. 当你的Android(安卓)Studio 设置No proxy
  10. Android模拟器和安装APK文件基础教程