Android反编译学习总结

来源:互联网 发布:怎么样给数据库加锁 编辑:程序博客网 时间:2024/06/15 11:05
工具介绍:

apktool  

     作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看

dex2jar

     作用:将apk反编译成java源码(classes.dex转化成jar文件)

jd-gui

    作用:查看APK中classes.dex转化成出的jar文件,即源码文件
======================================================================================

工具下载地址:
http://download.csdn.net/download/shehuan320_/9551427




反编译流程:

一、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件

1.下载上述工具中的apktool,解压得到2个文件:apktool.batapktool.jar ,将需要反编译的APK文件放到该目录下,

2.打开命令行界面(运行-CMD) ,输入一下命令:cd+空格+该文件夹路径  定位到apktool文件夹,

3.输入ApkTool命令:
1.decode(解码)

该命令用于进行反编译apk文件,一般用法为

apktool d <file.apk> <dir>

<file.apk>代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk

<dir>代表了反编译后的文件的存储位置,比如C:\MusicPlayer

如果你给定的<dir>已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令

apktool d –f <file.apk> <dir>

这样就会强行覆盖已经存在的文件
2.build(构建 用于回编)

该命令用于编译修改好的文件,一般用法为

<strong><span style="color:#ff0000;">apktool b <dir></span></strong>

这里的<dir>就是刚才你反编译时输入的<dir>(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist(存放着回编后的apk文件),其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
APKTOOL的使用心得参考地址:http://www.cnblogs.com/CuriosityWzk/archive/2012/01/06/2315150.html

二、Apk反编译得到Java源代码

下载上述工具中的dex2jarjd-gui 解压
1.将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-2.0文件夹内,

2.在命令行下定位到d2j-dex2jar.bat所在目录,输入d2j-dex2jar.bat classes.dex,生成classes-dex2jar.jar文件。

3.在改目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了

==================================================================================================


三、生成签名
注:回编后需要替换签名才能不会安装失败
步骤:
利用标准的java工具keytool.exe(位于jdk\jre\bin目录下)创建key,利用jarsigner.exe工具使用生成的key来生成证书和给程序签名(位于jdk\bin目录下)。
Win +R 运行cmd,进入目录D:\temp(注:使用该目录为示例工作目录)

1.生成签名证书,运行如下命令
keytool -genkey -alias demo.keystore -keyalg RSA-validity 20000 -keystoredemo.keystore
/*说明:keytool工具是Java JDK自带的证书工具
-genkey参数表示:要生成一个证书(版权、身份识别的安全证书)
-alias参数表示:证书有别名,-alias demo.keystore表示证书别名为:demo
-keyalg RSA表示加密类型,RSA表示需要加密,以防止别人盗取
-validity 20000表示有效时间20000天( K3
-keystore demo.keystore表示要生成的证书名称为demo
*/

2.删除之前的签名文件
用解压缩工具解打开apk文件(如:更改a.apk 为a.zip,便可用压缩工具打开,并找到下面的目录META-INF下的 CERT.RSA和CERT.SF文件,并删除该文件。删除后,再次更改后缀名为.apk ;
注:
META-INF目录:存放签名后的CERT和MANIFEST文件,用于识别软件的签名及版权。
Rres目录:存放各种Android原始资源,包括:动画anim、图片drawable、布局layout、menu菜单、xml等等
AndroidManifest.xml编码后的Android项目描述文件,包括了Android项目的名称、版本、权限、程序组件描述等等
aclasses.dex编译后Class被dx程序转换成Dalvik虚拟机的可执行字节码文件
qresources.arsc所有文本资源的编译产物,里面包含了各Location对应的字符串资源。

3.使用生成的key对apk签名,运行如下命令:
 jarsigner -verbose -keystoredemo.keystore -signedjar demo_signed.apk demo.apk demo.keystore
/*说明:jarsigner是Java的签名工具
-verbose参数表示:显示出签名详细信息
-keystore表示:使用当前目录中的demo.keystore签名证书文件。
-signedjar demor_signed.apk demo.apk demo.keystore 正式签名,三个参数中依次为签名后产生的文件demo_signed,要签名的文件demo.apk和密钥库demo.keystore.
*/
(注:查看某个apk是否经过了签名方法,jarsigner –verify demo.apk。优化:签名后需要做对齐优化处理zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk )

将apk文件复制到signapk.jar的同文件夹里,执行java –jar signapk.jar platform.x509.pem platform.pk8 test.apk test_new.apk


Android apk二次打包,重新签名参考地址:http://tjlibaoh.blog.163.com/blog/static/21122641320141119512171/
==============================================================================
四、安装测试
需要先把原来应用删除
再把二次打包后的apk安装上手机

常见问题

Q:android 签名包安装失败怎么办

A:
在签名时,要加上2个参数:

-digestalg SHA1 -sigalg MD5withRSA
造成无法签名错误的原因,初步估计是JDK版本的问题。JDK 1.6签名没事,但是1.7会出这个问题。
完整的签名命令如下:

jarsigner -verbose -keystore feelyou.keystore -storepass feelyou.info -signedjar signed.apk -digestalg SHA1 -sigalg MD5withRSA unsigned.apk feelyou
解释:
1、-keystore feelyou.keystore:指定需要使用的签名文件,直接写文件名说明在当前目录下,否则请自行指定具体路径
2、-storepass feelyou.info:自动输入密码,keystore的密码和alias的密码都是我用的都是feelyou.info
3、-signedjar signed.apk:指定签名后的文件存储路径,这里是说以signed.apk的文件名存在当前路径下
4、-digestalg SHA1 -sigalg MD5withRSA:这就是必须加上的参数,如果你是jdk 1.6也不受影响
5、unsigned.apk:未签名的apk路径,这里是当前路径下的unsigned.apk文件
6、feelyou:最后这个是alias
















0 0
原创粉丝点击