Apk反编译再打包

Apk反编译再打包

近期研究了一下Apk反编译技术,在网上找了很多资料,进行了实践,成功完成了apk反编译,修改代码,再打包编译的过程。这个过程耗费了我3天的时间,踩了很多坑。记录下来,便于我以后忘记,也便于其他程序猿/媛们重现这个过程,节约大家的时间。

1.准备阶段

(1)系统信息

  macOS Sierra 10.12.5 

  $ java -version

  java version "1.8.0_151"

  Java(TM) SE Runtime Environment (build 1.8.0_151-b12)

  Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

  windows系统和linux系统也可以的,需要安装jdk1.8,这个过程不在本文章范围内。

(2)下载工具

  apktool,jd-gui,dex2jar,auto-sign

  百度可以搜到,有些工具需要访问外网才可以下载到。

  如果闲麻烦的话我这里准备了下载包(csdn 2积分):

  压缩包中的jd-gui是mac版的,其他版本在官网下载http://jd.benow.ca/

  zip:https://download.csdn.net/download/moluth/10779181

  tar:https://download.csdn.net/download/moluth/10779172

(3)工具简介

  apktool:用于编译,反编译apk包

  auto-sign:给apk包签名

  dex2jar:把dex文件还原成jar包

  jd-gui:反编译jar包,查看jar源码。

(4)工具解压

  如果你下载了(2)中的压缩包解压,先解压,然把里面的dex2jar-2.0.zip也解压,如下图,共4个工具:

Apk反编译再打包_第1张图片


2.查看源代码

(1)解压apk包

apk包是一个zip格式的压缩包,把扩展名改成zip,然后解压。解压后可以看到这个apk包中的文件,不同apk包中有所区别。

Apk反编译再打包_第2张图片

assets:放的是各种app会用到原始文件,如html,css,json等

kotlin:kotlin是安卓开发新一代编程语言,有些apk使用kotlin语言,这个文件夹下放的是kotlin编译后文件。

lib:存放的是c/c++生成的.so动态链接库文件。

res:各种布局文件,动画,图片,资源文件,xml文件,这个不太好解释,做过安卓开发的应该都可以意会。

okhttp3:是一个第三方网络请求包。

*.dex:java代码编译成jar包后,合并成dex包,安卓系统可以识别dex包。

AndroidManifest.xml:里面写着Activity,Application,app权限等信息。

resources.arsc:资源文件索引文件,这个比较复杂,但是对我们来说没有什么用处,不必理会

其他:忽略

(2)将dex还原成jar包

先把dex文件拷贝到dex2jar的文件夹下,执行命令:

类linux系统:

$chmod 777 d2j-dex2jar.sh

$./d2j-dex2jar.sh *.dex

windows系统:

$d2j-dex2jar.bat *.dex

执行后会生成一些jar包,然后用jd-gui打开这些jar包,就可以看到java源代码了,如下图所示。

Apk反编译再打包_第3张图片

Apk反编译再打包_第4张图片


3.反编译apk

先把apk包放到apktool_2.3.4.jar所在目录,然后执行命令:

$java -jar apktool_2.3.4.jar d xxx.apk -o xxx

如果不需要修改资源文件(修改资源文件有坑,再次编译过程中有可能会报错),使用下面命令:

$java -jar apktool_2.3.4.jar -r d xxx.apk -o xxx

做完上面操作,会产生一个xxx文件夹,文件夹内容如下:

Apk反编译再打包_第5张图片

这时可以修改上面圈出的文件,要保持文件名称不变。

smali:看这里https://blog.csdn.net/yuanguozhengjust/article/details/80493963

可以对比着jd-gui中的源码修改smali文件。


4.再编译apk

在第3步,修改smali,资源文件,和AndroidManifest.xml文件后就可以再把这个打包成apk了

(1)打包

执行下面命令:

$java -jar apktool_2.3.4.jar b xxx

执行后xxx文件夹下回产生build和dist文件夹,dist文件夹下就是apk文件了。这时的apk文件还不能安装,需要签名。

(2)签名

至于为什么要签名,建议去搜一下,找几篇文章看看,这里不再赘述。

把xxx/dist文件夹下的xxx.apk拷贝到Auto-Sign(签名工具,1中有介绍)文件夹下,然后执行下面命令:

$java -jar signapk.jar testkey.x509.pem testkey.pk8 xxx.apk xxx_signed.apk

就可以再这个文件夹下生成xxx_signed.apk,大功告成!!!

 

你可能感兴趣的:(安卓)