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
- Apk反编译破解及重新打包
- Apk 反编译 重新打包 工具及命令
- Android apk反编译及重新打包流程
- 反编译+重新打包APK
- apk反编译和重新打包
- apk反编译和重新打包
- apk反编译和重新打包
- apk反编译和重新打包
- apk反编译和重新打包
- apk反编译和重新打包
- apk反编译后重新打包
- apk混淆打包与反编译破解及处理
- apk反编译及重新生成
- apk反编译及重新生成
- Android反编译及重新打包
- apk自动添加渠道号(无需反编译及重新打包APK)
- 关于apk的反编译和重新打包
- 安卓apk反编译之后重新打包
- 1.selenium 发展介绍
- EventBus简单实用
- Spark SQL, DataFrames and Datasets Guide
- 异常处理与多线程
- application registered the JDBC driver [com.mysql] but failed to unregister it when the web app...
- Apk反编译破解及重新打包
- 记录自己的第一篇博客
- js使用变量改变css值
- Java中File文件与Base64互转
- PHP 压缩文件生成zip(解决中文文件名问题)
- 168. Excel Sheet Column Title
- Abaqus obj inp 文件内部读取点坐标并统计
- hdu 5538 House Building 【矩阵表面积】
- Celery 简单应用