基于NDK的Android防破解& Android防破解 【转载】
两篇防破解文章转载
基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585
Android防破解:http://blog.csdn.net/xfzheng_yeah/article/details/8915816
基于NDK的Android防破解
Android程序防破解是发布app时一个很需要考虑的问题,通常的做法是对代码加入混淆干扰以增加破解难度。但即便如此,混淆操作之后的java代码仍然可以被通过各种方法进行破解。在基于NDK的Android中含有相应的main.cpp来作为应用程序的入口,因而在这里进行一些防破解较验,相应的破解难度就会增大不少(相对于java代码)。
在Android整个导出过程中,生成.dex阶段是整个打包发布操作的基础,包括相应的java源代码、外部库文件均会被编译链接到.dex文件中,而其中关于代码的任何改动后重新生成.dex,其均会与原始文件均会有所不同,因而就可通过对.dex文件进行MD5较验而做为app是否被破解的依据。
基本流程:
- 打包发布阶段(只进行一次):在打包生成过程得到.dex之后计算该.dex文件的MD5串,并将其写入到NDK工程的main.cpp中,作为最终版本较验的标准串。该过程可以加入到Ant自动化打包发布中,作为生成.dex的后续阶段。
- 动态运行阶段(每次启动进行):在main.cpp的程序启动入口处添加动态的.dex MD5计算,并与代码中存储的标准MD5串进行比较,若两者不匹配则说明程序已经被破解,即刻退出。
阶段1: 计算.dex文件的MD5串并将其写入到对应的main.cpp中,相应的ant操作大体如下(并不完整以)。
生成dex对应的MD5,并将其存储到一个文件中:
- <target name="predexmd5"depends="dex">
- <exe cexecutable="${dexmd5tool}" failonerror="true">
- <arg value="${dexmd5tempfile}" />
- <arg value="${dex-ospath}"/>
- </exec>
- </target>
从外部文件中读入相应的MD5串,并存储到一个ANT的变量:
- <target name="dexmd5" depends="predexmd5">
- <loadfile srcfile="${dexmd5tempfile}"property="dexmd5sign"/>
- </target>
将.dex文件的MD5串写入到main.cpp中:
- <targetnametargetname="setmaincpp" depends="dexmd5">
- <replace file="${maincppfile}"token="Ant_DexMD5Sign" value="${dexmd5sign}"/>
- </target>
其中使用的dexmd5tool是一个自实现的外部exe,主要实现对任意文件计算其相应的MD5并将串值保存到一个指定的文件。这里需要MD5串以文件形式进行保存主要是以便在ant中打该文件并读入其中的字符串到ant变量中(并没有找到其它方法直接将相应的MD5码写入到ant变量中去,因而做这样的婉转实现)。将MD5串向main.cpp中写入主要就是利用ant的字符串替换机制来实现即可。
更新完main.cpp之后需要利用NDK对工程进行重新编译(主要是重编译这里有改动的C++代码,该步必须进行)
调用NDKbuikd来完成相应的重编译工作:
- <targetnametargetname="ndkbuild" depends="setmaincpp">
- <exec executable="${basedir}/ndkbuild.bat" failonerror="true">
- </exec>
- </target>
Ndkbuild.bat中的相关内容即如同Eclipse中配置的编译参数一样: X:/cygwin/bin/bash.exe --login -c "cd/cygdrive/XXX/XXX/Android/jni && $NDK/ndk-build"
阶段2: 对dex计算相应的MD5并在main.cpp中进行启动时较验。
这里需要在app每次启动运行中动态得到当前apk包中的.dex文件并进行MD5的计算与较验。这里直接实现并不太容易,因而借助于了一个第三方包libzip(https://github.com/julienr/libzip-android),它可以以.so的形式链入到NDK工程中,并将指定的zip包(apk包)解压缩,将其中的所有文件以二进制的方式返回。如此一来就可以运行时得到当前apk包的dex的二进制流;将计算binary的MD5代码也一并加入到该工程中即可以完成在main.cpp中启动时动态较验.dex的MD5值。
若当前apk包中的.dex文件MD5码与main.cpp中存储的MD5码(阶段1得到)匹配,程序合法运行;否则,较验不通过认为已经被修改过,直接退出。
越来越多的个人和机构都在为第三方进行开放企业级的APP,这种类型的APP,开发者非常关心自己的APP会不会被破解,从而直接影响自己的收入。
最近对这个话题也比较感兴趣,看到 BugRunner于2013年3月份发表的《基于NDK的Android防破解》(http://blog.csdn.net/bugrunner/article/details/8634585),想了几个方面。
非常认同,基于NDK,比JAVA更难反编译,更难破解,但是他这个方案其实有很多问题:
1、NDK只是作为一个入口点,检查MD5,如果不一致就退出运行。 如果直接调用原先的ACTIVITY作为入口点,显然就无法阻止了。而且这个并不难实现。
2、NDK之所以难以反编译,很大程度是汇编低级语言的可读性很差,但是如果只是一个入口点这么简单的程序,反编译之后,其实是很容易修改的。更何况在本方案中,只是进行md5数值的比对。
对于一个商业价值较大的来说,这个增加破解的代价还是太低了。
如果希望增加破解难度,可以从以下几个方面考虑:
1、核心的比对验证算法应该是基于NDK,在JAVA这一侧竟可能多的进行比较比对,甚至是随机继续调用。如果SO文件不存在,是不能运行下去的。
2、这个比对函数,不能是固定的,否则反编译后定位到一个地方,就很容易替换所有的地方。可以采用多次比对的思路,比如设计若干个比对函数,每个比对算法是不一样,基于时间,基于文件系统某个文件,MD5检验,联网,短信验证等等。不满足任何一个均是失败的。
3、在服务器一侧,必须记录客户端的行为,比如活跃用户数,用户的分布,这个是很有效的检查办法。使用很多APP的统计工具都可以做到,一旦在某个区域,活跃用户数增加,可以判定被盗版了。
4、在服务器和客户端之间,需要有一定的联系,结合NDK算法。比如一周内,必须和服务器通讯一次,服务器可以返回给客户端一些简单的命令,也可以高级的命令,比如APP安装时间,上次运行时间,一些业务统计数据,甚至自我销毁数据等功能。
因此,双方既然在一起合作,出发点首先不能影响客户端的性能和功能,在检查方法上不能简单依赖技术,更多是一些业务上的指标更容易体现是否被盗版。
基于NDK的Android防破解& Android防破解 【转载】的更多相关文章
- Android应用---基于NDK的samples例程hello-jni学习NDK开发
Android应用---基于NDK的samples例程hello-jni学习NDK开发 NDK下载地址:http://developer.android.com/tools/sdk/ndk/index ...
- Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器
基于NDK开发Android平台RTSP播放器 最近做了不少android端的开发,有推流.播放.直播.对讲等各种应用,做了RTMP.RTSP.HTTP-FLV.自定义等各种协议,还是有不少收获和心得 ...
- Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源
2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这样的方式来实现,效果非常 ...
- 浅谈独立使用NDK编译库文件(Android)
阅读前准备 这是一篇相对入门的文章.文中会涉及到少许NDK的知识,但个人认为对初学者来说都相对比较实用,因为都是在平时项目中遇到的(目前自己也是初学者).一些其他高深的技术不再本文探讨范围之内(因为我 ...
- 最新版Xamarin Mono For Android、Monotouch 安装、破解(实时同步更新)
以上链接如不是最新,以官方为主,官方更新地址如下:http://xamarin.com/installer_assets/v3/Mac/Universal/InstallationManifest.x ...
- 用Kotlin破解Android版微信小游戏-跳一跳
前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...
- [Android Studio]SQLScout插件安装破解
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5972138.html [Android Studio]SQLS ...
- Android NDK and OpenCV Development With Android Studio
Android NDK and OpenCV Development With Android Studio Hujiawei 172 2014年10月22日 发布 推荐 0 推荐 收藏 4 收藏,5 ...
- 【ATX学习大纲】【ATX基于uiautomator2+Python学习】之Android自动化
github学习地址:https://github.com/openatx/uiautomator2 <_io.TextIOWrapper name='<stderr>' mode= ...
随机推荐
- [数据结构]A*寻路算法
简易地图 如图所示简易地图, 其中绿色方块的是起点 (用 A 表示), 中间蓝色的是障碍物, 红色的方块 (用 B 表示) 是目的地. 为了可以用一个二维数组来表示地图, 我们将地图划分成一个个的小方 ...
- 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。
做过很多winform项目,都为winform控件头疼不已.想实现一些漂亮的样子总是很难.我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标.那么在实现居中效果就会很 ...
- 【html】优酷视频去广告代码
相信大家都有这样的感受,看个视频有个30秒的广告,让人非常的不爽.同样对于我们前端童鞋来说,为了吸引用户,把制作好的视频嵌入到网页中,结果因为视频有30秒的广告不但没有吸引到多少用户,反而可能会流失一 ...
- 树莓派3 U盘启动 配置 & 即 MSD启动 总结
树莓派3添加了一个新特性:允许USB启动.现在我们既可以从SD卡启动,也可以从USB启动.USB设备可以是U盘,带USB适配器的SSD硬盘,甚至是移动硬盘. 本文介绍怎么从U盘启动树莓派3. 1. ...
- Mayi_XPath编写规则学习
XPath编写规则学习 辅助工具:firefox安装findbugs,view Xpath firefox :Xpath验证方式:$x("xpath"); 粘贴xpath语句回 ...
- Ogre 编辑器一(MyGUI+Ogre整合与主界面)
在查看Ogre例子时,想看材质要里的纹理,着色器代码都需要每个去查找,非常麻烦.也想看更新每个Ogre里的对象后有什么效果.然后看到Compositor组件与粒子组件时,想到能实时编辑着色器代码实时更 ...
- Ogre 渲染目标解析与多文本合并渲染
实现目标 因为需求,想找一个在Ogre中好用的文本显示,经过查找和一些比对.有三种方案 一利用Overlay的2D显示来达到效果. http://www.ogre3d.org/tikiwiki/tik ...
- c数组
一维数组 有三种赋值方式 1.原始的赋值 2. 初始化赋值 3.动态赋值 数组的花式玩法 void main() { ] = {, , , , , , , , , }; test(a); putcha ...
- 64位debian系统下安装inodeClient
linux下的inodeClient下载: 链接:http://pan.baidu.com/s/1jIoX6Zk 密码:vnws 里面包括一份说明书,一个32位的,一个64位的文件: 对于64位的客户 ...
- Zend Framework2 入门教程(转)
转载自: http://my.oschina.net/lai1362000/blog/201301 重申:这本书作者的截图我都放上去了,没侵权啊. 别问那么多,我只是一个安静的搬砖工. 摘要 Zend ...