前段时间项目上线,单机游戏,想着肯定是会被破解的,但没想到,分分钟就被破了,游戏数据也是相当的差,于是闲暇时,也自己研究下安卓的破解。
个人观点(装一下X):所谓反编译和破解付费等都只应用于学习交流,发布出去,就有点太不尊重他人劳动成果了。
使用工具:(当然首先得配好java环境,这是废话)
apktool
dex2jar
jd-gui
一、 解包,打包
命令行,输入 java -jar apktool.jar d -f test.apk (此处我用的apktool为最新版本)
此时可以看到解包出的文件,smali 就是java代码了,当然里这里是smali代码,类似于汇编,但需要修改原本的代码的话,还得去改它。
改好后,只需要 java -jar apktool.jar -b test
其中test 为我们刚刚解包的文件夹名,就可以得到重新打包的apk了,位于dist文件夹下。
当然此时的apk是不带签名的。需要安装得自己再对apk进行签名,相关工具也挺多的。
二、得到java源码
自行解压原apk文件,得到其中的classes.dex 文件
运行命令 d2j-dex2jar.bat classes.dex (这里我用的是最新版的dex2jar-2.0版本,以前版本bat可能名字有点不一样)
将在 d2j-dex2jar.bat 目录下得到 classes-dex2jar.jar 文件
然后再用jd_gui工具打开这个jar文件就可以看到java源代码了,但可以很多apk进行混淆以后,代码后变得很难阅读。
很多没有做过多防护的游戏,很可能就这样就可以简单看到代码了。这样岂不是所有人都在裸奔了,事实当然不可能这样子。通过加密,可以做到让你得不到所有的smali和java源码。可以参考下面这篇文章对app加密
参考:
但个人认为,网络游戏本身肯定是不会有什么问题,但单机游戏,短代支付这种,付费文件都是在本地,没有二次验证的付费,即使所有地方都加密了,替掉计费文件不就一样算是破解了吗?
以下为smali的基础语法
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支:
"if-eq vA, vB, :cond_**" 如果vA等于vB则跳转到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等于vB则跳转到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小于vB则跳转到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大于等于vB则跳转到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大于vB则跳转到:cond_**
"if-le vA, vB, :cond_**" 如果vA小于等于vB则跳转到:cond_**
"if-eqz vA, :cond_**" 如果vA等于0则跳转到:cond_**
"if-nez vA, :cond_**" 如果vA不等于0则跳转到:cond_**
"if-ltz vA, :cond_**" 如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**" 如果vA大于等于0则跳转到:cond_**
"if-gtz vA, :cond_**" 如果vA大于0则跳转到:cond_**
"if-lez vA, :cond_**" 如果vA小于等于0则跳转到:cond_**