关于ipa和apk文件的解压 - On1Key

时间:2024-02-29 21:08:36

关于ipa和apk文件的解压

移动互联网中,主要的两个平台是Android和ios,android上文件的安装包是后缀名为apk的文件,ios上文件的安装包是后缀名为ipa的文件,在本文分析一下这两种文件的特点,以及如何用程序去解析这些安装包的资源。

 

1.    android的apk文件

 

(1) apk文件的结构

 

apk文件其实是zip格式,但后缀名被修改为apk,所以,把apk的文件后缀改为zip后,就能用压缩软件打开安装包。

打开apk文件后,可看到如下的文件结构,如图1:

 

 

                         图1

META-INF目录:存放的是签名信息,用来保证apk包的完整性和系统的安全。

 lib目录:子目录armeabi存放的是一些so文件。

 assets目录:存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。

 res目录:放资源文件。包括图片,字符串等等。

 AndroidManifest.xml:该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息。

 classes.dex:java源码编译后生成的java字节码文件(首先是java文件通过jdk编译成字节码文件然后经过dex编译成classes.dex)。

 resources.arsc:编译后的二进制资源文件的索引(apk文件的资源表(索引))

 

(2) 如何获取apk文件的基本信息

 

要获取apk文件的基本信息(例如图标,应用名称,版本),可以使用android-apktool(我已打包上传到http://download.csdn.net/detail/newjueqi/7713025), 把里面的所有文件复制到/usr/local/bin/ 目录后,用如下命令就能获取apk的文件信息。

 
  1. /usr/bin/sudo/usr/local/bin/aapt dump badging apk文件路径  

执行的例子如图2:

 

 

                                                                           图2


从上面红框的三行,就能获取apk的版本号,名称,图标。

 

2.    ios的ipa文件

(1) ipa文件架构

 

ipa文件其实也是一个zip文件,把ipa后缀名改为zip后,就能把它打开,打开后首先看的是”payload”文件夹,进入”payload”文件夹就是”应用名.app”文件夹,进入这个文件夹后就是资源的位置。

 

         资源的例子,如图3所示:

 

 

 

_CodeSignature:文件的签名。

 Info.plist: 被加密过的文件,应用名,版本,图标等信息都包含在这个文件中。

 icon2.png,icon.png:不同尺寸的图标文件,也是被加密过的。

 

(2) 如何获取ipa文件的信息

 

在(1) 中已经提过了,ipa文件的信息是保存在Info.plist,用开源工具(https://github.com/rodneyrehm/CFPropertyList)就能把里面的内容解密。

 简单的用法如下:

 
  1. require_once(__DIR__.\'/../classes/CFPropertyList/CFPropertyList.php\');  
  2.    
  3. $content =file_get_contents("/tmp/Info.plist");  
  4. $plist = new CFPropertyList();  
  5. $plist->parse($content);  
  6. var_dump( $plist->toArray() );  

 

 $plist这个数组的信息如下:

 
  1.    
  2. array(29) {  
  3.  \'CFBundleName\' =>  
  4.  string(12) "DataDemo"  
  5.  \'DTXcode\' =>  
  6.  string(4) "0511"  
  7.  \'DTSDKName\' =>  
  8.  string(11) "iphoneos7.1"  
  9.  \'DTSDKBuild\' =>  
  10.  string(6) "11D167"  
  11.  \'CFBundleDevelopmentRegion\' =>  
  12.  string(2) "en"  
  13.  \'CFBundleVersion\' =>   //版本号  
  14.  string(3) "2.0"  
  15.  .........  
  16.   \'CFBundleDisplayName\' => //应用名称  
  17.  string(12) "DataDemo"  
  18.  .........  
  19.  array(1) {  
  20.    \'CFBundlePrimaryIcon\' =>  
  21.    array(1) {  
  22.      \'CFBundleIconFiles\' =>  //图标文件  
  23.      array(2) {  
  24.        [0] =>  
  25.        string(5) "icon2"  
  26.        [1] =>  
  27.        string(4) "icon"  
  28.      }  
  29. }  


在这个数组中,关键的部分如下:

 

\'CFBundleVersion\':版本号

\'CFBundleDisplayName\':应用名称

\'CFBundlePrimaryIcon\'->\'CFBundleIconFiles\':图标文件

 根据这里的图标名称,在ipa文件中找到加密过的图标文件。使用开源工具(https://github.com/pcans/PngCompote),就能把加密过的图标文件还原。

 Pngcompote的用法:

 
    1. require_once \'pngCompote.php\';  
    2. $filename = \'Lenna.crush.png\'; //需要解密的文件路径  
    3. $newFilename = \'Lenna.compote.png\'; //解密后的文件路径  
    4.    
    5. $png = new PngFile($filename);  
    6. if ($png->revertIphone($newFilename)) {  
    7.        echo \'cleaning done!\'.PHP_EOL;  
    8.        echo \'<img src="\'.$newFilename.\'"/>\'.PHP_EOL;  
    9. }  

链接:

如何获取app(apk和ipa)中的资源

提取MacOSX/iOS应用图标的6种技巧

APK文件结构和安装过程