Apk反编译破解及重新打包

来源:互联网 发布:originpro软件下载 编辑:程序博客网 时间:2024/06/05 09:01

以前对app破解这些东西一直很感兴趣,一直认为这是大牛才可能实现的东西,后来发现,其实并不是这样的。
所以抽空我也来研习一番。
步骤综述:
1、找一个需要破解的 app
2、反编译 该 app
3、理解代码,寻求破解思路,修改代码
4、打包成一个新的 apk
5、签名
6、安装使用

目的: 我找了一个简单的照片保险箱app,希望可以越过登录,直接进入。

一、反编译

两个工具 : apktool , jadx ;点击下载反编译工具
使用方法 :
这里写图片描述
首先使用 apktool 反编译 apk
在 Windows 命令提示符下边执行命令
apktool d xxx.apk

这里写图片描述

出现图中信息,说明反编译成功了,反编译后的文件就在箭头所指的目录下边(就是命令行所在的当前目录)附上生成文件目录信息,我们需要的也就是图中指出的两个文件夹了。
这里写图片描述

到这儿,我们的反编译过程结束了,但是为了更好的理解别人的代码,还需要做一点儿事儿。
什么事儿呢?用 jadx 来反编译 同一个 apk。为什么呢,待会儿就明白了。
这是 jadx 反编译出来的结果。
这里写图片描述

我们把这两个工具反编译出来的东西做一个对比。(图片看不清楚请右键查看图像)

这里写图片描述

注意:红框中代码是等价的。
第一个区别:很明显,jadx 编译出来的可读性更高。那我们又有疑问了,那为什么还要 apktool 呢?
这就是第二个区别,jadx 反编译出来的代码没有 values 文件夹,就意味着没有字符串等信息。我们破解就是需要通过图片,字符串等信息来快速定位,没有这些东西,那就头大了。

到这儿,我们的反编译工作彻底结束了(当然有些 app 没有这么简单,水平有限,望多多包涵)。

二、理解代码,寻求破解思路,修改代码

两个方向:1、从图片入手。2、从字符串入手
我选择了从图片入手;(建议把 jadx 编译结果下的 res 文件拷贝到 apktool 编译结果根目录下,然后导入到 Android_studio 中,方便我们查看)
寻找流程:全局搜索图片名,找到对应的xml文件,然后找到 引用这个 xml 文件的地方。

最终,找到了关键代码

this.et_passwd.addTextChangedListener(new TextWatcher() {    public void beforeTextChanged(CharSequence s, int start, int count, int after) {    }    public void onTextChanged(CharSequence s, int start, int before, int count) {    }    public void afterTextChanged(Editable s) {        String pwd = s.toString().trim();        if (AntiVirusProActivity.this.correct_pwd.equals(pwd) || AntiVirusProActivity.PWD_HACKER.equals(pwd)) {            Session.isUserAccessible = true;            Session.IsPasswordEntered = true;            AntiVirusProActivity.this.finish();        }    }});

很清楚,我们只需要把if判断做一下修改,让他永远为真就可以了。
然后我们找到 apktool 对应的文件(搜索smali语法去学习)

.prologueconst/4 v2, 0x1 // v2 的值为 1。。。。。。iget-object v1, p0, Lcom/slickdroid/vaultypro/activity/AntiVirusProActivity;->correct_pwd:Ljava/lang/String; //this.correct_pwd = v1; 这是存储的密码invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z//执行 equals 方法 返回 boolean move-result v1 //将返回值给 v1if-nez v1, :cond_0 // 如果v1不等于0 ,就执行 cond_0sget-object v1, Lcom/slickdroid/vaultypro/activity/AntiVirusProActivity;->PWD_HACKER:Ljava/lang/String;invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Zmove-result v1if-eqz v1, :cond_1.line 182:cond_0  // 上边判断如果为真,就走到这儿//把 v2 的值给 isUserAccessible , 这是一个 boolean 型,那就是  isUserAccessible = true;sput-boolean v2, Lcom/slickdroid/vaultypro/util/Session;->isUserAccessible:Z.line 183sput-boolean v2, Lcom/slickdroid/vaultypro/util/Session;->IsPasswordEntered:Z.line 184// 执行 finish();invoke-virtual {p0}, Lcom/slickdroid/vaultypro/activity/AntiVirusProActivity;->finish()V.line 190:goto_0return-void

只要把 红色处的 判断改为 如果 v1 等于零 就执行 cond_0 不就好了吗?
修改后代码
if-eqz v1, :cond_0 // 如果v1等于0 ,就执行 cond_0
到这儿,第二步完成。

三、打包成一个新的 apk

注意,我们修改的都是 apktool 反编译后的文件,jadx 反编译后的文件只是辅助我们解决问题的。
然后 :在 Windows 命令提示符下边执行命令
apktool b +apktool反编译结果文件夹的路径

这里写图片描述

出现上述现象,然后我们到对应文件夹下边,发现多了一个dist 文件夹,打开后发现有一个apk,这就是我们修改后的apk了。

四、签名及安装使用

执行命令生成证书:

keytool -genkey -alias ybdesire.keystore -keyalg RSA -validity 20000 -keystore ybdesire.keystore

然后会是这样的:

E:\mine\tmp\baidu_yun_crack>keytool -genkey -alias ybdesire.keystore -keyalg RSA -validity 20000 -keystore ybdesire.keystoreEnter keystore password:Re-enter new password:What is your first and last name?  [Unknown]:  123What is the name of your organizational unit?  [Unknown]:  456What is the name of your organization?  [Unknown]:  789What is the name of your City or Locality?  [Unknown]:  123What is the name of your State or Province?  [Unknown]:  456What is the two-letter country code for this unit?  [Unknown]:  cnIs CN=123, OU=456, O=789, L=123, ST=456, C=cn correct?  [no]:  yEnter key password for <ybdesire.keystore>        (RETURN if same as keystore password):

执行命令进行签名:

jarsigner -verbose -keystore ybdesire.keystore -signedjar XXX.apk XXX.apk ybdesire.keystore

这里写图片描述

看到这些,意味着已经签名成功了。
最后安装,破解成功。

最后贴上给与我灵感的 参考博客地址:
http://blog.csdn.net/ybdesire/article/details/52505648

原创粉丝点击