Android获取本机号码顶部应用的几种方法

android获取系统应用大小的方法
List packages = getPackageManager().getInstalledPackages(0); public PkgSizeObserver pkgsizeobserver = new PkgSizeObserver(); try { M method = this.getPackageManager().getClass().getMethod( getPackageSizeInfo, new Class[] { String.class, IPackageStatsObserver.class }); method.invoke(this.getPackageManager(), packageInfo.packageName, pkgsizeobserver); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (pkgsizeobserver) { try { pkgsizeobserver.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } totalApp = pkgsizeobserver.cachesize + pkgsizeobserver.codesize + pkgsizeobserver.}
PkgSizeObserver.class
//aidl文件形成的Bindler机制服务类
public class PkgSizeObserver extends IPackageStatsObserver.Stub {
public long cachesize = 0;
public long datasize = 0;
public long codesize = 0;
* 回调函数,
* @param pStatus
,返回数据封装在PackageStats对象中
* @param succeeded
代表回调成功
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
// TODO Auto-generated method stub
if(succeeded)
cachesize = pStats.cacheS // 缓存大小
datasize = pStats.dataS // 数据大小
codesize = pStats.codeS // 应用程序大小
synchronized (this) {
this.notifyAll();扫一扫体验手机阅读
安卓5.0以后获取顶层应用包名的方法(6.0,7.0,8.0均可用)
<span type="1" blog_id="2149558" userid='
48篇文章,4W+人气,0粉丝
大数据时代的微服务之路
¥51.00491人订阅
前百度高级工程师的架构高可用实战
¥51.00237人订阅
<span type="1" blog_id="2149558" userid='在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同学可以查看这里:icodetools动态注入代码解析,看完之后都会发现这个工具对于现在加固的应用是没有办法的,所以我们如何能够得到加固的应用的所有方法信息呢?再不用复杂的脱壳步骤也可以轻松的获取对应的方法信息。这个就是本文需要介绍的内容。
二、获取加固应用方法
在之前了解过加固应用原理的同学或者是弄过脱壳的同学都知道,加固其实就是对源apk进行加密,然后进行解密加载运行,所以在这个过程中如果我们想要得到应用的所有方法信息,必须是在解密加载运行之后进行操作了。这个我们就需要借助系统的一个重要类DexFile,下面可以查看他的源码:
看到这三个方法,而这三个方法是一个应用中类加载运行的最终点,不管你怎么加固,最终都会需要解密,加载dex,加载类然后运行。所以这三个地方是应用运行的必经之地。看到三个方法的参数信息,可以知道这个类的名称和类加载器,那么我们就可以利用这两个信息通过反射获取这个类的所有方法信息,这里依然需要借助神器Xposed来进行hook操作,hook的对象就是系统的dalvik.system.DexFile类的三个方法:
注意:为了防止多dex进行hook发生类找不到的错误,这里做一次attach操作!这里为了演示加固应用,就选择了之前我写过的一个下载今日头条视频的小工具,当时没有开源,并且进行了加固,选择的是梆梆加固。也有人找我要源代码。那么通过本文案例分析之后,就不需要源码了,你可以窥探这个小工具的所有方法信息了。这个工具的下载地址:,使用教程在应用中也有。
下面继续来看看上面hook之后的处理类方法:
在这个方法中,首先我们通过类名和加载器信息,得到这个类所有的方法信息,然后开始构造这个方法的签名信息:
这个信息包括:方法的修饰符,返回类型,方法名,参数类型,大致最终的样式为:
public final native java.lang.String xxx(java.lang.String, int)
这样的信息就能够把一个方法的所有信息体现出来,后续如果我们想在外部利用反射调用这个方法来窥探信息就好办了,得到这些方法的签名信息之后,然后就开始进行每个方法的hook操作了:
在利用Xposed进行hook一个方法的时候,需要知道类名,类加载器,方法名,方法参数类型。正好这些信息在上面都可以知道,而这里之所以要进行hook是为了能够判断这个方法是否被调用了,方法在被调用的时候的参数值是什么。因为上面获取是这个类所有的方法,但是不代表这些方法就是被调用了。只有在次进行hook才可以判断当前方法被调用了。而这里有一个问题就是如果一个应用过于庞大,方法较多。在Xposed进行hook那么多方法就会出现OOM这样的错误。所以本文为了演示就没有做优化,我们可以先获取类的所有方法,然后分批进行hook操作即可。
三、运行效果
下面我们运行这个Xposed模块,然后重启设备运行即可,最后在运行上面已经安装加固的今日头条下载器工具,运行看效果日志:
看到了,我们把这个工具的所有方法都打印出来了,然后再来看看他的调用方法:
从这些信息可以看到,这些方法被实际调用了,再来看看那些方法被调用时的参数值:
看到了,方法调用的参数值我们也可以把它打印出来。
四、如何处理获取到的方法
到这里我们达到了我们的目的,可以dump出一个加固应用的所有方法,以及被实际调用方法,同时还可以把参数值打印处理,本文用的是梆梆加固的案例,其实其他家的加固都是可以的。感兴趣的同学可以尝试一下。下面继续来看,上面获取到了应用的所有方法信息,有的同学可以会想这么干,用反射调用某个可疑方法,看看方法的返回值是啥?所谓可以,可能需要通过经验,结合方法的参数信息类型得知这个方法的可疑程度,反射调用很简单:
可以自己随便写一个应用然后得到根据包名得到其对应的Context变量,然后得到其类加载器,开始加载这个可以方法,不过可惜的是,这个运行应该是报错的:
提示找不到这个类,原因想一下就通了:因为现在的应用是加固的,加固最终解密dex运行肯定用的是自己的类加载器,而上面的这种方式获取到的Context只是外层壳的类加载器也就是应用默认的PathClassLoader加载器,所以理论上肯定是找不到这个类的,所以如果想不报错,就需要找到这个类加载器。但是这个因为没有源码所以很难找到。所以通过这个简单的代码想告诉一些同学,这种想法是好的,但是其实是错误的。
取而代之的是我们可以利用Xposed来进行hook这个方法,因为Xposed中我们可以解决类加载器的问题:
先hook系统的Application类的attach方法,然后在获取他的Context值,得到类加载器,来加载指定类,如果加载成功了,所以找到了对应的类加载器,那么就可以进行后续的hook操作了。这种方法和思想是对的。
五、解答疑惑
有的同学又好奇了,上面我们在进行获取类的所有方法信息的同时不是已经进行hook方法了,还得到方法运行时的参数值了,的确那里是做了,但是我也说了,Xposed一次性hook太多方法是会报错的,因为本文案例的应用方法数不是很多,所以看起来很正常,如果进行hook大的应用的时候会出现问题的。所以为了解决这样的问题,我们可以先获取应用的所有方法,此时可以不进行hook操作,然后有了类的所有方法信息之后,在进行方法分析,然后对可以方法单独进行hook操作来进行验证即可。
有的同学又有疑问了?这个对于大型的app来说感觉没什么用?的确,比如像WX这样的应用,如果用作本文案例,可以看到日志刷屏了,没有一会就出现ANR了,这个问题在之前说到用icodetools工具进行操作的时候也出现过。当时的解决方案是通过开关进行控制,这里其实也可以用开关进行控制的。但是这里想说的是,现在加固的应用并不是大型应用,原因很简单,因为加固是有崩溃率的,现在没有任何一个加固平台可以保证零崩溃率的,因为加固现在都涉及到了native层,而Android机型复杂,兼容性肯定不好。所以对于那些用户量非常庞大的应用是不会进行加固的,比如BAT的主流产品都没有进行加固。但是有的应用必须进行加固,那就是涉及到金融方面的,对于他们来说安全比崩溃率更重要。也有的大部分收费和内购的游戏也是选择加固的。而这种应用现在大部分属于中型应用,本文还是可以进行操作的。
项目下载地址:
本文主要讲解了如何hook系统类信息,然后获取到加固应用之后的所有方法信息,同时还可以获取到哪些方法被执行了,以及执行的过程中参数信息,而这些信息是分析一个应用最为重要的信息。当然我们也可以通过分析方法的参数信息来判断这个方法的可以程度,然后在用Xposed进一步进行hook来验证结果都是可以的。
阅读(...) 评论()主要通过PackageManager中的方法
public class InstallApps extends ListActivity { &&&
&&& HashMap&String, String[]& map=new HashMap&String, String[]&(); &&& List&String& packagelist=new ArrayList&String&(); &&& List&String& systemApp=new ArrayList&String&(); &&& protected void onCreate(android.os.Bundle savedInstanceState) { &&&&&&& super.onCreate(savedInstanceState); &&&&&&& PackageManager pm=getPackageManager(); &&&&& //List&PackageInfo& mPackageinfo=& pm.getInstalledPackages(PackageManager.GET_PERMISSIONS); &&&& & Intent query=new Intent(Intent.ACTION_MAIN); &&&& & query.addCategory("android.intent.category.LAUNCHER"); &&&& && List&ResolveInfo& resolves= pm.queryIntentActivities(query, PackageManager.GET_ACTIVITIES); &&& && for (int i = 0; i & resolves.size(); i++) { &&&&& &&& ResolveInfo info= resolves.get(i);
& / /判断是否为系统级应用 &&&&&&&& if((info.activityInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)&=0){ &&&&&&&&&&&& /*安装的应用*/ &&&&&&&&&&&& String packagename=info.loadLabel(pm).toString();&&&&
&&&&&&&&&&& String[] &&&&&&&&&&& try { &&&&&&&&&&&&&&& permission = pm.getPackageInfo(info.activityInfo.packageName, PackageManager.GET_PERMISSIONS).requestedP//获取权限列表 &&&&&&&&&&&&&&& packagelist.add(packagename); &&&&&&&&&&&&&&& map.put(packagename, permission); &&&&&&&&& } catch (NameNotFoundException e) { &&&&&&&&&&&&&&& // TODO Auto-generated catch block &&&&&&&&&&&&&&& e.printStackTrace(); &&&&&&&&&&& } &&&&&&&&&&&
&&&&&&&&& } else{ &&&&&&&&&&&&& /*系统应用*/ &&&&&&&&&&&&& String packagename=info.loadLabel(pm).toString();
&&&&&&&&&&&&& String[] &&&&&&&&&&& try { &&&&&&&&&&&&&&& permission = pm.getPackageInfo(info.activityInfo.packageName, PackageManager.GET_PERMISSIONS).requestedP//获取权限列表 &&&&&&&&&&&&&&& systemApp.add(packagename); &&&&&&&&&&&&&&& map.put(packagename, permission); &&&&&&&&&&&& } catch (NameNotFoundException e) { &&&&&&&&&&&&&&& // TODO Auto-generated catch block &&&&&&&&&&&&&&& e.printStackTrace(); &&&&&&&&&&&& } &&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&& } &&&&&&&
&&& } &&& /*& 判断是否属于系统应用 &&&&& for (int i = 0; i & mPackageinfo.size(); i++) { &&&&&& PackageInfo info=mPackageinfo.get(i); &&&&&& if((info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)&=0){ &&&&&&&&&& String packagename=info.applicationInfo.loadLabel(pm).toString();&&&& &&&&&&&&& String[] permission= info.requestedP &&&&&&&&& packagelist.add(packagename); &&&&&&&&& map.put(packagename, permission); &&&&&&& } else{ &&&&&&&&&&& String packagename=info.applicationInfo.loadLabel(pm).toString();
&&&&&&&&&&& String[] permission= info.requestedP &&&&&&&&&&&& systemApp.add(packagename); &&&&&&&&&&& map.put(packagename, permission); &&&&&&&&&&&
&&&&&&& } &&& }*/ &&&&& packagelist.addAll(systemApp); &&&
&&&&& getListView().setAdapter(new ArrayAdapter&String&(this, android.R.layout.simple_list_item_1, packagelist)); &&&&& getListView().setOnItemClickListener(new OnItemClickListener() {
&&&&&&& @Override &&&&&&& public void onItemClick(AdapterView&?& arg0, View arg1, int position, long arg3) { &&&&&&&&&&& // TODO Auto-generated method stub &&&&&&&&&&& String[]permission=map.get(packagelist.get(position)); &&&&&&&&&&& StringBuilder sb=new StringBuilder(); &&&&&&&&&&& for (int i = 0; i & permission. i++) { &&&&&&&&&&&&& sb.append("权限"+permission[i]+"\n"); &&&&&&&&&&& } &&&&&&&&&&& Toast.makeText(getApplicationContext(), sb,Toast.LENGTH_LONG ).show(); &&&&&&&&&&&
&&&&&&& } &&&&&& }); &&&&&&&
本文转载自:http://blog.csdn.net/androidchuxueze/article/details/7336468
人打赏支持
领取时间:
领取条件:参与过开源中国“源创会”的 OSCer 可以领取
码字总数 11616
Android系统对应用程序权限申请的处理方式分析 对Android源代码中的如下文件进行分析: (1) InstallAppProgress.java:其路径为packagesappsPackageInstallersrccomandroidpackageinstaller...
AlexMahoneFBI
一、前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新版本app。在线更新分为以下几个步骤: 在线更新就上面几个步骤,前2步比较简...
codeGoogle
每个Android应用都需要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名是固定的并且放在每个Android应用的根目录下。它定义了该应用对于Android系统来说一些非常重要的信息。And...
程序袁_绪龙
要区分apk运行时的拥有的权限与在文件系统上被访问(读写执行)的权限两个概念。 apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。...
第一章 Android 安全入门 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 Android 是当今最流行的智能手机操作系统之一。 随着人气的增加,它存在很多安全风险,这些风险不可避免地被...
apachecn_飞龙
安全和许可Security and Permissions Android是一个多进程系统,每个应用程序(以及系统的部分)运行在它自己的进程里。大多数程序和系统之间的安全性通过基础的Linux机制在进程级别进行支持...
这篇文章目的在于介绍Android系统上控制权限的方法,读者只要使用过Android,或是对智能机平台有所了解,就能看懂,不需要专门的编程知识。   1 为什么Android总是事无巨细地告诉你应用索取...
5.2.1 权限和保护级别 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 5.2.1.1 如何使用 Android OS 的系统权限 Android 操作...
apachecn_飞龙
这篇文章目的在于介绍Android系统上控制权限的方法,读者只要使用过Android,或是对智能机平台有所了解,就能看懂,不需要专门的编程知识。 1 为什么Android总是事无巨细地告诉你应用索取的每...
应用场景:对于我们自己开发的两个应用程序,一个应用程序的包名为 aa.bb.cc,软件名叫a,它的入口Activity为 aaActivity(入口activity就是在AndroidManifest.xml中标签——&action android...
没有更多内容
加载失败,请刷新页面
安装 #3.4.2sudo apt-get install opencvsudo apt-get install golang-1.9vi ~/.profileexport GOPATH=$HOME/Desktop/GoPathexport PATH=$PATH:$GOPATH/bin:wq!#https://github.c......
SQL优化的思路: 1.优化更需要优化的sql; 2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈。 3.明确优化目标; 4.从Explain入手; 5....
tt.txt文件内容: &table name="RRR1"& 4.here is need to be repalce content! 5.here is need to be repalce content! 6.here is need to be repalce content! &/table& &table na......
问题后期会有次序的整理,目前整理一小部分 1.部署之后出现403问题。 403权限问题的修改: (1)打开nginx.conf文件 vim /etc/nginx/nginx.conf (2)按键盘“i”进入编辑模式,修改第一行为...
xiaoge2016
大数据在近几年的发展速度确实超出人们的预料,自2014年3月“大数据”首次出现在《政府工作报告》中以来,国务院常务会议一年内6次提 及大数据运用,而且不管是在数博会还是今年的G20当中,大...
转载地址 TypeScript基础入门 - 基础类型 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.0.2 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都...
语法 Redis CONFIG 命令格式如下: redis 127.0.0.1:6379& CONFIG GET CONFIG_SETTING_NAME 实例 redis 127.0.0.1:6379& CONFIG GET loglevel1) "loglevel"2) "notice" 使用 * 号获取所......
redis过期通知阻塞模式 php代码使用swoole多线程监听 redis.conf 中配置 设置定期后通知 notify-keyspace-events "Ex" $redis = new Redis();$redis-&pconnect('127.0.0.1', 6379);$redis......
分享一下Data Binding在项目中一些常用的基础,点击事件和输入框的一些操作。 DataBinding允许我们在xml中view的一些事件属性(如onClick等)中填写DataBinding表达式,也可以通过绑定liste...
1.VirtualBox虚拟机实现桥接方式——解决桥接网卡界面名称未指定问题 2.虚拟机(virtualBox)下redhat7.2桥接网络设置
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有Android开发之查看应用包名package和入口activity名称的方法
使用android自动化测试工具monkeyrunner启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法:
方法一:使用aapt
//aapt是sdk自带的一个工具,在sdk\builds-tools\目录下
1.以ES文件为例,命令行中切换到aapt.exe目录执行:aapt dump badging E:\apk\es3.apk
2.运行后的结果中以下两行分别是应用包名package和入口activity名称
package: name=’com.estrongs.android.pop’
launchable-activity: name=’com.estrongs.android.pop.view.FileExplorerActivity’
注:在android sdk目录搜索可以找到aapt.exe,如果没有可以下载apktool。
方法二:查看Manifest.xml
1.使用apktool反编译app:apktool.bat d es3.apk E:\apk\es
2.打开AndroidManifest.xml
manifest节点的package属性&#20540;是应用的包名:
查找android.intent.action.MAIN和android.intent.category.LAUNCHER对应的activity,该activity对应的android:name属性既是入口activity名称,如下:
android.intent.action.MAIN决定应用程序最先启动的Activity
android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里
IMF公布2013年最新世界各国GDP排名,中国为日本两倍
2013年中国各城市GDP排名50强名单
2013年中国各省市行政区GDP总量和人均GDP排名
2014年中国95家企业入围世界500强,排第二
美国公布失败国家指数,中国比印度和越南失败
中国人被“清朝GDP世界第一”忽悠了!
2013中国百强县排名与名单
薪酬最高的25家IT科技公司排名
国内就业率最高的50个本科专业排名
2014年中国工科大学排名100强名单
最新世界各国国土面积和人口排名
女生收入最高的20个工作排名
最新“211”工程大学排名与名单(共16所)

我要回帖

更多关于 Android高德地图位置获取 的文章

 

随机推荐