Android反编译后重新打包
在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文件
补充:
Smali2JavaUI
对于博主说得,先dex2jar把classes.dex转为jar,再jd-gui把jar转为源码*.java文件。
现在可以用Smali2JavaUI这个软件,一部到位。可以把这两个步骤化为一个步骤。所以,如果只想反编译看*.java文件的话,只用Smali2JavaUI软件就可以了。
这个软件可以直接打开***.apk文件,然后就直接看到*.java文件了。
Smali2JavaUI最新版本下载链接http://www.hensence.com/cn/smali2java/#Download
---------------------
作者:吾ha
来源:****
原文:https://blog.****.net/ysc123shift/article/details/52985435
版权声明:本文为博主原创文章,转载请附上博文链接!
然后就兴冲冲地直接去安装了,然而~
看来果然没这么简单就能呢个搞定,继续排查原因。
找原因
看看apk文件中有什么可疑对象导致了安装失败,果然除了dex和资源文件以外,还发现了三个文件
原来是apk包本身的防篡改机制导致的
打开文件来一探究竟,果然里面都是对打包时对文件进行了标识记录,看来这是避免文件被篡改的安全机制。
Paste_Image.png
找到问题原因就来解决,嘿咻嘿咻
想想既然是这些文件导致的,那先试试简单粗暴地直接把文件删了,避免防篡改检查
Paste_Image.png
然而,这样的是不行的,必须要有这个文件夹才能解析apk包,可能这些相当于是读取安装文件列表清单,必须具有,看来此路不通,
Paste_Image.png
既然原来的清单内容对不上,但又不能不提供,那能不能我们给它配一个新的?
想到这里,感觉可以动手试试,嘿咻嘿咻~
这些文件既然是在编译打包成apk时期自动生成的,那要想再生成一份新的,所以应该重新打包就可以。可是这个本身已经就是apk文件了,怎么再编译打包?
停下来想了想,对啊,突然想起来可以给包签个名呗,打签名应该也会有同样的效果才对,继续嘿咻嘿咻。
找个工具来签名吧,用自己的去签名留下点什么不良记录就不好了,嘿嘿~
Paste_Image.png
签名成功后
成功安装,**完成
补充:
1、生成keystore文件
keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore,执行该命令会生成一个abc.keystore证书文件。
2、对重打包之后的apk进行签名
将dist目录下的apk拷贝到d:\apktool目录,执行下面命令
jarsigner -verbose -keystore abc.keystore -signedjar calendar_signed.apk calendar.apk abc.keystore
执行之后会发现,在当前目录下生成一个calendar_signed.apk,该apk已经签名了,就可以正常使用了。
---------------------
作者:dmfrm
来源:****
原文:https://blog.****.net/u010889616/article/details/78198822
版权声明:本文为博主原创文章,转载请附上博文链接!
转自:https://www.cnblogs.com/yanzheng216/articles/6378843.html