文章目录

  • 一、反编译工具介绍
    • 1:apktool 获取资源文件
    • 2:dex2jar(源码文件获取)
    • 3:jd-gui 查看APK中classes.dex转化成出的jar文件,即源码文件
  • 二、apktool工具的反编译重打包签名的详细过程
    • 1:使用apktool.jar进行反编译
    • 2:修改版本号versionCode
    • 3:通过修改后的文件重新回编成apk文件
    • 4:将新的apk文件进行重签名以及内存对齐
      • 1:签名工具:jarsigner和apksigner
      • 2:V1和V2签名的区别
      • 3:zipalign内存对齐
      • 4:jarsigner给apk签名,只支持V1签名
      • 5:apksigner给apk签名,默认同时使用V1和V2签名
      • 6:验证是否签名成功
    • 5:查看新生成的签名apk的版本号是否修改成功
  • 三、总结

最近突然有个紧急需求,应用的某一个版本发布到应用宝时,由于应用宝自己抓包上传了一个高版本的安装包(即比当前要发布的版本高),导致上传失败,而向应用宝申诉无果,我这没有项目源码,找三方改东西太慢,所以要将这个版本反编译、修改为更高版本号、重新打包、对齐、签名在发布到应用市场,特此整理一些心得。

一、反编译工具介绍

1:apktool 获取资源文件

Apktool是一个逆向android非常有用的工具,可以用来反编译apk文件,并且能在修改部分资源文件后,重新打包成一个新的apk。

2:dex2jar(源码文件获取)

将Android的包dex文件转换成jar文件,此时拿到的时字节码文件一般和jd-gui结合使用,将字节码文件转成对应的源码

3:jd-gui 查看APK中classes.dex转化成出的jar文件,即源码文件

将dex2jar中的jar(字节码)文件转成源码,既可以查看源码也可以进行修改。

我的需求只涉及修改版本号,而不需要修改源代码,只需要通过apktool工具反编译拿到资源文件、修改版本号、重新回编打包成apk、内存对齐以及重签名 下面详细介绍apktool的使用过程,dex2jar和jd-gui的使用将单起一篇文章进行介绍。

二、apktool工具的反编译重打包签名的详细过程

首先下载一个最新版的apktool.jar

1:使用apktool.jar进行反编译

新建一个apktool.bat脚本 放入如下内容:

if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*

新建bat文件很简单直接将txt文件另存为.bat文件即可
对apk包进行反编译,将apk包和bat文件(apktool.jar)放到同一个文件夹下,目的是为了输入方便,只需要输入相对路径即可,如果不放到同一个文件夹下,每次输入命令都要输入绝对路径。
在cmd终端,cd到此目录下,输入以下命令:

**注意* outDir :表示反编译后的资源文件存放到哪个目录下* source.apk :表示要进行反编译的apk文件名称*/
apktool.bat d -o outDir source.apk或者也可以通过下面的命令反编译两者实现的效果都是相同的java -jar apktool.jar d -f source.apk -o outDir

执行完成后就会在当前目录下生成outDir文件夹存放反编译后生产的资源文件

2:修改版本号versionCode

有了这个outDir就能修改里面的东西了,最难修改的部分就是java代码,这里对应的是smali相关的文件夹,需要了解一些smali的语法才行。
修改应用版本号只需要修改apktool.yml即可,apktool.yml文件中找到versionCode,修改里面的versionCode对应的值保存即可。

3:通过修改后的文件重新回编成apk文件

然后就是再使用下面的命令行,可以将我们的outDior文件夹重新编译成一个apk文件,也就是下面命令中的new_no_singnalign.apk

**注意* new_no_singnalign.apk :新生成的apk文件,此apk文件没有签名和对齐* outDir :将outDir的文件进行编译*/
apktool.bat b -o new_no_signalign.apk outDir

4:将新的apk文件进行重签名以及内存对齐
1:签名工具:jarsigner和apksigner

此处简单介绍一下Android用的签名工具,以及V1(Jar Signature) V2(Full APK Signature)两种签名

  1. Android中对APK签名是通过jarsigner或apksigner进行的;
  2. jarsigner是JDK提供的针对jar包签名的通用工具位于JDK/bin/jarsigner.exe;
  3. apksigner是Google官方提供的针对Android apk签名及验证的专用工具,位于Android SDK/build-tools/SDK版本/apksigner.bat;

在AS打包Build->Generate signed apk… 打包签名过程中,可以看到两种签名选项 V1(Jar Signature) V2(Full APK Signature),从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature);但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing)

2:V1和V2签名的区别

V1签名:

  • 来自JDK(jarsigner), 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)
  • 对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA),
  • 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件), 由此可知: V1签名是对压缩包中单个文件签名验证

V2签名:

  • 来自Google(apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign),
  • 对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证

V2签名优点很明显:

签名更安全(不能修改压缩包)
签名验证时间更短(不需要解压验证),因而安装速度加快

注意: apksigner工具默认同时使用V1和V2签名,以兼容Android 7.0以下版本

3:zipalign内存对齐

位于Android SDK/build-tools/SDK版本/zipalign.exe zipalign;是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗

zipalign -v 4 in.apk out.apk //4字节对齐优化
zipalign -c -v 4 in.apk  //检查APK是否对齐

非常重要:

在此处介绍一下v1和v2签名以及zipalign内存对齐,至于先签名后对齐,还是先对齐后签名与你采用的签名方是有关系,
1:zipalign可以在V1签名后执行,但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!
2:如果不好记你就记住一个原则就是:先对齐后签名

有了上面概念理论介绍,接下来就直奔主题进行实操了,接下来我就按照先对齐后签名的方式分别用V1和V2进行签名,至于V1签名的先签名后对齐的方式不在这里描述了,感谢兴趣的自己可以试试。

我们可以通过zipalign -c -v 4 new_no_signalign.apk //检查APK是否对齐
此命令执行完成后可以看到 Verification FAILED,表示没有对齐。

通过zipalign -v 4 new_no_signalign.apk new_align.apk //4字节对齐优化

4:jarsigner给apk签名,只支持V1签名

jarsigner -verbose -keystore android.zhumu.keystore -signedjar (签名后的apk路径及名称) (要给谁签名.apk路径 ) 签名文件的别名

运行上面的命令后需要先输入签名文件的密码才能生成签名文件, 最终生成的singnedv1.apk就是我们最终要用的apk文件。

5:apksigner给apk签名,默认同时使用V1和V2签名

cd到Android SDK/build-tools/SDK版本/目录下, 输入命令 apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 --out 生成的签名文件路径及名称 给哪个apk文件签名
注意:
1:上面面参数中 密钥库名、给哪个apk文件签名 需要给出绝对路径,要不就报错早找不到文件,因为在当前目录下没有签名文件和要进行签名的apk文件
2:而生成的签名文件路径及名称 如果不指定路径就生成在当前目录下

生成的singnedV2.apk就是最终要用的APK,注意4和5是两种签名方式用哪一种都可以。

6:验证是否签名成功

方案1只支持校验v1签名:
keytool -printcert -jarfile singnedv1.apk //此命令只支持校验v1签名
方案2支持v1和v2的签名校验:
apksigner verify -v --print-certs (apk地址)
需要切cd 到apksigner所在的目录
如:apksigner verify -v --print-certs C:\Users\tiansc\Desktop\apks\signedV2.apk

5:查看新生成的签名apk的版本号是否修改成功

需要用到aapt工具看看新的apk的版本号是不是真的修改成功了,
输入下面的命令分别对singnedv1.apksignedV2.apk分别进行查看

aapt dump badging 要验证的apk
如:
aapt dump badging singnedv1.apk
aapt dump badging signedV2.apk

三、总结

而在我们平时工作中关于APK的打包以及签名都由AS工具可视化一键完成了,逆向开发这块需要对APK的打包签名的流程有较为深刻的理解,只有这样才能一步一步的手动完成反编译、打包、签名的整个过程。
本文章只是着重介绍了反编译工具apktool的使用,至于dex2jar和 jd-gui工具将会另起一篇文章进行详细介绍,敬请关注!!!

最后附上反编译工具的下载地址
Android反编译工具集合一键全消,akktool反编译获取资源文件、dex2jar将dex文件转成jar

Android反编译apk修改版本号重新打包签名详细教程(超详细)相关推荐

  1. android反编译apk文件

    android反编译apk文件 android运行的是.dex文件的二进制码,java运行的是.class文件的码,那么android是怎么将.java格式的文件转换为.dex的文件?------&g ...

  2. 新版Android Studio(4.1.1 for Windows 64-bit)的安装教程(超详细)

    新版Android Studio(4.1.1 for Windows 64-bit)的安装教程(超详细) 获取Android Studio软件 在心仪的磁盘新建文件夹:AndroidStudio(文件 ...

  3. 如何查看apk安装包源代码??Android反编译apk,解包,打包,签名一体化实测 ,修改图片音频软件名称版本号等入门

    首先下载反编译工具包 下载地址 链接:  https://zly520.lanzoui.com/ibtuxhf7rab 一.反编译工具介绍 首先 如果你想改动图片音频之类的,见末尾! 1.apktoo ...

  4. Android Apk反编译、修改资源、重新签名以及重新打包的详细讲解

    在反编译之前先明确下,反编译别人的Apk不是件很道德的事情,毕竟这是别的程序员辛辛苦苦写出来的代码,所以说代码混淆这东西很重要,就是为了防止别人反编译.本文抱着学习的态度,在一些特殊情况下研究下怎么反 ...

  5. 反编译apk修改v7包_微信Android SDK反编译还原源码 进行修改重新编译

    一.介绍 微信sdk,做开发的都应该用过,微信分享.支付,都要用到的. 接下来,跟着我,把他的sdk源码还原为一个module可编译的形式. 用到的工具: jadx: 这是一款反编译apk和jar包的 ...

  6. android反编译修改教程,逆向教程之-反编译apk修改菜单默认设置(一)

    本帖最后由 liuxiaoxin 于 2020-12-3 18:58 编辑 授人以鱼,不如授人以渔!本教程图文并茂,步骤非常详细,偏小白向,大佬请自觉屏蔽. 使用工具:MT管理器免费版 被修改的软件: ...

  7. [Android]反编译apk + eclipse中调试smali

    从来没有想过反编译apk是来的如此方便,并且还可以修改后重新编译运行,这比在win下修改pe容易多了,感谢apktool和smali工具的作者提供这么好的工具. 跟踪apk一般的做法是在反编译的sma ...

  8. Android 反编译 apk

    反编译需要使用到三个工具,获取apk里面的资源使用apktool,反编译Java代码使用dex2jar,查看反编译之后的jar文件使用jd-gui. 1.apktool工具可以反编译apk文件,然后拿 ...

  9. android反编译APK后,是smali文件,能反编译成dex文件

    我也面临相同的问题,但目前还没找到类似反编译smali文件的方法,一般得到dex文件只需要用WinRAR或其他压缩软件打开apk文件就能得到.但也有例外好像,技术先进了,今天遇到个apk用WinRAR ...

最新文章

  1. tf.nn.l2_loss() 与 权重衰减(weight decay)
  2. 全国大学生智能猫竞速比赛
  3. Matlab-运算符
  4. row height
  5. [USACO14JAN]记录奥林比克
  6. 【AWSL】之Linux进程和计划任务管理(ps、top、pgrep、pstree、pkill、at、crontab)
  7. linux电脑培训,电脑培训Linux服务器初始化Shell
  8. sql倒序查询语句_SQL丨1.基本查询语句复习
  9. CTF web题 wp:
  10. 进程间通信——Queue
  11. 一个游戏大量合服代表什么_一个女人哭了代表什么?这几点帮你分析
  12. 复合存储引擎的设计和实现(包含ORM和内容存储)
  13. 8421BCD码与十进制之间的转换
  14. nas设备在通用服务器的基础上对文件服务,NAS网络存储设备将取代文件服务器
  15. Unity 将3D物体的世界坐标转换为对应的屏幕坐标
  16. linux-netstat的用法-netstat12种网络连接状态
  17. 大二下学习资料的整理
  18. 学简单python好学吗_python好学吗语法简单吗举个例子
  19. web前端网页设计期末课程大作业:企业网页主题网站设计——舞蹈培训11页HTML+CSS+JavaScript
  20. [转帖]改变无数人人生的32句实话[ChaseDream论坛]

热门文章

  1. MATLAB 绘图时如何设置中文宋体英文新罗马
  2. QT复制文本、图片到剪切板-QClipboard
  3. 富文本框回显乱码问题解决
  4. 让相同的div浮动到同一行或者同一列
  5. html div页面固定,将div固定浮动网页底部代码
  6. Android图片适配分辨率,Android多分辨率适配总结
  7. html标签-如何制作表格
  8. 总结WEB服务器搭建(一)
  9. (四) 三维点云课程---PointNet-Pytorch运行
  10. 跟我一起学scikit-learn07:scikit-learn简介