Android反编译后重新打包

作者: 石先 | 来源:发表于2016-04-13 00:54 被阅读11761次

在android开发中经常会遇到需要反编译竞品的需求,题主也就针对反编译apk后替换sdk后重新打包的场景进行试验,下面一步一步来说明Android如何反编译后重新打包。

一个典型apk包中包含的内容

我们知道android项目编译成应用程序后的安装文件是.apk文件,运行期间classloader加载的是dex文件中的class。所以我们先来看看一个典型的apk包中具有哪些基本内容:


apk包内容.png

方式一:使用apktool直接反编译apk(酷市场为例,2016.8.12更新)

配置apktool环境:

1.打开apktool官网


2.下载执行脚本文件和apktool.jar包

先下载脚本文件 :
mac os 对应 apktool.sh
windows 对应 apktool.bat

再下载最新的apktool.jar


3.配置apktool的运行环境

windows:把下载的两个文件都copy到c:/windows目录,或者放到自己指定的目录下再修改系统path也行
Mac os: 把下载的两个文件都copy到/usr/local/bin目录下,修改权限为可执行chmod a+x

在命令行终端模式下,输入apktool验证是否完成apktool环境配置


反编译apk包

1.命令行进入到apk包所在的文件夹路径


2.执行反编译命令 apktool d filename

3.得到反编译后的文件夹

4.修改apk内容(举例替换logo)

查看manifest.xml文件,icon对应的就是配置应用logo


logo图片资源所在

5.重新签名打包

1.回编译apkapktool b files
files就是对应刚刚修改的apk文件夹,执行完后会重新生成一个apk文件

注意:编译后的apk是安装不成功的,总是提示 Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION],实质是没签名。

2.生成签名:
keytool -genkey -keystore coolapk.keystore -keyalg RSA -validity 10000 -alias coolapk

注意:上面-keystore后面跟的是签名文件的名字,而-alias是别名,一般情况下-keystore后面跟-alias是一样的,但其实两者没有关系,这也是我故意搞成不一样的原因。

3.为apk增加签名:
jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore coolapk.keystore -signedjar coolapk-signed.apk coolapk.apk coolapk

注意:
1.最后的”coolapk”就是-alias后面带的,必须保持一致
2.如果不带-digestalg SHA1 -sigalg MD5withRSA签名后的apk安装也会不成功,INSTALL_PARSE_FAILED_NO_CERTIFICATES的错误,如果不带-tsa会报一个时间方面的警告.

方式二:使用dex2jar反编译查看java代码(为例,2016.4月更新)

下载dex2jar和jd-gui

dex2jar: https://github.com/pxb1988/dex2jar
jd-gui: http://jd.benow.ca/

使用dex2jar将从apk中解压得到的dex文件转成jar包

使用jd-gui来查看jar包内容

jd-gui.png

将要需改的类更改代码后复制到jar内,完成覆盖替换

覆盖替换类

把jar包重新转成dex文件

将修改完成后的dex文件复制到原来的apk文件中

直接覆盖原来的dex文件



然后就兴冲冲地直接去安装了,然而~


看来果然没这么简单就能呢个搞定,继续排查原因。

找原因

看看apk文件中有什么可疑对象导致了安装失败,果然除了dex和资源文件以外,还发现了三个文件


原来是apk包本身的防篡改机制导致的

打开文件来一探究竟,果然里面都是对打包时对文件进行了标识记录,看来这是避免文件被篡改的安全机制。


Paste_Image.png

找到问题原因就来解决,嘿咻嘿咻

想想既然是这些文件导致的,那先试试简单粗暴地直接把文件删了,避免防篡改检查


Paste_Image.png

然而,这样的是不行的,必须要有这个文件夹才能解析apk包,可能这些相当于是读取安装文件列表清单,必须具有,看来此路不通,


Paste_Image.png

既然原来的清单内容对不上,但又不能不提供,那能不能我们给它配一个新的?
想到这里,感觉可以动手试试,嘿咻嘿咻~

这些文件既然是在编译打包成apk时期自动生成的,那要想再生成一份新的,所以应该重新打包就可以。可是这个本身已经就是apk文件了,怎么再编译打包?
停下来想了想,对啊,突然想起来可以给包签个名呗,打签名应该也会有同样的效果才对,继续嘿咻嘿咻。

找个工具来签名吧,用自己的去签名留下点什么不良记录就不好了,嘿嘿~


Paste_Image.png

签名成功后

成功安装,破解完成

相关文章

  • Android反编译后重新打包

    在android开发中经常会遇到需要反编译竞品的需求,题主也就针对反编译apk后替换sdk后重新打包的场景进行试验...

  • Android反编译后重新打包

    1.反编译重新打包这里使用APKTOOL 2.进入到 wrapper script复制此文本,保存为apktool...

  • AndroidのAPK反编、打包、签名

    Android逆向工作都避免不了要对apk进行反编译后重新打包,这里就简单说一下用apktool进行解包和打包的整...

  • Android反编译后重新打包apk

    为什么要反编译别人的代码? 人家比咱写的好,学习 看中了人家的某个控件,抄袭 看中了人家的本地数据库,想要 但是人...

  • Apktool 下载、安装和使用

    Apktool 简介 用于反编译Android apk,可以将应用中的资源提取出来,也可以在修改资源文件后重新打包...

  • Apktool 使用教程

    Apktool 是一个反编译Android Apk的第三方工具。它可以反编译资源,并在进行修改之后重新打包Apk。...

  • Android的多渠道打包|SquirrelNote

    系列文章:Android的反编译和代码混淆Android的打包签名[Android的多渠道打包 前言 本篇包括以下...

  • Android的反编译和代码混淆

    系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包 前言 包括以下内容 ...

  • Android的打包签名

    系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包 前言 从以下几个方面...

  • Android代码混淆使用手册

    目录 前言 一个发布后的apk可以通过反编译代码、反编译资源、重新打包后变成一个新的apk。使用代码混淆技术可以让...

网友评论

  • FlashXT:有两个地方需要注意:
    ①打包后,会生成两个文件夹,build和dist,打包好的apk文件在dist中;
    ②签名命令去掉 -tsa参数。
  • wu_wise:jarsigner -verbose -keystore test.keystore -signedjar test.apk test_unsign.apk test
  • 3d14cc9d7a4b:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件(.jks) -storepass 签名密码 待签名的APK文件(.apk) 签名的alias别名
  • ef727e3aaf69:请问,jarsigner 错误: java.lang.NullPointerException,这是啥问题..
    zeyio:@郭勃生 jarsigner -verbose -keystore test.keystore -signedjar test.apk test_unsign.apk test
    8ad67ef816c2:同样问题,你解决没有?
  • RWN4444:缺少apktool.yml 反编译后无法重新打包 怎么回事啊 大神
  • c8673b4a94ad:这个android逆向助手中的源文件和目标文件分别指什么?
  • 20e38ca6066f:怎么修改jar包里的文件啊
  • Physher:编辑jar包里边的class文件有啥好工具不?
  • imesong:如果apk的资源文件经过压缩混淆,再使用 apktool b 命令时会报错,这个可有遇到,有何解决方法?

本文标题:Android反编译后重新打包

本文链接:https://www.haomeiwen.com/subject/biywlttx.html