分享:Android中利用机器码注册机制防止破解(转)
转自:http://blog.csdn.net/huzgd/article/details/6684094
最近做一个Android应用时遇到这个问题,客户要求功能必须注册才能使用,而程序本身又不是联网在线使用的,这就要在程序中加入机器码注册码机制了。
众所皆知Android应用是基于Java开发,如不做处理的话,直接反编译APK就能看到源码算法,要破解就没什么难度了。
关于Android防破解,网上有价值的内容较少。我收集了一些零碎的资料,总结起来大概有以下几种防破解的思路方式:
1.代码混淆。2.3的Android SDK已经支持直接混淆生成APK。混淆能加大反编译破解的难度,但光混淆不能解决问题,对于有经验的人来说,在混淆代码中找到注册检查代码进行强行破解也不是难事。
2.签名比对。APK中可使用签名进行处理,不过APK的签名不能防止反编译,只是反编译后不能再使用同一个签名而已。虽然可在代码中进行比对签名,但比对代码本身也可能被修改掉。因此签名的作用不大。
3.联网注册。程序启动后自动连接到服务器进行注册验证,并把一部分核心功能放到服务端。这种方式是最安全,不过对于单机程序就不合适了,总不能在一个记事本程序中也要求用户登录服务器吧。
4.dex或class动态加载。这种方式理论不错,把一小部分核心算法做成dex或class文件,加密为资源文件,注册成功后才解密并加载到内存中。但这个方式实现起来难度很高,我似乎没有在网上找到实现的文章,实现后维护代码成本也高。另外,如果将程序完全反编译后进行调试,也仍然能下断点把解密的dex或class文件给导出来。
5.使用NDK(或JNI)本地C/C++动态库。对于单机应用程序来说,这个是比较好的解决办法了。NDK编译的原生C/C++程序调试破解的难度比较高,代码维护也方便。
要加大破解难度,还有其它一些要注意的:可对关键内容或算法进行加密;把检测算法分解成零碎片段多处调用;另外注册相关的敏感字符串(如“注册失败”之类的消息)一律不以明文出现,等等。
我最终选择的注册机制方案是:代码混淆+NDK库+内容加密。简单说明如下:
1.对所有JAVA代码进行混淆。我之前写的程序是Android2.2的,不支持直接混淆;后来我下载了最新的SDK,将程序的SDK版本号target设置为13,在default.properties中增加proguard.cfg,然后在工程中右键Tools导出签名的APK完成混淆打包过程。
2.用NDK C语言实现机器码的生成、注册码的检测和内容的解密。在JAVA界面中只做机器码的显示、注册码的输入和调用加解密接口,而核心的机器码注册码加解密全在C程序中完成。机器码要跟硬件ID之类的结合,稍为要注意下的是不能直接用WIFI的MAC地址,因为WIFI的MAC地址容易被修改;最好是用CPU序列号,如果没有的话可考虑用设备ID IMEI或USB的MAC码,但最好不要在JAVA代码中获取,而是要在JNI C代码里获取,以免被反编译后篡改。生成过程这里就不细述了,以后有时间再写一下。
3.对部分资源文件进行加解密处理。程序运行中要使用文件系统中的资源文件才能运行,因此我把这些文件事先在PC上加密,并把解密密钥放在注册码中。根据机器码生成注册码,生成器注册码时将解密密钥加入。由于解密的密钥包含在注册码中,破解者即使将注册检测绕过,也无法解密文件运行;只能获得一个注册码才能执行解密。由于注册码检测和解密过程在NDK程序中完成,因此即使有一个注册码,也难以获得解密的密钥和算法。
当然了,防止破解是相对的,没有完全绝对不能破解的程序,只是让破解的难度成本高到还不如直接注册就行了。反过来说,如果你的程序本身没什么价值或没多少人会用,那基本上防破解也没什么必要。
分享:Android中利用机器码注册机制防止破解(转)的更多相关文章
- Android中利用Handler实现消息的分发机制(三)
在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...
- Android中的常见通信机制和Linux中的通信机制
Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线 ...
- Android 中View的绘制机制源代码分析 三
到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...
- Android中利用ant进行多渠道循环批量打包
公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...
- Android 中View的绘制机制源代码分析 一
尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...
- Android 中View的绘制机制源代码分析 二
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...
- Android中的事件分发机制
Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...
- Android中的内存管理机制以及正确的使用方式
概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...
- Android中的Handler的机制与用法详解
概述: 很多android初学者对android 中的handler不是很明白,其实Google参考了Windows的消息处理机制, 在Android系统中实现了一套类似的消息处理机制.在下面介绍ha ...
随机推荐
- stringstream实例
stringstream的具体作用稍后来总结,这里分享一个实例,从txt文档中读取数据,并对进行处理. #include <iostream> #include <sstream&g ...
- (转)log4j:WARN No appenders could be found for logger 解决方案
我们在使用Log4j的时候,总是出现: log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.Log ...
- vmware10中开启Intel VT-x
记得刚接触linux的时候,是在win7下使用vmware虚拟机来安装linux,这样就可以方便的一边使用win7娱乐,一边在linux下进行学习.后来发现这种方式使得win7很卡,虚拟机也很卡,让人 ...
- SharePoint咨询师之路:设计之前的那些事一:容量
提示:本系列只是一个学习笔记系列,大部分内容都可以从微软官方网站找到,本人只是按照自己的学习路径来学习和呈现这些知识. 咨询师更多的时候是解决方案提供者,那么他们如何能够提供有效的SharePoint ...
- 【转】jsp页面中jstl标签详解
原文地址: JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实 ...
- <转载>gcc/g++编译
转载于:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/22/1782678.html 1. gcc/g++在执行编译工作的时候,总共需要4步 ...
- POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3146 Accepted: 1798 Descr ...
- hdu 5491 The Next (位运算)
http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意:给定一个数D,它的二进制数中1的个数为L,求比D大的数的最小值x且x的二进制数中1的个数num满 ...
- SUSE linux ,liveUSB制作方法
下载了ubuntu 11.04,ubuntu11.10,fedora15,kubuntu 11.04,linuxmint-11,还有suse的kde和gnome的桌面版镜像,其他的都很方便的做成了li ...
- Android之旅 笔记总结(一)
一.Android入门 1. Android操作系统的体系结构分为4层,由上而下依次是应用程序.应用程序框架.核心类库(包括Android运行时环境)和Linux内核. 2. ...