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

”茄子快传”是联想开发的一款近距离文件共享软件。它通过wifi-direct(速度飞快,不须要联网)或者普通的网络(速度慢)在不同手机间传递文件。

不知为何。它就火了起来,火的也飞快。当中。共享传输已安装程序文件apk这一功能引起了我强烈的兴趣。

我们知道android对每一个应用的权限做了非常苛刻的控制,每一个应用程序有自己的用户id,每一个应用程序仅仅能訪问自己的数据,比方程序com.android.calculator计算器程序仅仅被同意訪问/data/data/com.android.calculator文件夹下的数据。且该程序的全部数据也都保存在该文件夹下。同一时候当程序被安装时,系统会将安装文件apk复制到/data/app文件夹下。那茄子快船作为普通的程序,它怎么具有读取/data/app下apk文件的权限的呢?假设它不是读取该文件夹下的apk文件,那程序的安装文件apk它是从哪里获取到的呢?

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

实现原理分析及实践

1)  实现方式一:

一開始我非常坚定的觉得茄子快船肯定不是读取手机里的程序的安装文件apk。我觉得它仅仅只是读取了系统全部已安装程序的信息,然后依据程序的包名在网络server上搜索相应的安装文件(apk文件)并下载,然后再通过网络传送给其它手机。

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

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

于是我接着推測。这个apk文件非常有可能在程序安装的时候就从server下载到茄子快船程序的文件夹里了。因此在发送的时候它不再须要网络了。于是我又做了另外一个实验:

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

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

那我開始想了,难道/data/app下的文件本身确实是可读的。

我不信邪,我開始查看这些文件的权限信息。

于是我又開始了以下的实验。为了模拟一般程序的权限,我用shell用户来运行读取/data/app/下的文件以      验证普通程序是否有相关权限。

[email protected]/tmp$ adb shell
1|[email protected]:/ $ ls /data -al
opendir failed, Permission denied
[email protected]:/ $ ls /data/app -al
opendir failed, Permission denied
#没有权限
1|[email protected]:/ $

从上面能够看出一般的程序应该是没法直接读取/data/app以下的文件啊。不正确啊?仅仅好出绝招了。我接着又使用root用户来查看文件夹的详细权限:

1|[email protected]:/ $ su root
[email protected]:/ # 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权限,那么程序就可通过详细文件名来读取该文件夹的相应文件。于是迫不及待的想看该文件夹下的文件权限属性。

[email protected]:/ # cd /data/app
cd /data/app
[email protected]:/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权限。于是我又一次模拟普通程序用户的权限開始例如以下的实验。

[email protected]:/data/app # exit
exit
#回到shell用户
[email protected]:/ $ ls /data/app
opendir failed, Permission denied
[email protected]:/ $ cd /data/app
#进入/data/app文件夹成功
[email protected]:/data/app $ cd -
/
1|[email protected]:/ $ 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下有哪些文件的,那它是怎样知道某一个程序的安装文件名称的呢?事实上这个非常easy。已安装程序的PackageInfo.sourceDir信息会指明该程序的安装程序名称及路径。详细获代替码例如以下:

public class MainActivity extends Activity {

	private static final String TAG = "Itleaks test";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		readFirstApkFile();
	}

	private void readFirstApkFile() {
		// TODO Auto-generated method stub
        List<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 block
					e.printStackTrace();
				}
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
	}
}

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

附录:

大家能够在github上下载到文中的源代码及apk文件:

https://github.com/itleaks/apkfileshare

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

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

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

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

附录:

大家能够在github上下载到文中的源代码及apk文件:

https://github.com/itleaks/apkfileshare

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

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

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

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

时间: 2024-08-04 04:50:26

从”茄子快传”看应用程序怎样获取手机已安装程序的apk文件的相关文章

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

"茄子快传"是联想开发的一款近距离文件共享软件,它通过wifi-direct(速度飞快,不需要联网)或者普通的网络(速度慢)在不同手机间传递文件.不知为何,它就火了起来,火的也飞快.其中,共享传输已安装程序文件apk这一功能引起了我强烈的兴趣. 我们知道android对每个应用的权限做了很苛刻的控制,每个应用程序有自己的用户id,每个应用程序只能访问自己的数据,比如程序com.android.calculator计算器程序只被允许访问/data/data/com.android.cal

在卸载或更改程序中不显示已安装程序的方法

打开注册表,然后搜索在卸载或更改程序中改程序显示的信息(比如要找百度云管家,可以搜索"百度在线网络技术").找到后将DisplyName改成DoNotDisplayName或者其它名字,这样在卸载或更改程序列表就找不到该程序了.要恢复显示也简单,只需把名字改回DisplayName即可.  

茄子快传数据分析之原理分析及数据清洗

茄子快传数据分析之原理分析及数据清洗 版权声明:闻道有先后,术业有专攻. https://blog.csdn.net/wlk_328909605/article/details/82227410 需求:联想集团有一款app产品叫茄子快传(有上亿的活跃用户,集中在第三世界国家) 现在需要开发一个数据分析系统,来对app的用户行为数据做各类分析: 原理: 流程如下图: 流程简单介绍: 用户通过茄子的客户端产生数据, 将使用时间,手机号,ip地址,手机的序列号,app的版本,app的下载渠道等重要信息

Android如何实现茄子快传

Android如何实现茄子快传茄子快传是一款文件传输应用,相信大家都很熟悉这款应用,应该很多人用过用来文件的传输.它有两个核心的功能: 端到端的文件传输Web端的文件传输这两个核心的功能我们具体来分析一下! 端到端的文件传输所谓的端到端的文件传输是指应用端发送到应用端(这里的应用端指Android应用端),这种文件传输方式是文件发送端和文件接收端必须安装应用. 效果图文件发送方 文件接收方 简单的文件传输的话,我们可以用蓝牙,wifi直连,ftp这几种方式来进行文件的传输.但是: 蓝牙传输的话,

茄子快传数据分析(一)----数据清理

茄子快传数据分析(一)----数据清理 2018年09月03日 18:41:44 amin_hui 阅读数:117 茄子快传原理 流程图:  数据 “events”: “1473367236143\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001160907223957000

android 非root机器如何备份已安装程序的apk

问题描述 想做一个能够备份已安装程序的apk程序,不知道已经安装过的程序,系统有没有保留一份安装文件,如果有路径在哪里? 解决方案1 LZ注意了    系统是不会帮你备份的(除非系统程序烧到rom的) 不过你的apk如果是下载的,就会在sd卡上,不删除的话会在的,但是删了就没了 另外你说的已经安装的apk,会在data/app下,数据在data/data下,这个我觉得没root是操作不了这个文件的,当然这个需要验证

android 获取手机的所有程序和widget的包名和启动类名

获取 widget可以 AppWidgetManager 来获取 List<AppWidgetProviderInfo> widget=AppWidgetManager.getInstance(Context(上下文)).getInstalledProviders(); 得到所有AppWidgetProviderInfo for (int i = 0; i < widget.size(); i++) {        AppWidgetProviderInfo info=widget.g

android 查询手机已安装的第三方应用程序

1.获取手机上已安装第三方的应用的应用名称和包名并打印 private void queryFilterAppInfo() { PackageManager pm = this.getPackageManager(); // 查询所有已经安装的应用程序 List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); Collections.s

UninstallView(已安装程序查看器)

软件简介: UninstallView 是一个收集在你系统已安装所有程序信息和在一个表中显示已安装程序的详细信息的工具.你可以使用它获取你的本地系统.你的网络上远程电脑和你电脑的外部可插拔的硬盘的程序信息.它允许你轻易的卸载在你本地电脑或远程电脑的软件. 图片预览: 下载地址:http://dickmoore.cn/Down/uninstallview.zip 文章作者:DickMoore 文章来源:开怀软件园