分享 如何做到基于NDK的Android应用防破解!

科技创造 发布于 2014/10/28 10:03
阅读 589
收藏 10

       Android程序防破解是发布app时一个很需要考虑的问题,通常的做法是对代码加入混淆干扰以增加破解难度。但即便如此,混淆操作之后的java代码仍然可以被通过各种方法进行破解。在基于NDK的Android中含有相应的main.cpp来作为应用程序的入口,因而在这里进行一些防破解较验,相应的破解难度就会增大不少(相对于java代码)。

        在Android整个导出过程中,生成.dex阶段是整个打包发布操作的基础,包括相应的java源代码、外部库文件均会被编译链接到.dex文件中,而其中关于代码的任何改动后重新生成.dex,其均会与原始文件均会有所不同,因而就可通过对.dex文件进行MD5较验而做为app是否被破解的依据。对于Android app,dex源码文件安全性是最重要的,因此,这个dex源码加密保护其实很有必要,在这个方面,可以做到的有爱加密这个平台,不同类型的应用也有不同的加密保护方案,详细可以在这里了解: http://www.ijiami.cn/appprotect_mobile_games

基本流程:

  1. 打包发布阶段(只进行一次):在打包生成过程得到.dex之后计算该.dex文件的MD5串,并将其写入到NDK工程的main.cpp中,作为最终版本较验的标准串。该过程可以加入到Ant自动化打包发布中,作为生成.dex的后续阶段。

  2. 动态运行阶段(每次启动进行):在main.cpp的程序启动入口处添加动态的.dex MD5计算,并与代码中存储的标准MD5串进行比较,若两者不匹配则说明程序已经被破解,即刻退出。

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

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

[html] view plaincopy

  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的变量:

[html] view plaincopy

  1. <target name="dexmd5" depends="predexmd5">   

  2.         <loadfile srcfile="${dexmd5tempfile}"property="dexmd5sign"/>  

  3. </target>    

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

[html] view plaincopy

  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(http://www.ijiami.cn/tlogin),它可以以.so的形式链入到NDK工程中,并将指定的zip包(apk包)解压缩,将其中的所有文件以二进制的方式返回。如此一来就可以运行时得到当前apk包的dex的二进制流;将计算binary的MD5代码也一并加入到该工程中即可以完成在main.cpp中启动时动态较验.dex的MD5值。

        若当前apk包中的.dex文件MD5码与main.cpp中存储的MD5码(阶段1得到)匹配,程序合法运行;否则,较验不通过认为已经被修改过,直接退出。

加载中
0
安然面对
安然面对
谢谢分享,长知识,Android应用防破解对开发很重要!
0
科技创造
科技创造

引用来自“安然面对”的评论

谢谢分享,长知识,Android应用防破解对开发很重要!
\(^o^)/~\(^o^)/~
0
科技创造
科技创造

引用来自“安然面对”的评论

谢谢分享,长知识,Android应用防破解对开发很重要!
O(∩_∩)O~
0
学习皑皑
学习皑皑

对这方面很感兴趣

喜欢

0
Jacklei
Jacklei
用开源的软件开发出来的还要这样,无操守啊!
0
火灵元
火灵元
就是因为Android的开源性才容易被破解啊,要不然你就不用,天下没有免费的午餐!
0
科技创造
科技创造

引用来自“学习皑皑”的评论

对这方面很感兴趣

喜欢

O(∩_∩)O~
0
科技创造
科技创造

引用来自“Jacklei”的评论

用开源的软件开发出来的还要这样,无操守啊!

O(∩_∩)O~看点都在这。


0
科技创造
科技创造

引用来自“火灵元”的评论

就是因为Android的开源性才容易被破解啊,要不然你就不用,天下没有免费的午餐!

说的不错,是 没有免费午餐,除非买彩票中500万O(∩_∩)O


0
安然面对
安然面对

挺不错,学习了。


返回顶部
顶部