zoukankan      html  css  js  c++  java
  • 【转】安卓apk反编译、修改、重新打包、签名全过程

    首先明确,反编译别人apk是一件不厚道的事情。代码是程序员辛苦工作的成果,想通过这种手段不劳而获,是不对的。这也说明,代码混淆是非常重要的。本文抱着学习的态度,研究在一些特殊的情况下如果有需要,该怎么反编译apk。

    工具简介
    apktool,编译和反编译apk,从apk中提取图片和布局资源

    dex2jar,将可运行文件classes.dex反编译为jar源码文件

    jd-gui,查看jar源码文件

    反编译
    apktool安装
    Windows系统:
    1. 首先确保系统安装有Java
    2. 下载apktool.bat脚本
    3. 下载最新版本的apktool.jar,并且重命名为apktool.jar
    4. 将apktool.bat和apktool.jar放在同一目录下,就可以在命令行窗口使用了。
    5. 其他系统请参考链接

    用法
    可以直接在命令行执行apktool.bat查看帮助。这里介绍两个最常用的:

    反编译
    apktool.bat d -o <output_dir> test.apk
    1
    其中<output_dir>指定输出目录,默认为apk.out。

    编译
    apktool.bat b -o <output.apk> <input_dir>
    1
    其中<input_dir>就是上面反编译输出的目录,<ouput.apk>是编译的输出结果,默认为dist/<name>.apk。

    示例
    一个典型的apktool反编译的结果如下:

    此时,可以查看AndroidManifest.xml,res及smali文件了。甚至可以修改这个目录下的资源文件或者smali文件,然后重新编译。

    值得注意的是,apktool反编译出来只能得到apk的smali文件,即汇编语言版本,并不能得到源代码。

    查看源码
    一. 这里需要用到另外两个工具,下载dex2jar并解压。下载jd-gui,这是一个带UI的应用程序。

    二. 将需要反编译的apk的后缀名改为.zip或者.rar,然后解压到一个文件夹,得到其中的classes.dex文件。

    三. 将classes.dex复制到解压后的dex2jar-2.0文件夹下。从命令行进入到该目录,执行

    d2j-dex2jar.bat classes.dex
    1
    会生成由classes.dex反编译得到的jar文件,classes-dex2jar.jar。

    四. 然后使用jd-gui打开classes-dex2jar.jar,就可以查看源码了。

    如果apk在发布的时候加过混淆处理,那么我们也只能得到混淆后的版本。想通过阅读源码来破解别人的apk,还是有一些难度的。

    修改代码
    如果只是修改apk相应的资源,例如图片,比较好办,在res文件夹下找到相应的文件替换就可以。

    修改代码比较麻烦,因为反编译出来的结果中只有smali文件,即Java虚拟机支持的汇编语言。

    如果确实需要修改代码,就得对照smali文件和从classes.dex反编译出来的源码了,按照smali的规范来改动即可。相当于写汇编,这个难度比较大。

    重新打包
    使用apktool编译前面反编译生成的目录即可。

    签名
    签名是对要发布的apk文件作标记,确保你的apk文件有唯一的身份归属认证,只有相同签名和相同包名的文件才可以覆盖安装并保留用户信息。

    对于反编译的apk,我们可以通过jarsigner来对它进行签名。

    生成keystore文件
    首先,签名需要keystore文件,可以使用keytool工具生成,一般Java环境都带有keytool命令,可以在命令行测试。

    keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
    1
    各个参数解释如下:

    -genkey 产生证书文件
    -alias 产生别名
    -keystore 指定密钥库的.keystore文件中
    -keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
    -validity 为证书有效天数,这里我们写的是40000天

    输入上述命令后,会有如下的提示:

    输入keystore密码:
    再次输入新密码:
    您的名字与姓氏是什么?
      [Unknown]:  test
    您的组织单位名称是什么?
      [Unknown]:  test
    您的组织名称是什么?
      [Unknown]:
    您所在的城市或区域名称是什么?
      [Unknown]:
    您所在的州或省份名称是什么?
      [Unknown]:
    该单位的两字母国家代码是什么
      [Unknown]:
    CN=test, OU=test, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
      [否]:  y
    
    
    输入<demo.keystore>的主密码
            (如果和 keystore 密码相同,按回车):
    

      

    签名apk
    jarsigner也存在于Java JDK的安装包当中,所以安装好了Java环境的话,可以直接在命令行使用。

    jarsigner -verbose -keystore demo.keystore demo.apk demo.keystore
    1
    -verbose 指定生成详细输出
    -keystore 指定数字证书存储路径

    这样,就完成了对一个apk的签名过程,然后就可以安装使用了。注意如果你的手机上原来就有这个apk,需要卸载掉。因为新apk的签名已经改变了。

    from:https://blog.csdn.net/dreamer2020/article/details/52761606

  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/11028066.html
Copyright © 2011-2022 走看看