/ 学习笔记 / 38浏览

安卓APP渗透基础 —— APK文件结构

文章目录
  • apk文件
  • res目录
  • resources.arsc文件
  • assets目录
  • lib目录
  • META-INF目录
  • AndroidManifest.xml文件
  • classes.dex文件
  • apk文件

    在安卓平台APP渗透测试中,了解apk文件的结构是基础且重要的一步。apk文件,即Android Package Kit,是安卓平台应用程序的安装包文件。apk文件实际上是一个标准的zip格式压缩包,通过解压该压缩包,我们可以获得其内部的文件结构。这些文件结构包括应用程序的源代码、资源文件、库文件、配置文件等,它们共同构成了完整的安卓应用程序。

    res目录

    res目录是apk文件中用于存放资源文件的关键部分。这些资源文件包括但不限于动画资源(anim)、图形资源(drawable)、布局资源(layout)等。这些资源文件通过唯一的资源ID进行标识和访问,使得在应用程序中可以方便地引用这些资源。

    • anim:存放了应用程序中使用的动画资源,如淡入淡出、滑动等效果。
    • drawable:包含了应用程序中使用的图形资源,如图片、图标等。这些资源可以根据不同的屏幕密度和分辨率进行适配。
    • layout:存放了应用程序的界面布局文件,描述了用户界面上各个元素的位置和属性。

    resources.arsc文件

    resources.arsc文件是apk文件中的一个二进制文件,它用于记录资源ID和资源实体之间的映射关系。在程序运行时,系统会根据资源ID来查找对应的资源文件路径,而resources.arsc文件就提供了这一映射关系。因此,在代码中使用资源文件时,只需要传入资源ID即可。resources.arsc文件的存在使得应用程序能够高效地管理和访问资源文件。

    assets目录

    assets目录用于存放除资源文件之外的其它文件。这些文件可能是应用程序所需的文本文件、数据文件、音频文件等。与res目录中的资源文件不同,assets目录中的文件在访问时需要使用AssetManager类。AssetManager类提供了一组方法来访问和加载assets目录中的文件,使得应用程序可以方便地读取和使用这些文件。

    常见文件类型

    • 静态资源文件:如图片(jpg、png、gif等)、音频文件(mp3、wav等)、视频文件(mp4、avi等)、文本文件(txt、json、xml等)。这些文件在编译时会被原封不动地打包进APK文件中,不经过任何编译处理,保持原始文件的格式和结构不变。
    • HTML、CSS、JavaScript等网页文件:assets目录可以存放静态网页资源,通过WebView组件可以在应用程序中加载和显示这些本地网页内容,实现离线浏览或加载本地网页的功能。
    • 配置文件:如数据库初始化脚本、应用配置参数等。这些文件可以在应用程序启动时读取,用于初始化应用程序的运行环境或配置参数。
    • 第三方库资源文件:有些第三方库可能需要将特定的资源文件放置在assets目录下,以便应用程序运行时能够访问和使用这些资源。

    lib目录

    lib目录下主要包含的是与特定硬件架构相关的本地库文件,这些文件通常以.so(Shared Object,共享对象)扩展名结尾,是由C或C++等语言编译而成的动态链接库(Dynamic Link Library,简称DLL)。

    lib目录下会根据不同的CPU架构包含多个子目录,如armeabi-v7a/arm64-v8a/x86/等,每个子目录中存放着对应架构的.so文件。这些库文件被编译成适用于特定CPU架构的二进制代码,以提供高性能的本地方法实现。

    META-INF目录

    META-INF目录保存了应用程序的签名信息,用于验证apk文件的完整性。该目录下包含的文件如CERT.RSA、CERT.SF和MANIFEST.MF等,记录了apk中文件的哈希值和其他相关信息。签名机制有助于确保apk文件在传输和安装过程中不被篡改,从而保障应用程序的安全性和完整性。当应用程序被安装时,系统会验证META-INF目录下的签名信息,以确保apk文件的完整性和安全性。

    APK包的META-INF目录下主要包含以下文件:

    1. MANIFEST.MF
      • 作用:MANIFEST.MF是一个摘要文件,它记录了APK包中所有非文件夹、非签名文件的哈希摘要信息。这些摘要信息是通过SHA-1或SHA-256等哈希算法生成的,并用Base64进行编码。当APK包中的文件被修改时,重新计算得到的摘要信息会与MANIFEST.MF中的记录不一致,从而在安装校验时被发现,确保APK包的完整性。
    2. CERT.SF
      • 作用:CERT.SF是一个对摘要文件的签名文件,它包含了MANIFEST.MF文件中各个文件的摘要信息的签名。这个签名是通过SHA1-RSA算法使用开发者的私钥生成的。在安装时,只有使用公共密钥才能对CERT.SF文件进行解密,并将解密后的摘要信息与MANIFEST.MF文件中的未加密摘要信息进行比对,以验证文件的完整性和未被篡改。
    3. CERT.RSA
      • 作用:CERT.RSA文件包含了公钥信息、加密算法信息以及开发者证书等。它用于在安装时验证CERT.SF文件的签名是否有效,从而确保APK包确实是由持有相应私钥的开发者签名的。这进一步增强了APK包的安全性和来源可靠性。
    4. 其他可能存在的文件(根据具体情况而定)
      • INDEX.LIST:在某些情况下,为了提高内容检索效率,META-INF目录中还可能包含一个名为INDEX.LIST的简单文本文件,用于存储目录信息。不过,这个文件并不是所有APK包中都会存在的。

    AndroidManifest.xml文件

    AndroidManifest.xml是apk的配置文件,它描述了应用程序的整体信息。该文件包含了应用程序的包名、权限、组件等详细信息,是Android系统了解apk应用程序的“自我介绍”文件。每个Android应用程序都必须包含AndroidManifest.xml文件,并且文件名是固定的。AndroidManifest.xml文件的内容决定了应用程序的权限、组件注册、意图过滤等关键功能,是安卓应用程序开发中不可或缺的部分。

    AndroidManifest.xml文件的基本结构大致如下:

    <?xml version="1.0" encoding="utf-8"?>  
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="com.example.myapp"  
        android:versionCode="1"  
        android:versionName="1.0" >  
      
        <uses-permission android:name="android.permission.INTERNET" />  
        <!-- 其他权限声明 -->  
      
        <application  
            android:icon="@drawable/ic_launcher"  
            android:label="@string/app_name"  
            android:theme="@style/AppTheme" >  
              
            <activity  
                android:name=".MainActivity"  
                android:label="@string/title_activity_main" >  
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />  
      
                    <category android:name="android.intent.category.LAUNCHER" />  
                </intent-filter>  
            </activity>  
            <!-- 其他组件声明 -->  
      
            <receiver android:name=".MyBroadcastReceiver">  
                <intent-filter>  
                    <!-- 广播接收器意图过滤器 -->  
                </intent-filter>  
            </receiver>  
      
            <service android:name=".MyService" />  
      
            <provider android:name=".MyContentProvider"  
                android:authorities="com.example.myapp.provider" />  
      
            <!-- 其他应用级声明 -->  
      
        </application>  
      
        <!-- 其他全局声明 -->  
      
    </manifest>

    classes.dex文件

    classes.dex文件是apk文件中包含应用程序字节码的文件。在Android应用打包过程中,通过Android SDK中的dx工具将Java字节码转换为Dalvik字节码(Dalvik虚拟机执行的字节码)。dex文件经过优化后,体积更小、运行效率更高。Dalvik字节码是专门为Android平台设计的,具有高效性、安全性和兼容性的特点。通过解析和执行dex文件中的字节码,Android系统能够加载和运行应用程序的代码。

    Linux系统用户最小化检测方法
    企业采购模式扫盲
    安卓APP渗透基础 —— APK安装包的签名机制
    安卓APP渗透基础 —— 四大组件暴露测试
    《CCNA认证指南》“IP地址”知识点整理
    总线安全 —— CAN协议和CAN FD协议对比

    0

    1. This post has no comment yet

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注