【转】一步一步带你反编译apk,并教你修改smali和重新打包
一、工具介绍:
1.apktool:aapt.exe,apktool.bat,apktool.jar;三个在同一目录结合使用,用来反编译apk,apk重新打包;
2.dex2jar:该工具作用是将classes.dex文件,反编译出源码(如果apk未加固),反编译出文件,使用jd-gui工具进行查看;
3.Auto-Sign:自动签名工具,将重新打包的apk进行签名,如果不签名,无法安装使用。
工具下载地址:https://download.csdn.net/download/sxk874890728/10443156 (需要3CSDN积分,原本我设置3积分的,不知道为什么涨到16积分了......)
使用场景:项目源码丢失,只有线上apk,并且没有加固,要求修改apk接口地址,并且重新打包,再发布。
二、工具使用:
解压后工具包如图:
1.思路:使用工具dex2jar反编译,并用jd-gui工具进行查看项目结构,查看源码,并且找到接口地址类,修改接口地址;
步骤一:下载好工具,将需要反编译的APK后缀名改为.rar或则 .zip,并解压,如图:
得到其中的classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的
classes.dex复制到解压出来的工具dex2jar-0.0.9.15 文件夹内,
在命令行下,进入到dex2jar.bat所在目录,输入命令:
dex2jar.bat classes.dex
效果如下:
步骤二:运行结束后,在该目录下会生成一个classes_dex2jar.jar的文件,如图:
然后打开工具jd-gui文件夹里的jd-gui.exe,用该工具打开生成的classes_dex2jar.jar文件,便可以看到源码
了,效果如下:
2.思路:apktool,反编译修改smali文件,进行重新打包,通过用jd-gui工具找到接口地址类后,与相应
的smali文件进行对比,修改接口地址;
下载上述工具中的apktool,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的
APK文件放到该目录下,如图:
打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:
apktool.bat d -f test.apk -o test apktool -f [待反编译的apk] -o [反编译之后存放文件夹]
如图:
反编译之后会得到test 文件夹,打开test文件夹,里边就是反编译出来的各种资源文件
使用jd-gui查看源码找到地址类,然后在smali文件里找到地址的smali文件,更改smali文件内接口地址。
如图:
smali文件内找到与之对应的地址smali文件
修改接口smali文件里的地址将Ip更换成域名如图:
修改后,保存。
3.重新打包。 执行打包命令
apktool.bat b test
在test文件内会多出两个文件如下图所示:
dist文件内就是我们需要的apk。
4.签名apk,重新发布。
接下来就要用到签名工具了,如果不经过签名是不能正确运行的。工具: auto-sign.zip
将打包好的test.apk 拷贝到解压好的auto-sign文件夹下,执行命令:
java -jar signapk.jar testkey.x509.pem testkey.pk8 test.apk test_signed.apk
- 1
test_signed.apk就是签名后的apk :
5.运行之后,发现在5.0上运行会直接崩溃,android studio捕捉到错误所在:
这里是在jd-gui上查看到了源码位置
错误原因:
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.sun3d.culturejingan.communication.link }
如错误提示所示,在android 5.0版本以后,service intent必须为显式指出。
那么就需要修改smali文件相关类,这里就用到将java2smali文件
6.java2smali插件,地址:https://plugins.jetbrains.com/plugin/7385-java2smali
插件安装,选择本地安装,不懂怎么安装插件,请百度下。
找到相应问题的smali文件代码定位:
由于不太懂smali语法的书写,所以我们直接将写好java代码用插件转换为smali语法,拷贝进来,替换原有smali代码
这是java代码
转换成smali代码
相应代码会直接展示,找到相应转换结果:
替换反编译出的相应smali文件里的相应代码,然后执行重新打包命令,签名命令,执行第3步。
整个过程并不复杂,只要有耐心就可以更改成功。
反编译+重新打包+签名
java -jar apktool.jar d -f zhugechengyu.apk -o MMTS d2j-dex2jar classes.dex 反编译重新打包 java -jar apktool.jar b MMTS 生成签名 keytool -genkey -alias android.keystore -keyalg RSA -validity 36500 -keystore android.keystore 重新签名 jarsigner -verbose -keystore android.keystore -storepass hzx123 -keypass hzx123 -signedjar zg_signed.apk zhugechengyu.apk android.keystore
from:https://blog.csdn.net/sxk874890728/article/details/80486223
原文地址:https://www.cnblogs.com/xuan52rock/p/11028080.html
- 使用R语言挖掘QQ群聊天记录
- 解析滴滴算法大赛---GBDT进行数据预测
- 数据迁移中的数据库检查和建议(r2笔记71天)
- 决策树案例:基于python的商品购买能力预测系统
- 数据迁移前的准备和系统检查 (r2笔记70天)
- 数据处理的统计学习(scikit-learn教程)
- 机器学习实战,使用朴素贝叶斯来做情感分析
- Python NLTK 处理原始文本
- 通过闪回事务查看数据dml的情况 (r2笔记69天)
- 通过shell和sql结合查找性能sql(r2笔记68天)
- 淘宝的评论归纳是用什么方法做到的?
- Python的机器学习实战:AadBoost
- 通过shell检查分区表中是否含有默认分区(r2笔记87天)
- 利用python爬取人人贷网的数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法