一步一步带你反编译apk,并教你修改smali和重新打包

xuan52rock xuan52rock     2022-12-20     160

关键词:

一、工具介绍:

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

(第一篇)一步一步带你了解linqtoobject(代码片段)

...函数,我们必须学会委托,这是本文的宗旨。下面开始第一步。在第一步开始之前,我们做点准备工作,建立一个学生类和一个班级类,类结构如下publicclassStudentpublicintIdget;set;publicintCla 查看详情

vue一步一步带你封装一个按钮组件(代码片段)

#前言本文主要对子组件的封装做一个了解首先我们直接看一下代码显示首先是今天有一个学妹过来问我如何封装子组件#实现效果首先这个组件是基于eleemnt-ui进行封装的我们看一眼实现效果 有了实现效果之后我们一起来看看... 查看详情

面试必备透过源码角度一步一步带你分析arraylist扩容机制(代码片段)

一先从ArrayList的构造函数说起ArrayList有三种方式来初始化,构造方法源码如下:/**默认初始容量大小*/privatestaticfinalintDEFAULT_CAPACITY=10;privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA=;/*默认构造函数,使用初始容量10构造一个空列表... 查看详情

一步一步带你安装史上最难安装的vim插件——youcompleteme

YouCompleteMeisafast,as-you-type,fuzzy-searchcodecompletionengineforVim.参考: https://github.com/Valloric/YouCompleteMe#full-installation-guide本篇文章默认读者知道什么是unix/linux,vim/vi,YouCompleteMe,如果有不清楚的,S 查看详情

android一步一步带你实现recyclerview的拖拽和侧滑删除功能

先上效果图: 本篇文章我们来学习一个开源项目Android-ItemTouchHelper-Demo 这个项目使用了RecyclerView的ItemTouchHelper类实现了Item的拖动和删除功能,ItemTouchHelper是v7包下的一个类,我们看一下他的介绍Thisisautilityclasstoaddswip... 查看详情

linux驱动实践:带你一步一步编译内核驱动程序(代码片段)

作者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。文章目录学习的困惑实践环境编译进内核创建驱动程序目录创建源文件创建Kconfig文件创建Makefile文件编译编译为驱动模块编译所有的驱动... 查看详情

linux驱动实践:带你一步一步编译内核驱动程序(代码片段)

作者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。文章目录学习的困惑实践环境编译进内核创建驱动程序目录创建源文件创建Kconfig文件创建Makefile文件编译编译为驱动模块编译所有的驱动... 查看详情

vue3教程:理工直男都是如何一步一步带妹构建插件?(代码片段)

作者:Shadeed译者:前端小智来源:learnvue有梦想,有干货,微信搜索【大迁世界】关注这个在凌晨还在刷碗的刷碗智。本文GitHubhttps://github.com/qq449245884/xiaozhi已收录,有一线大厂面试完整考点、资料以及我... 查看详情

一步一步教你使用lsmw批量处理数据

 保存退出输入完后,保存退出  查看详情

一步两步带你实现android沉浸式设计(代码片段)

前言    沉浸式不知道什么时候有了两种叫法,一种是沉浸式模式,一种是沉浸式状态栏,Google从Android4.4开始,给我们开发者提供了一套透明的系统UI样式给状态栏和导航栏,这样完美的玩法简直和IOS系统媲... 查看详情

从零开始带你一步一步使用yolov3测试自己的数据

上一篇: 从零开始带你一步一步使用YOLOv3训练自己的数据我给大家详细介绍了如何使用YOLOv3模型来训练自己的数据集。训练部分完成,本文将继续给大家详细介绍如何使用我们训练好的模型来进行图片的批量测试。一、... 查看详情

一步一步教你认识闭包

...什么用?为什么要用闭包?今天我们就带着这3个问题来一步一步认识闭包。闭包和函数紧密联系在一起,介绍闭包前有必要先介绍一些背景知识,诸如嵌套函数、变量的作用域等概念作用域作用域是程序运行时变量可被访问的... 查看详情

一步一步教你接入tinker热修复

官方文档:https://github.com/Tencent/tinker 下面我们按照官方文档和这个里面的tinker-sample-android来进行集成Tinker。注意说明,官方demo的使用https://github.com/Tencent/tinker/wiki/Tinker-接入指南里面的使用步骤详解,注意:官方demo导... 查看详情

一步一步教你ssm整合swagger(代码片段)

一:什么是swagger??swagger是一款非常好用的写API文档的框架。其他自行百度二:ssm整合swagger?1:在maven的pom文件中引入依赖:(注意版本,否则会导致tomcat不能正常启动)<!--引入swagger--><!--springfox的核心jar包--><depende... 查看详情

一步一步教你如何制件zkeacms的扩展组件/插件

前言如果你还不知道ZKEACMS,不妨先了解一下。ASP.NETMVC开源建站系统ZKEACMS推荐,从此网站“拼”起来官方地址:http://www.zkea.net/zkeacms下载地址:https://github.com/SeriaWei/ASP.NET-MVC-CMS/releasesGitHub:https://github.com/SeriaWei/ASP. 查看详情

一步一步教你反向传播的样例

背景反向传播(Backpropagation)是训练神经网络最通用的方法之中的一个,网上有很多文章尝试解释反向传播是如何工作的,可是非常少有包括真实数字的样例,这篇博文尝试通过离散的数据解释它是如何工作的。Python实现的反向传... 查看详情

02~一步一步教你使用svn之svn的介绍

SVN的介绍一.学习SVN的主要内容的介绍1.基本操作:学习SVN有哪些基本操作2.服务器端的安装配置:SVN中必不可少的2个环境之一,会在下面的课程中介绍服务器如何去安装和配置3.客户端软件的使用:在实际开发中,使用客户端软件来操... 查看详情

公子奇带你一步一步了解java8中lambda表达式

在上一篇《公子奇带你一步一步了解Java8中行为参数化》中,我们演示到最后将匿名实现简写为1(Policepolice)->"浙江".equals(police.getPoliceNativePlace());这是一个带有箭头的函数,这种写法在Java8中即为Lambda表达式。那么我们就来好好... 查看详情