悟夜叉个人博客 技术专题 APK的基本结构与简易修改概述

APK的基本结构与简易修改概述

很多朋友问我,安卓逆向好入门吗?只能这样告诉你:坑多、内容杂、容易半途而废。有些坑是可以通过百度搜索到答案的,有些坑是必须技术水平达到一定程度才能越过的,有些坑是无解的。100个人一起学习安卓逆向,最终能够坚持并有成果的,恐怕只有不到5个人。

身边太多在学习安卓逆向的过程中放弃的,或者只学到了皮毛。不管是学习安卓逆向、渗透还是其他的,如果没有基础的朋友千万不要跳着看网上的教学视频。我就是前车之鉴,因为有编程基础所以很多内容都是跳着学,但是坑还是太多了。我可以复刻视频上的操作,却无法将操作复刻到其他APK中。

那么废话不多说,这篇主要是教大家APK基础知识,了解APK包的基础结构、APP多开原理、简易修改APK信息等内容。本节课用到的工具我都已经打包好了,大家可以按需下载(下载链接在文章结尾)。

正片开始!

APK 的全称是Android Package,它相当于一个压缩文件,大多数压缩软件(7z、好压)都可以直接解压:

文件注释
assets目录存放APK的静态资源文件,比如视频,音频,图片等
lib 目录armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件
META-INF目录保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改)
res目录res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计
AndroidManifest.xml文件APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息
classes.dex文件classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑
resources.arsc文件resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源

assets目录 存放的都是一些静态文件,比如图片、音视频等等。

lib 目录 用来存放应用程序所依赖的native库文件,native库一般是用C/C++进行编写的,这里的lib库可能包含4种不同类型,根据CPU型号的不同,我们大体可以分为ARM,ARM-v7a,MIPS,X86,分别对应着ARM架构,ARM-V7架构,MIPS架构和X86架构。

其中,不同的CPU架构对应着不同的目录,每个目录中可以存放非常多的对应版本的so库,而且这个目录的结构固定,用户只能按照这个目录来存放自己的so库。目前市场上使用的移动终端大多是基于ARM或者ARM-v7a架构的。从厂家上来分是有三种,arm,x86,MIPS,arm 系列是绝大多数手机上使用的,x86 主要是运用在平板上,而 MIPS ,我基本上就没见过。

META-INF目录 保存应用程序的签名信息,签名信息可以验证APK文件的完整性。什么是签名呢?在android系统中,不同App之间是依靠包名、数字签名共同来进行区分的。虽然Google建议我们用自己的域名的反写作为包名的前缀来定义包名(例如com.google.),但是这并不能做到万无一失,我们不能单单利用包名来区分apk,所以提出了签名的概念。顾名思义,就是在apk上打上作者的烙印。

AndroidManifest.xml文件 他是用来告诉android系统,这里面有关于APP的配置信息,你需要根据里面的设置的配置信息来运行这个app。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且文件名不能修改。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="webapp.wawagongju" platformBuildVersionCode="30" platformBuildVersionName="S" android:versionCode="9" android:versionName="5.6" android:compileSdkVersion="30" android:compileSdkVersionCodename="S">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:theme="@style/Theme.WebApp" android:label="蛙蛙工具" android:icon="@drawable/icon" android:supportsRtl="true" android:usesCleartextTraffic="true" android:appComponentFactory="androidx.core.app.CoreComponentFactory">
        <activity android:name="p063cn.woobx.webapp.WebAppMainActivity" android:configChanges="keyboardHidden|orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

package:指一个APP的包名,它也是一个应用进程的默认名称;

versionName:APP的版本号,如果微信是7.0,那么这个字段值就是7.0;

<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.somnus.yunyi"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource"
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>

android:allowClearUserData:用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然;

android:hasCode:表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码;

<application  android:allowClearUserData=["true" | "false"]
             android:icon="drawable resource"
             android:killAfterRestore=["true" | "false"]
             android:label="string resource"
             android:manageSpaceActivity="string"
             android:name="string"
             android:allowTaskReparenting=["true" | "false"]
             android:backupAgent="string"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:hasCode=["true" | "false"]
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:taskAffinity="string"
             android:theme="resource or theme" >
</application>

android:permission:属于最重要的一部分了,开发者可以声明一个可以被用来限制应用自身或者其他应用访问某些组件或者功能的安全权限。举个例子,可以设置一个“获取通讯录列表”的权限,如果你同意你的通讯录就被上传到服务器上了。

android.permission.ACCESS_CHECKIN_PROPERTIES
允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded)

android.permission.ACCESS_COARSE_LOCATION
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location)

android.permission.ACCESS_FINE_LOCATION
允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location)

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands)

android.permission.ACCESS_MOCK_LOCATION
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing)

android.permission.ACCESS_NETWORK_STATE
允许程序访问有关GSM网络信息(Allows applications to access information about networks)

android.permission.ACCESS_SURFACE_FLINGER
允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features)

android.permission.ACCESS_WIFI_STATE
允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks)

android.permission.ADD_SYSTEM_SERVICE
允许程序发布系统级服务(Allows an application to publish system-level services).

android.permission.BATTERY_STATS
允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics)

android.permission.BLUETOOTH
允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices)

android.permission.BLUETOOTH_ADMIN
允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices)

android.permission.BRICK
请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).)

android.permission.BROADCAST_PACKAGE_REMOVED
允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed)

android.permission.BROADCAST_STICKY
允许一个程序广播常用intents(Allows an application to broadcast sticky intents)

android.permission.CALL_PHONE
允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认(Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call being placed.)

android.permission.CALL_PRIVILEGED
允许一个程序拨打任何号码,包含紧急号码无需通过拨号用户界面需要用户确认(Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed)

android.permission.CAMERA
请求访问使用照相设备(Required to be able to access the camera device. )

android.permission.CHANGE_COMPONENT_ENABLED_STATE
允许一个程序是否改变一个组件或其他的启用或禁用(Allows an application to change whether an application component (other than its own) is enabled or not. )

android.permission.CHANGE_CONFIGURATION
允许一个程序修改当前设置,如本地化(Allows an application to modify the current configuration, such as locale. )

android.permission.CHANGE_NETWORK_STATE
允许程序改变网络连接状态(Allows applications to change network connectivity state)

android.permission.CHANGE_WIFI_STATE
允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state)

android.permission.CLEAR_APP_CACHE
允许一个程序清楚缓存从所有安装的程序在设备中(Allows an application to clear the caches of all installed applications on the device. )

android.permission.CLEAR_APP_USER_DATA
允许一个程序清除用户设置(Allows an application to clear user data)

android.permission.CONTROL_LOCATION_UPDATES
允许启用禁止位置更新提示从无线模块(Allows enabling/disabling location update notifications from the radio. )

android.permission.DELETE_CACHE_FILES
允许程序删除缓存文件(Allows an application to delete cache files)

android.permission.DELETE_PACKAGES
允许一个程序删除包(Allows an application to delete packages)

android.permission.DEVICE_POWER
允许访问底层电源管理(Allows low-level access to power management)

android.permission.DIAGNOSTIC
允许程序RW诊断资源(Allows applications to RW to diagnostic resources. )

android.permission.DISABLE_KEYGUARD
允许程序禁用键盘锁(Allows applications to disable the keyguard )

android.permission.DUMP
允许程序返回状态抓取信息从系统服务(Allows an application to retrieve state dump information from system services.)

android.permission.EXPAND_STATUS_BAR
允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序(Allows an application to expand or collapse the status bar. )

android.permission.FACTORY_TEST
作为一个工厂测试程序,运行在root用户(Run as a manufacturer test application, running as the root user. )

android.permission.FLASHLIGHT
访问闪光灯,android开发网提示HTC Dream不包含闪光灯(Allows access to the flashlight )

android.permission.FORCE_BACK
允许程序强行一个后退操作是否在顶层activities(Allows an application to force a BACK operation on whatever is the top activity. )

android.permission.FOTA_UPDATE
暂时不了解这是做什么使用的,android开发网分析可能是一个预留权限.

android.permission.GET_ACCOUNTS
访问一个帐户列表在Accounts Service中(Allows access to the list of accounts in the Accounts Service)

android.permission.GET_PACKAGE_SIZE
允许一个程序获取任何package占用空间容量(Allows an application to find out the space used by any package. )

android.permission.GET_TASKS
允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等(Allows an application to get information about the currently or recently running tasks: a thumbnail representation of the tasks, what activities are running in it, etc.)

android.permission.HARDWARE_TEST
允许访问硬件(Allows access to hardware peripherals. )

android.permission.INJECT_EVENTS
允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流,android 开发网提醒算是hook技术吧(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window.)

android.permission.INSTALL_PACKAGES
允许一个程序安装packages(Allows an application to install packages. )

android.permission.INTERNAL_SYSTEM_WINDOW
允许打开窗口使用系统用户界面(Allows an application to open windows that are for use by parts of the system user interface. )

android.permission.INTERNET
允许程序打开网络套接字(Allows applications to open network sockets)

android.permission.MANAGE_APP_TOKENS
允许程序管理(创建、催后、 z- order默认向z轴推移)程序引用在窗口管理器中(Allows an application to manage (create, destroy, Z-order) application tokens in the window manager. )

android.permission.MASTER_CLEAR目前还没有明确的解释,android开发网分析可能是清除一切数据,类似硬格机

android.permission.MODIFY_AUDIO_SETTINGS
允许程序修改全局音频设置(Allows an application to modify global audio settings)

android.permission.MODIFY_PHONE_STATE
允许修改话机状态,如电源,人机接口等(Allows modification of the telephony state – power on, mmi, etc. )

android.permission.MOUNT_UNMOUNT_FILESYSTEMS
允许挂载和反挂载文件系统可移动存储(Allows mounting and unmounting file systems for removable storage. )

android.permission.PERSISTENT_ACTIVITY
允许一个程序设置他的activities显示(Allow an application to make its activities persistent. )

android.permission.PROCESS_OUTGOING_CALLS
允许程序监视、修改有关播出电话(Allows an application to monitor, modify, or abort outgoing calls)

android.permission.READ_CALENDAR
允许程序读取用户日历数据(Allows an application to read the user’s calendar data.)

android.permission.READ_CONTACTS
允许程序读取用户联系人数据(Allows an application to read the user’s contacts data.)

android.permission.READ_FRAME_BUFFER
允许程序屏幕波或和更多常规的访问帧缓冲数据(Allows an application to take screen shots and more generally get access to the frame buffer data)

android.permission.READ_INPUT_STATE
允许程序返回当前按键状态(Allows an application to retrieve the current state of keys and switches. )

android.permission.READ_LOGS
允许程序读取底层系统日志文件(Allows an application to read the low-level system log files. )

android.permission.READ_OWNER_DATA
允许程序读取所有者数据(Allows an application to read the owner’s data)

android.permission.READ_SMS
允许程序读取短信息(Allows an application to read SMS messages.)

android.permission.READ_SYNC_SETTINGS
允许程序读取同步设置(Allows applications to read the sync settings)

android.permission.READ_SYNC_STATS
允许程序读取同步状态(Allows applications to read the sync stats)

android.permission.REBOOT
请求能够重新启动设备(Required to be able to reboot the device. )

android.permission.RECEIVE_BOOT_COMPLETED
允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动(Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. )

android.permission.RECEIVE_MMS
允许一个程序监控将收到MMS彩信,记录或处理(Allows an application to monitor incoming MMS messages, to record or perform processing on them. )

android.permission.RECEIVE_SMS
允许程序监控一个将收到短信息,记录或处理(Allows an application to monitor incoming SMS messages, to record or perform processing on them.)

android.permission.RECEIVE_WAP_PUSH
允许程序监控将收到WAP PUSH信息(Allows an application to monitor incoming WAP push messages. )

android.permission.RECORD_AUDIO
允许程序录制音频(Allows an application to record audio)

android.permission.REORDER_TASKS
允许程序改变Z轴排列任务(Allows an application to change the Z-order of tasks)

android.permission.RESTART_PACKAGES
允许程序重新启动其他程序(Allows an application to restart other applications)

android.permission.SEND_SMS
允许程序发送SMS短信(Allows an application to send SMS messages)

android.permission.SET_ACTIVITY_WATCHER
允许程序监控或控制activities已经启动全局系统中Allows an application to watch and control how activities are started globally in the system.

android.permission.SET_ALWAYS_FINISH
允许程序控制是否活动间接完成在处于后台时Allows an application to control whether activities are immediately finished when put in the background.

android.permission.SET_ANIMATION_SCALE
修改全局信息比例(Modify the global animation scaling factor.)

android.permission.SET_DEBUG_APP
配置一个程序用于调试(Configure an application for debugging.)

android.permission.SET_ORIENTATION
允许底层访问设置屏幕方向和实际旋转(Allows low-level access to setting the orientation (actually rotation) of the screen.)

android.permission.SET_PREFERRED_APPLICATIONS
允许一个程序修改列表参数PackageManager.addPackageToPreferred() 和PackageManager.removePackageFromPreferred()方法(Allows an application to modify the list of preferred applications with the PackageManager.addPackageToPreferred() and PackageManager.removePackageFromPreferred() methods.)

android.permission.SET_PROCESS_FOREGROUND
允许程序当前运行程序强行到前台(Allows an application to force any currently running process to be in the foreground.)

android.permission.SET_PROCESS_LIMIT
允许设置最大的运行进程数量(Allows an application to set the maximum number of (not needed) application processes that can be running. )

android.permission.SET_TIME_ZONE
允许程序设置时间区域(Allows applications to set the system time zone)

android.permission.SET_WALLPAPER
允许程序设置壁纸(Allows applications to set the wallpaper )

android.permission.SET_WALLPAPER_HINTS
允许程序设置壁纸hits(Allows applications to set the wallpaper hints)

android.permission.SIGNAL_PERSISTENT_PROCESSES
允许程序请求发送信号到所有显示的进程中(Allow an application to request that a signal be sent to all persistent processes)

android.permission.STATUS_BAR
允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons.

android.permission.SUBSCRIBED_FEEDS_READ
允许一个程序访问订阅RSS Feed内容提供(Allows an application to allow access the subscribed feeds ContentProvider. )

android.permission.SUBSCRIBED_FEEDS_WRITE
系统暂时保留改设置,android开发网认为未来版本会加入该功能。

android.permission.SYSTEM_ALERT_WINDOW
允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )

android.permission.VIBRATE
允许访问振动设备(Allows access to the vibrator)

android.permission.WAKE_LOCK
允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失( Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming)

android.permission.WRITE_APN_SETTINGS
允许程序写入API设置(Allows applications to write the apn settings)

android.permission.WRITE_CALENDAR
允许一个程序写入但不读取用户日历数据(Allows an application to write (but not read) the user’s calendar data. )

android.permission.WRITE_CONTACTS
允许程序写入但不读取用户联系人数据(Allows an application to write (but not read) the user’s contacts data. )

android.permission.WRITE_GSERVICES
允许程序修改Google服务地图(Allows an application to modify the Google service map. )

android.permission.WRITE_OWNER_DATA
允许一个程序写入但不读取所有者数据(Allows an application to write (but not read) the owner’s data.)

android.permission.WRITE_SETTINGS
允许程序读取或写入系统设置(Allows an application to read or write the system settings. )

android.permission.WRITE_SMS
允许程序写短信(Allows an application to write SMS messages)

android.permission.WRITE_SYNC_SETTINGS
允许程序写入同步设置(Allows applications to write the sync settings)

android平台上的权限许可分得很细,如果软件无法正常执行时看看是不是缺少相关的permission声明,最终我们还需要使用 android sign tools签名生成的apk文件。

classes.dex文件 是Java源码编译后生成的Java字节码文件,APK运行的主要逻辑。resources.arsc文件 是编译后的二进制资源文件,它实际上就是App的资源索引表。这两个前期先简单了解一下是什么就可以了。

在演示APK安装包和微信安装包里面多了我标记的这两个文件夹:

第一个:kotlin,Kotlin和Java是用于Android应用程序开发的两种编程语言,即使是有技术背景的人,也会混淆Kotlin和Java,更不要说那些不知道这两个词的人了。而自Google推出Kotlin作为Android应用程序开发的第二种官方编程语言以来,Java与Kotlin之战就变得更加激烈了。

那你可能要问了,微信是 kotlin 开发的吗?是的,但不完全是,部分是。没被绕晕吧?

第二个,okhttp3,OKHttp是一个当前主流的网络请求的开源框架,很多APK将其调用。

以上就是对APK基本架构的简述,通过对这些资源的一个介绍,在下面讲到的简易修改APK可以快速定位。比如我们要修改一个图片或音频,那我们第一时间应该直接找到 assets目录 去修改、替换。如果要修改APK的主要逻辑,就应该从 dex 文件中去修改。

接下来进行本章的第一个实操,多开应用(APP)。首先就是要了解一下多开的原理,这边列举了4种多开的原理,后面3种比较复杂,不适合刚入门的同学进行学习。

原理解释
修改包名让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP
修改Framework对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开
通过虚拟化技术实现虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间
以插件机制运行利用反射替换,动态代{过}{滤}理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp

随意以第一种为例,简单修改应用包名来实现。当我们修改包名之后再进行安装,手机系统会认为咱们安装的是两个不同的APP。安装完成后就会生成2个不同的数据存储目录,且是两个互不干扰的应用。这就是修改包名来实现多开某个应用的原理。

我们将雷电模拟器安装好了之后,安装前面三个APK。第一个APP我是随便在网上找的,请不要在真实环境中去安装它。

安装完成后,显示下面三个图标:

我们先来看 MT管理器,它是手机端比较成熟的反编译(逆向)软件,有很多功能。在以后的文章中,我也会依次的去介绍。当然毕竟别人也要花时间去更新,有些功能是需要会员才能使用的。如果没开会员的朋友也可以使用替代软件,那就是 NP管理器

先打开 MT管理器,点击左上角“三”,选择“安装包提取”:

找到我们刚刚安装的“蛙蛙工具”,点击“提取安装包”:

我们看到一个包名:webapp.wawagongju,这个就是我们demo的一个包名。刚开始说多开的原理是需要修改包名来实现,那么包名就是这里显示的这个。我们点击左下角的功能

他这里有一个APK共存,我们点开后工具会自动生成一个新包名,不知道大家看到了没有,这个功能需要VIP!这里就不推荐破J的程序了,支持正版。

我们使用 NP管理器,操作跟上面一模一样,我们点击确定就会出现共存的应用:

我们点击这个 xxx_clone.apk 安装,完成后我们发现模拟器桌面就多了一个相同名称的APP:

同时打开这两个APP,发现可以一起启动并运行:

本来到这里就结束了,但是有的同学会问:包名都能改,APP的名称也可以改吧?这里就再回到之前讲的AndroidManifest.xml文件中了。我们使用MT或者NP管理器访问当时解压的目录,一般都解压在根目录下的MT/NP目录下。

随便哪个点击APK选择查看:

进入到AndroidManifest.xml文件中,点击编辑(NP)或者反编译(MT)都可以:

把这个“蛙蛙工具”改成我们自己想要的名字就可以了,改完了之后别忘了右上角的保存。

然后点击自动签名,更新AndroidManifest.xml文件,重新安装我们发现已经修改成功了:


附件哈希值(MD5):F9BAC6FA1F345503FBAE3B4603AD6CF1,如果验证不一致,请勿运行。

本次使用的工具包:

1、演示APK文件 2、MT管理器 3、NP管理器 4、雷电模拟器
已经登录?刷新

发表回复

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

联系我们

联系我们

站长QQ/VX:82794

在线咨询: QQ交谈

邮箱: 82794@qq.com

任何技术问题请联系QQ,非特殊行业请勿加微信!龙信小伙伴请联系微信群找我。
关注微信
非商务合作请勿添加

非商务合作请勿添加微信

返回顶部