apk反编译与破解

前段时间项目上线,单机游戏,想着肯定是会被破解的,但没想到,分分钟就被破了,游戏数据也是相当的差,于是闲暇时,也自己研究下安卓的破解。

个人观点(装一下X):所谓反编译和破解付费等都只应用于学习交流,发布出去,就有点太不尊重他人劳动成果了。

使用工具:(当然首先得配好java环境,这是废话)

  apktool : 资源文件获取,可以提取出图片文件和布局文件

  dex2jar :   得到java源码(将classes.dex 转化为jar 文件)

  jd-gui  :   查看转化得到的jar文件的源码

一、 解包,打包

  命令行,输入 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加密

参考:http://blog.csdn.net/chengyingzhilian/article/details/38372601

  但个人认为,网络游戏本身肯定是不会有什么问题,但单机游戏,短代支付这种,付费文件都是在本地,没有二次验证的付费,即使所有地方都加密了,替掉计费文件不就一样算是破解了吗?

以下为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_**

 

Stay hungry, stay foolish!
原文地址:https://www.cnblogs.com/JhonKing/p/5106141.html