反编译与二次打包

1,299 阅读3分钟

反编译:

流程:

  • 使用apktool ,获取出资源和图片,以及smali文件
  • 使用dex2jar将,dex文件转成jar文件,为第三步生成源码java文件做准备
  • 使用jd-gui,查看第二步生成的jar文件和生成java文件

使用工具:

apktool(下载地址):编译和反编译apk,从apk中提取图片和布局资源,同时会生成源代码的smali文件,通过命令可以重新编译smali文件并生成新的apk文件

  • 去官网下载,需要下载两个文件apktool.bat和apktool.jar将两个下载好的文件放在同一个文件夹下位于统一目录下:  
    • 提取apk文件中的资源和smali文件,,会更具apk名字生成一个base为文件夹

      apktool d base.apk  
      
    • 重新生成apk文件,这里的base是上一步生成的文件夹名

      apktool b base 
      

dex2jar(下载地址):

将可运行文件classes.dex反编译为jar源码文件,解压文件之后,在目录下打开命令窗口,并执行如下命令,其中classes.dex文件是把base.apk修改成base.zip解压之后得到的文件:

d2j-dex2jar classes.dex

得到jar文件:

jd-gui(下载地址):查看源码的工具,和导出java源码

  • 运行jd-gui.exe程序,并打开上一步得到的classes-dex2jar.jar文件

  • 导出源码:

     上述操作之后就能拿到apk的源码和资源图片登内容,但是最后导出的源码在Android studio打开之后有可能会报错,是因为jd-gui导出的时候不支持kotlin和一些特殊的转化不支持,需要手动调整

二次打包:

修改文件:

  • 可以修改资源和java源码:可以修改图片等其他资源,也可以修改java源代码,在重新编译成class文件,在将class文件变成jar文件,最后在由jar生成dex,最后在和资源一起打包成apk文件
  • 修改资源:修改应用名称和启动图标以及注入新的Activity等操作直接修改AndroidManifest.xml文件:

  1. 修改java代码的方式一:
  • 将jd-gui导出的源码放到工程中进行编译,修改之后保证编译通过

  • 编译之后在classes文件下会生成class文件

  • 运行如下命令生成jar包:

    //base.jar是要生成的文件的名字
    //base是存放class的文件夹或者class文件名
    jar cvf base.jar base
    
  • 运行如下命令生成dex包:

    //classes.dex是生成的文件
    //base.jar是上一步生成的jar文件
    dx  --dex --output classes.dex base.jar
    

把生成的dex替换之前的classes.dex文件并重新压缩,成一个新的zip文件,在将zip文件修改成appk文件,这种方式可以不在考虑下边的步骤,但是生成的包可能会有问题

  1. 修改java代码方式二:
  • 将jd-gui导出的源码放到工程中进行编译,修改之后保证编译通过
  • studio安装插件java2smali,将修改后的java文件使用插件转成smali文件,放到对应的文件目录下,进行后续步骤,生成安装包

重新生成安装包

//然后运行一下命令重新生成安装包,但直接云心会报错,需要重新签名:
apktool b base 

重新签名

//test.jks是签名文件
//111111是签名文件的密码
//key0是签名密钥别名
//base.apk是重新签名的apk文件

jarsigner -verbose -sigalg SHA1withRSA 
-digestalg SHA1 -keystore test.jks -storepass 111111 base.apk key0