之前做了一段时间的安卓手游破解正版验证工作,总结一些基本的方法和知识,便于分享交流。破解的目的是让国内一些“被阉割”过(无GooglePlay框架)的安卓手机也能畅快地玩儿上GooglePlay上的游戏,所以文章主要讨论海外游戏市场下载的apk包如何去除正版验证。国内的手游大部分还是做了防破解工作的,加壳、防反编译等等(此篇不予讨论)。大概海外市场的氛围较好,所以GooglePlay、Amazon商店的游戏基本都可以反编译成功,顶多加了代码混淆、调用了GP/Amazon的验证SDK而已。
适合谁看?
破解初学者、懂一些编程知识的童鞋(完全不懂编程也可以,只能破解那些只需要替换一些文件/文本的游戏)、以及对apk破解/安全性维护感兴趣的童鞋。
什么是Smali?
先说Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事。Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节码。Dalvik VM比JVM速度更快,占用空间更少。
通过Dalvik的字节码我们不能直接看到原来的逻辑代码,这时需要借助如Apktool或dex2jar+jd-gui工具来帮助查看。但是,注意的是最终我们修改APK需要操作的文件是.smali文件,而不是导出来的Java文件重新编译(况且这基本上不可能)。
详细的Smali语法学习可以参考这篇文章:http://blog.csdn.net/lpohvbe/article/details/7981386,里面详细介绍了Smali中的数据类型、方法调用等等。
此外,反编译过程中遇到不懂的关键字,可参考http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html,非常实用的文档。
如何去除正版验证?
你需要的工具
工欲善其事,必先利其器,反编译工具很多,针对点也不同,本文主要用的是APKIDE(也叫APK改之理,一个类似APK studio的可视化反编译软件,内部已经集成了dex转smali、dex转jar、重新编译、签名、搜索等功能,推荐使用),其他工具和功能如下:
apktool,命令行工具,可以decode和build apk文件,主要用来解析xml等资源文件。
dex2jar,一系列命令行工具,能将文件在dex、jar和smali之间相互转换,反编译时可以dex转为smali后修改smali代码,再将smali转回成dex。
jd_guid,可视化工具,将jar文件反编译为java代码,便于阅读代码逻辑,至于直接编辑java代码什么的,你想多了。
baksmali,命令行工具,也是用来转换dex和smali文件。
apksigner,命令行签名工具,反编译重新打包之后用来重新签名apk。
apk studio,类似APK IDE,英文界面,有时候会反编译失败而APK IDE不会,猜想可能是内嵌的baksmali之类的版本不一样或者编码问题吧。
以上工具在百度、谷歌上下载都可搜到下载。
常用方法
通常不能运行的游戏表现有这几种:
1. 提示未安装谷歌框架,不能游戏;或者提示谷歌验证此游戏为盗版(可能你的apk不是从GooglePlay下载而来)。
2. 提示当前账号并未购买此游戏(同样,可能此游戏并非GooglePlay上购买后直接下载的)
你打开游戏可能会卡在这样的页面: