从”茄子快传”看应用程序如何获取手机已安装程序的apk文件

2024-02-28 00:40

本文主要是介绍从”茄子快传”看应用程序如何获取手机已安装程序的apk文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       ”茄子快传”是联想开发的一款近距离文件共享软件,它通过wifi-direct(速度飞快,不需要联网)或者普通的网络(速度慢)在不同手机间传递文件。不知为何,它就火了起来,火的也飞快。其中,共享传输已安装程序文件apk这一功能引起了我强烈的兴趣。

 

 

 

        我们知道android对每个应用的权限做了很苛刻的控制,每个应用程序有自己的用户id,每个应用程序只能访问自己的数据,比如程序com.android.calculator计算器程序只被允许访问/data/data/com.android.calculator目录下的数据,且该程序的所有数据也都保存在该目录下。同时当程序被安装时,系统会将安装文件apk拷贝到/data/app目录下。那茄子快船作为普通的程序,它怎么具有读取/data/app下apk文件的权限的呢?如果它不是读取该目录下的apk文件,那程序的安装文件apk它是从哪里获取到的呢?

         于是,我开始充分发挥主观能动性,开始不停思考它的实现方法,并有了如下想法和实践。

 

实现原理分析及实践

 

 

1)  实现方式一:

 

        一开始我很坚定的认为茄子快船肯定不是读取手机里的程序的安装文件apk。我认为它只不过读取了系统所有已安装程序的信息,然后根据程序的包名在网络服务器上搜索对应的安装文件(apk文件)并下载,然后再通过网络传送给其他手机。

 

       为了验证这一猜测,我猜想只要我断了网络,它自然没法做程序搜索,那么肯定就没法传送文件了。于是,我做了如下实验:

我断掉自己手机的所有网络(2g/wifi),然后再使用这个功能选择某一程序并选择发送给其他手机,结果发现它仍然工作。

 

        于是我接着猜测,这个apk文件很有可能在程序安装的时候就从服务器下载到茄子快船程序的目录里了,因此在发送的时候它不再需要网络了。于是我又做了另外一个实验:

 

         我断掉我所有的网络,然后通过adb安装某一程序,这样在安装的过程中,茄子快船肯定是没法从网络上下载相应的apk文件的。但是出人意料的是,茄子快船仍然成功传送了我刚刚安装的程序对应的安装文件。

2)  最后我不得不相信它确实是通过读取/data/app下的apk文件来传送安装程序的。

          那我开始想了,难道/data/app下的文件本身确实是可读的。我不信邪,我开始查看这些文件的权限信息。           于是我又开始了下面的实验。为了模拟一般程序的权限,我用shell用户来执行读取/data/app/下的文件以      验证普通程序是否有相关权限。

 

itleaks@Itleaks/tmp$ adb shell
1|shell@htc:/ $ ls /data -al                                                
opendir failed, Permission denied
shell@htc:/ $ ls /data/app -al
opendir failed, Permission denied
#没有权限
1|shell@htc:/ $

 

 

          从上面可以看出一般的程序应该是没法直接读取/data/app下面的文件啊,不对啊?只好出绝招了,我接着又使用root用户来查看目录的具体权限:

 

 

1|shell@htc:/ $ su root
root@htc:/ # ls /data -al
ls /data -al
drwxrwx--x system   system            2014-06-19 20:40 app

 

 

 

           到此,我终于明白了,原来/data/app目录对于其他用户具备-x权限。也就是说普通程序可以进入该目录,但是没法读取该目录文件里的内容,即没法查询该目录下有哪些文件。这也是为什么我们执行ls /data/app –al失败的原因,因为这个命令会读取目录文件,自然需要该目录对其他用户开放-r权限。在-x权限下,只需该目录下的文件对第三方程序开发-r权限,那么程序就可通过具体文件名称来读取该目录的对应文件。于是迫不及待的想看该目录下的文件权限属性。

 

 

root@htc:/ # cd /data/app
cd /data/app
root@htc:/data/app # ls -al
ls -al
-rw-r--r-- system   system    5784942 2014-05-18 15:22 cn.lvye.hd-1.apk
-rw-r--r-- system   system   16056547 2014-05-16 21:11 cn.whonow.whonow-1.apk

 

 

 

          果然,目录下的apk对于其他用户有-r权限。于是我重新模拟普通程序用户的权限开始如下的实验。

 

 

root@htc:/data/app # exit
exit
#回到shell用户
shell@htc:/ $ ls /data/app
opendir failed, Permission denied
shell@htc:/ $ cd /data/app
#进入/data/app目录成功
shell@htc:/data/app $ cd -
/
1|shell@htc:/ $ ls /data/app/cn.lvye.hd-1.apk -al
-rw-r--r-- system   system    5784942 2014-05-18 15:22 cn.lvye.hd-1.apk
#读取apk文件成功

 

 

 

          从上面可以看出,shell用户已经成功读取到cn.lvye.hd-1.apk文件的信息。但是还有一个问题,我们刚刚是通过root用户来查看/data/app目录下的apk文件的名字的,对于普通用户来说,它是没法知道/data/app下有哪些文件的,那它是如何知道某一个程序的安装文件名的呢?其实这个很简单,已安装程序的PackageInfo.sourceDir信息会指明该程序的安装程序名称及路径。具体获取代码如下:

 

public class MainActivity extends Activity {private static final String TAG = "Itleaks test";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);readFirstApkFile();}private void readFirstApkFile() {// TODO Auto-generated method stubList<PackageInfo> installedList = this.getPackageManager().getInstalledPackages(0);int installedListSize = installedList.size();ApplicationInfo firstApplicationInfo = null;for(int i = 0; i < installedListSize; i++) {PackageInfo info = installedList.get(i);ApplicationInfo aInfo = info.applicationInfo;Log.d(TAG, "application source dir " + aInfo.sourceDir); if (firstApplicationInfo == null) {firstApplicationInfo = aInfo;}}File file = new File(firstApplicationInfo.sourceDir);if (!file.exists()) {Log.e(TAG, "package:" + firstApplicationInfo.packageName+ " Apk file " + firstApplicationInfo.sourceDir + " doesn't exist");} else {FileInputStream in = null;try {in = new FileInputStream(file);int size;try {size = in.available();Log.d(TAG, "Apk file " + firstApplicationInfo.sourceDir + " size:" + size);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

 

 

 

         对于乐视lvye这个程序,其sourceDir为/data/app/cn.lvye.hd-1.apk,有了这个文件路径,普通程序就可以通过一般的文件读取操作来读取该文件了。


 

附录:

 

         大家可以在github上下载到文中的源码及apk文件:

         https://github.com/itleaks/apkfileshare

/********************************

* 本文来自博客  “爱踢门”

* 转载请标明出处:http://blog.csdn.net/itleaks

******************************************/

这篇关于从”茄子快传”看应用程序如何获取手机已安装程序的apk文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754017

相关文章

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

通过C#获取Excel单元格的数据类型的方法详解

《通过C#获取Excel单元格的数据类型的方法详解》在处理Excel文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用FreeSpire.XLS来获取Excel单元格的... 目录引言环境配置6种常见数据类型C# 读取单元格数据类型引言在处理 Excel 文件时,了解单元格