您的位置:首页 > 其它

Apk反编译破解及重新打包

2017-09-14 16:33 211 查看
以前对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) |
b660
| AntiVirusProActivity.PWD_HACKER.equals(pwd)) {
Session.isUserAccessible = true;
Session.IsPasswordEntered = true;
AntiVirusProActivity.this.finish();
}
}
});


很清楚,我们只需要把if判断做一下修改,让他永远为真就可以了。

然后我们找到 apktool 对应的文件(搜索smali语法去学习)

.prologue
const/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 //将返回值给 v1
if-nez v1, :cond_0 // 如果v1不等于0 ,就执行 cond_0
sget-object v1, Lcom/slickdroid/vaultypro/activity/AntiVirusProActivity;->PWD_HACKER:Ljava/lang/String;
invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_1
.line 182
:cond_0  // 上边判断如果为真,就走到这儿
//把 v2 的值给 isUserAccessible , 这是一个 boolean 型,那就是  isUserAccessible = true;
sput-boolean v2, Lcom/slickdroid/vaultypro/util/Session;->isUserAccessible:Z
.line 183
sput-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_0
return-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.keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]:  123
What is the name of your organizational unit?
[Unknown]:  456
What is the name of your organization?
[Unknown]:  789
What is the name of your City or Locality?
[Unknown]:  123
What is the name of your State or Province?
[Unknown]:  456
What is the two-letter country code for this unit?
[Unknown]:  cn
Is CN=123, OU=456, O=789, L=123, ST=456, C=cn correct?
[no]:  y

Enter 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: