分享: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 ...
随机推荐
- windows中安装python
windows中安装python 在windows中安装python的步骤如下. 1.下载python的安装包 python的安装包地址为: https://www.python.org/ftp/py ...
- PHP代码格式化批量脚本
@echo off echo please input phpCB url: set /p input= cd /d "E:\tools\phpCB\" phpCB --space ...
- geeksforgeeks@ Minimum sum partition (Dynamic Programming)
http://www.practice.geeksforgeeks.org/problem-page.php?pid=166 Minimum sum partition Given an array, ...
- 关于Bean
什么是Bean? 一个Bean 就是一个类.我们不必为制造任何的Bean而编写一些特殊的代码或者使用特殊的编程语言.事实上,我们唯一需要做的是略微地修改我们对我们方法命名的办法.方法名通知应用程序构建 ...
- jquery让一个点击事件刷新页面就自己执行一次的方法
$('name')这个元素之前已经绑定过事件啦,(on绑定)然后直接调用下即可: $('name').click();
- Hadoop MapReduce概念学习系列之shuffle大揭秘(十九)
shuffle是非常重要!一定要深入理解和多实践. 缓存,分组,排序,转发,这些都是mr的shuffle. Soga 我想得到按流量来排序,而且还是倒序,怎么达到实现呢?这就牵扯到排序的的问题 默认是 ...
- ARM内核全解析
前不久ARM正式宣布推出新款ARMv8架构的Cortex-A50处理器系列产品,以此来扩大ARM在高性能与低功耗 领域的领先地位,进一步抢占移动终端市场份额.Cortex-A50是继Cortex-A1 ...
- 关于缺省路由传递问题的探讨(下)[ip default-network、ip default-gateway等]
之前文章介绍的是没有路由协议的环境下,那么在有路由协议的环境下: ip default-network IGRP/EIGRP: IP Default-Network所指定的网络必须在EIGRP进程中通 ...
- iOS 中self和super如何理解?
或许你理解self和super都是指的是类的对象 self指的是本类的对象,而super指的是父类的对象,但是事实情况呢,可能有些和你想象的不一样? 简单看下下面例子: @interface Pe ...
- 几种连接不同数据库的ADO.NET字符串
Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者 Ser ...