当前位置: 代码迷 >> Android >> Android应用程序破译(反编译)
  详细解决方案

Android应用程序破译(反编译)

热度:384   发布时间:2016-04-28 00:25:45.0
Android应用程序破解(反编译)
一、apktools进行反编译
1.首先安装需要JAVA环境(JDK和JRE)
    设置JAVA环境变量 
        CLASSPATH       %JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
        JAVA_HOME     C:\Program Files\Java\jdk1.8.0_20   
        Path    %JAVA_HOME%\bin;C:\Program Files\Java\jre1.8.0_20\bin
2.下载apktools并解压
(1)下载apktool_2.0.0rc4.jar和apktool-install-windows-r04-brut1.tar.bz2
    地址:http://code.google.com/p/android-apktool/downloads/list
(2)把两个文件都解压放在同一个目录,共三个文件
aapt.exe
apktool.bat
apktool.jar
其中,apktool.jar用于解包,apktool.jar和aapt.exe联合用于打包。
(3)点击开始菜单。运行,输入CMD回车,用cd命令转到刚刚解压apktool-install-windows所在的文件夹,输入apktool,出现一些命令说明即成功安装。当然,我们也可以将三个文件直接放在C盘的Windows目录,就可以直接使用apktool。

3.apktools使用方法
(1)反编译与打包命令
    反编译命令:usage: apktool d[ecode] [options] <file_apk>
                     -f,--force              Force delete destination directory.
                     -o,--output <dir>       The name of folder that gets written. Default is apk.ou 
                     -p,--frame-path <dir>   Uses framework files located in <dir>.
                     -r,--no-res             Do not decode resources.
                     -s,--no-src             Do not decode sources.
                     -t,--frame-tag <tag>    Uses framework files tagged by <tag>.
    打包命令:usage: apktool b[uild] [options] <app_path>
                     -f,--force-all          Skip changes detection and build all files.
                     -o,--output <dir>       The name of apk that gets written. Default is dist/name .apk
(2)将apk应用存放到当前目录(这里假设为D盘根目录),反编译

然后,在当前目录看到反编译的文件夹"2015"
二、apktools进行重新打包
    当我们对破解后的apk修改后,可以重新打包回APK文件,执行命令:apktool b <decode_dir>
,然后我们在当前目录下看到打包好的APK。由于apk还没有签名,一般是无法安装的。此时,可以通过keytool工具生成证书(.keystore文件),最后使用jarsigner工具对apk应用进行签名即可。
具体步骤如下
1.使用apktool重写打包成apk
      将破解后修改的应用源码重写打包回apk,主要使用aapt.exe 、apktool.jar  两个工具。需要注意的是,最好是从谷歌官方网站下载最新版的aapt.exe(也可从Android SDK的build-tools目录下拷贝)和apktool工具。

2.使用keytool工具生成签名证书
 keytool -genkey -v -keystore 2015.keystore-alias 2015.keystore -keyalg RSA -validity 20000
说明:
      1)keytool是工具名称,-genkey意味着执行的是生成数字证书操作,-v表示将生成证书的详细信息打印出来,显示在dos窗口中;
      2)-keystore 2015.keystore 表示生成的数字证书的文件名为“2015.keystore”;
      3)-alias 2015.keystore 表示证书的别名为“2015.keystore”,当然可以不和上面的文件名一样;
      4)-keyalg RSA 表示生成密钥文件所采用的算法为RSA;
      5)-validity 20000 表示该数字证书的有效期为20000天,意味着20000天之后该证书将失效
在执行上面的命令生成数字证书文件时,会提示你输入一些信息,包括证书的密码,示例如下:
      
注:执行命令成功,系统会在当前目录(C:\Users\jiangdongguo)生成一个"2015.keystore"的证书。
3.使用jarsigner工具为Android应用程序签名
      jarsigner -verbose -keystore 2015.keystore -signedjar2015_signed.apk 2015.apk 2015.keystore
说明:
      1)jarsigner是工具名称,-verbose表示将签名过程中的详细信息打印出来,显示在dos窗口中;
      2)-keystore 2015.keystore 表示签名所使用的数字证书所在位置,这里没有写路径,表示在当前目录下;
      3)-signedjar 2015_signed.apk 2015.apk 表示给notepad.apk文件签名,签名后的文件名称为2015_signed.apk;
      4)最后面的2015.keystore 表示证书的别名,对应于生成数字证书时-alias参数后面的名称
注释:
keytool工具:该工具位于jdk安装路径的bin目录下;
jarsigner工具:该工具位于jdk安装路径的bin目录下;

三、常见问题

1.关于安装和管理framework文件

    1. $ apktool d HtcContacts.apk
    2. I: Loading resource table...
    3. I: Decoding resources...
    4. I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
    5. W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable, value=0x02020542
    6. ...
    7. W: Could not decode attr value, using undecoded value instead: ns=android, name=icon, value=0x02020520
    8. Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
...
...
...
W: Could not decode attr value, using undecoded value instead: ns=android, name=hardwareAccelerated, value=0xffffffff
...

原因:C:\Users\jiangdongguo\apktool\framework\1.apk版本过低。在使用apktool进行反编译前不需要做其他的事情,然而由于有的厂商,如HTC,三星等,他们定制了framework文件并且在他们的系统应用中使用了这些文件,为了能正常的反编译这些apk文件,你就必须从你的设备中拷贝出framework文件并且安装到apktool中。

解决方案


这里假设framwork-res.apk文件都放在d盘根目录

2.出现public.xml资源没有定义错误


原因:

其实在编译过程中会遇到很多其他的问题,大多数是由于删除、修改、添加了资源后,没有对应的修改res\values\public.xml文件而造成的。

解决方案

(1)public.xml文件中的资源不能重复定义。

(2)public.xml文件中的任意两个资源的ID不能一样

(3)public.xml文件中定义的资源必须能找到该文件(如果你删除了一些文件,必须要对应的删除public.xml中的该行)

(4)public.xml文件中尽可能全面(如果你添加了某资源,最好确保在public.xml中也添加)

(5)public.xml文件中的资源的ID尽可能连续(当你为添加的文件添加声明时,赋予的ID尽可能是连续的)

总结:很多时候都是因为apktool版本过低导致的错误,为此我们需要去谷歌官网下载最新版的apktool和aapt.exe工具,然后直接放在系统盘(C)的Windows目录下即可。

参考:
http://blog.csdn.net/lyq8479/article/details/6401093
http://www.cnblogs.com/CuriosityWzk/archive/2012/01/06/2315150.html
  相关解决方案