两篇防破解文章转载

基于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是否被破解的依据。

基本流程:

  1. 打包发布阶段(只进行一次):在打包生成过程得到.dex之后计算该.dex文件的MD5串,并将其写入到NDK工程的main.cpp中,作为最终版本较验的标准串。该过程可以加入到Ant自动化打包发布中,作为生成.dex的后续阶段。
  2. 动态运行阶段(每次启动进行):在main.cpp的程序启动入口处添加动态的.dex MD5计算,并与代码中存储的标准MD5串进行比较,若两者不匹配则说明程序已经被破解,即刻退出。

阶段1: 计算.dex文件的MD5串并将其写入到对应的main.cpp中,相应的ant操作大体如下(并不完整以)。

生成dex对应的MD5,并将其存储到一个文件中:

  1. <target name="predexmd5"depends="dex">
  2. <exe cexecutable="${dexmd5tool}" failonerror="true">
  3. <arg value="${dexmd5tempfile}" />
  4. <arg value="${dex-ospath}"/>
  5. </exec>
  6. </target>

从外部文件中读入相应的MD5串,并存储到一个ANT的变量:

  1. <target name="dexmd5" depends="predexmd5">
  2. <loadfile srcfile="${dexmd5tempfile}"property="dexmd5sign"/>
  3. </target>

将.dex文件的MD5串写入到main.cpp中:

  1. <targetnametargetname="setmaincpp" depends="dexmd5">
  2. <replace file="${maincppfile}"token="Ant_DexMD5Sign" value="${dexmd5sign}"/>
  3. </target>

其中使用的dexmd5tool是一个自实现的外部exe,主要实现对任意文件计算其相应的MD5并将串值保存到一个指定的文件。这里需要MD5串以文件形式进行保存主要是以便在ant中打该文件并读入其中的字符串到ant变量中(并没有找到其它方法直接将相应的MD5码写入到ant变量中去,因而做这样的婉转实现)。将MD5串向main.cpp中写入主要就是利用ant的字符串替换机制来实现即可。

更新完main.cpp之后需要利用NDK对工程进行重新编译(主要是重编译这里有改动的C++代码,该步必须进行

调用NDKbuikd来完成相应的重编译工作:

[html] view plaincopy

 
  1. <targetnametargetname="ndkbuild" depends="setmaincpp">
  2. <exec executable="${basedir}/ndkbuild.bat" failonerror="true">
  3. </exec>
  4. </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防破解 【转载】的更多相关文章

  1. Android应用---基于NDK的samples例程hello-jni学习NDK开发

    Android应用---基于NDK的samples例程hello-jni学习NDK开发 NDK下载地址:http://developer.android.com/tools/sdk/ndk/index ...

  2. Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器

    基于NDK开发Android平台RTSP播放器 最近做了不少android端的开发,有推流.播放.直播.对讲等各种应用,做了RTMP.RTSP.HTTP-FLV.自定义等各种协议,还是有不少收获和心得 ...

  3. Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源

    2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这样的方式来实现,效果非常 ...

  4. 浅谈独立使用NDK编译库文件(Android)

    阅读前准备 这是一篇相对入门的文章.文中会涉及到少许NDK的知识,但个人认为对初学者来说都相对比较实用,因为都是在平时项目中遇到的(目前自己也是初学者).一些其他高深的技术不再本文探讨范围之内(因为我 ...

  5. 最新版Xamarin Mono For Android、Monotouch 安装、破解(实时同步更新)

    以上链接如不是最新,以官方为主,官方更新地址如下:http://xamarin.com/installer_assets/v3/Mac/Universal/InstallationManifest.x ...

  6. 用Kotlin破解Android版微信小游戏-跳一跳

    前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...

  7. [Android Studio]SQLScout插件安装破解

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5972138.html [Android Studio]SQLS ...

  8. Android NDK and OpenCV Development With Android Studio

    Android NDK and OpenCV Development With Android Studio Hujiawei 172 2014年10月22日 发布 推荐 0 推荐 收藏 4 收藏,5 ...

  9. 【ATX学习大纲】【ATX基于uiautomator2+Python学习】之Android自动化

    github学习地址:https://github.com/openatx/uiautomator2 <_io.TextIOWrapper name='<stderr>' mode= ...

随机推荐

  1. [转]css选择器优先级深入理解

    转载自:http://www.jb51.net/css/67029.html 一.基础选择器 css基础选择器有标签选择器.类选择器.id选择器.通用选择器 1.标签选择器 每个html页面都由很多个 ...

  2. iframe中跨域页面访问parent的方法

    背景 如上图所示,系统www.a.com/index.html页面中嵌入一个iframe,iframe中访问不同域的www.b.com/index.html 然后b中有个按钮“保存”,想调用父页面a. ...

  3. jQuery(十):CSS-DOM操作

    除了css()以外,还有获取和设置元素高度.宽度.相对位置等的样式操作方法,语法如下: 高度和宽度示例: <!DOCTYPE html> <html lang="en&qu ...

  4. JQuery Notes

    <script type="text/javascript" src="script.js"></script> $(document) ...

  5. 关于javascrpt if快速判断说明

    在js中有如下值能作为if的条件判断: 在js中有6种类型 undefined.null.string.number.boolean和object  object是对象类型 它们在逻辑运算符里有对应的 ...

  6. 【转】VMware Fusion Professional 10 序列号

    http://bbs.feng.com/forum.php?mod=viewthread&tid=11456176

  7. Enums and Lookup Tables with EF Code First

    With EntityFramework’s support for enums, there is no longer any need to include lookup tables in th ...

  8. Qt判断操作系统代码

    Qt4的时候是如下宏定义.Qt5,有所不同.   #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif #ifdef Q_OS_LIN ...

  9. 神经网络权值初始化方法-Xavier

    https://blog.csdn.net/u011534057/article/details/51673458 https://blog.csdn.net/qq_34784753/article/ ...

  10. (笔记)Linux下如何查看高CPU占用率线程

    在 Linux 下 top 工具可以显示 cpu 的平均利用率(user,nice,system,idle,iowait,irq,softirq,etc.),可以显示每个 cpu 的利用率.但是无法显 ...