苏州设计网页网站,深圳团购网站设计多少钱,未来科技,网站视频怎么做的好提高反编译难度的几种方式#xff1a; 对于软件安全来说#xff0c;有攻就要有防才对。不然#xff0c;Android整个产业链就会被这样的Crack给毁掉。 第一种办法#xff1a;将核心代码用JNI写进so库中。由于so库的反编译和破解的难度加大#xff0c;所以这种方式防止反编译… 提高反编译难度的几种方式 对于软件安全来说有攻就要有防才对。不然Android整个产业链就会被这样的Crack给毁掉。 第一种办法将核心代码用JNI写进so库中。由于so库的反编译和破解的难度加大所以这种方式防止反编译效果不错。关键代码使用jni调用本地代码用c或c编写相对于class文件so相对比较难于反编译。缺点是对于Java层的代码没有保护作用同样可以被篡改。很多搞java的程序员不太熟悉如何写c或c代码同时本地代码很难调试。出错容易导致整个虚拟机死掉用户感受不好。第二种办法在线签名比较。在程序初始化时联网将运行的程序的签名与服务器上的官方标准签名进行比较从而达到让反编译后的程序无法正常运行的效果。缺点是如果此部分联网检验的代码被篡改跳过则整套机制失效。第三种办法代码混淆。为了加大反编译后代码分析的难度对代码进行混淆。混淆是不改变代码逻辑的情况下增加无用代码或者重命名使反编译后的源代码难于看懂。缺点是治标不治本同样可以修改甚至据说还有反混淆工具没用过不多做评论。这三种办法都有各自的缺点所以单单靠某一项要实现完美的软件保护都是不可能的。不过我们可以采用联合几种办法的方式来增强软件保护的力度。曾经反编译过Android版的卡巴斯基它的保护思路似乎是这样的代码混淆那是必须的不过不指望它能有很好的效果。在程序初始化时就直接通过JNI的so库初始化程序。程序激活部分也是通过JNI联网下载文件然后在JNI层读文件并做相应激活与否的判断的。卡巴斯基是将大部分功能模块都放在JNI层来实现的如果我们的程序都这样处理耗费的精力必然很大。所以我们只是借鉴它的思路而已。具体操作思路如下代码混淆。 初始化时JNI层联网验证签名。 验证失败则直接在JNI层退出程序。 值得注意的是需要保证如果绕过JNI层的初始化则程序无法正常启动。这点不保证的话破解还是很容易…… /***********************************************************************************************************/ 基于NDK的Android防破解 分类 Mobile Development 杂七杂八 2013-03-04 17:29 2264人阅读 评论(9) 收藏 举报 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并将其存储到一个文件中 [html] view plaincopy target namepredexmd5dependsdex exe cexecutable${dexmd5tool} failonerrortrue arg value${dexmd5tempfile} / arg value${dex-ospath}/ /exec /target 从外部文件中读入相应的MD5串并存储到一个ANT的变量 [html] view plaincopy target namedexmd5 dependspredexmd5 loadfile srcfile${dexmd5tempfile}propertydexmd5sign/ /target 将.dex文件的MD5串写入到main.cpp中 [html] view plaincopy targetnametargetnamesetmaincpp dependsdexmd5 replace file${maincppfile}tokenAnt_DexMD5Sign value${dexmd5sign}/ /target 其中使用的dexmd5tool是一个自实现的外部exe主要实现对任意文件计算其相应的MD5并将串值保存到一个指定的文件。这里需要MD5串以文件形式进行保存主要是以便在ant中打该文件并读入其中的字符串到ant变量中并没有找到其它方法直接将相应的MD5码写入到ant变量中去因而做这样的婉转实现。将MD5串向main.cpp中写入主要就是利用ant的字符串替换机制来实现即可。 更新完main.cpp之后需要利用NDK对工程进行重新编译主要是重编译这里有改动的C代码该步必须进行 调用NDKbuikd来完成相应的重编译工作 [html] view plaincopy targetnametargetnamendkbuild dependssetmaincpp exec executable${basedir}/ndkbuild.bat failonerrortrue /exec /target Ndkbuild.bat中的相关内容即如同Eclipse中配置的编译参数一样X:/cygwin/bin/bash.exe --login -c cd/cygdrive/XXX/XXX/Android/jni $NDK/ndk-build 阶段: 对dex计算相应的MD5并在main.cpp中进行启动时较验。 这里需要在app每次启动运行中动态得到当前apk包中的.dex文件并进行MD5的计算与较验。这里直接实现并不太容易因而借助于了一个第三方包libziphttps://github.com/julienr/libzip-android它可以以.so的形式链入到NDK工程中并将指定的zip包apk包解压缩将其中的所有文件以二进制的方式返回。如此一来就可以运行时得到当前apk包的dex的二进制流将计算binary的MD5代码也一并加入到该工程中即可以完成在main.cpp中启动时动态较验.dex的MD5值。 若当前apk包中的.dex文件MD5码与main.cpp中存储的MD5码阶段1得到匹配程序合法运行否则较验不通过认为已经被修改过直接退出。转载于:https://www.cnblogs.com/xieyuan/p/3787267.html