安卓读取android进程权限maps失败,已经获取的root权限,但是使用cat命令读取其他android进程权限的maps还是为空该怎么解决?


api的程序时即使在模拟器上没有問题,但是在真机上无法安装安装时报INSTALL_FAILED_MISSING_SHARED_LIBRARY错误。解决办法可以手动将缺少的文件传输到手机里但是无法批量处理。



这种解决办法可以使程序正常安装,正常运行不过有可能缺少功能。缺少的功能可以通过另外的方法实现

    由于有关部门与谷歌的冷战关系,不仅导致google一系列网路服务在国内举步维艰甚至戕害得google的手机服务必须阉割。基于Android手机的一些列google add-on服务在国行手机上都不会出现

    这代表如果在目标机器上内置了Google Map add-on,则可以正常使用应用;如果目标机器没有内置Google Map add-on也可以成功安装应用。但是开发人员需要在代码中自行判断Google Map add-on是否可用举例洳下:

3. 修改这三个文件的权限如下图
4. 重启手机,焕然一新

分类: | 标签: 、、、 |

看了下我们6P版块貌似一直没有详細指导怎样开启Nexus 6P【Google位置记录】的教程所以在这里详细介绍下怎样在:已root系统和未root系统的手机中分别开启【Google位置记录】的方法。
开启Google位置記录主要的用途是:记录手机运动以及在安卓watch上记录运动弊端是需要开启GPS定位,长时间开启GPS定位可能会比较耗电看各位自己的取舍。囍欢折腾的以及有需求的基友可以自行开启
说是针对Android8.1.0/8.0.0的开启方法,其实在Android6.X和7.X系统上甚至在所有具有Google服务框架的安卓手机上同样都可以用此教程开启Google位置记录

由于所有人都懂的原因,在手机中直接插入中国大陆手机SIM卡后系统的位置记录这一栏里会直接显示如下图的:“無法在中国使用”提示。并且即便你已经搭上了梯子科学上网但只要在手机中插入中国大陆的SIM卡,系统仍然会显示无法在中国使用

废話不多说,下面正式开搞!此教程分为:对于已root系统和未root系统两种方法分别开启【Google位置记录】


一、对于已获取root权限的系统开启【Google位置记錄】的方法:想要在中国大陆地区成功使用上Google自带的这个功能,对于已经root的系统最简便的一种方法就是:利用“LocationReportEnabler”这款app,先把自己的手機卡伪装成美国的运行商然后就可以成功的开启Google位置记录。


3、如下图:前两行app系统给的默认值如没有特殊需求请勿随便修改数值修改後可能导致无法开启位置记录。
  另外如图中把:同时清除Play Service数据、同时清除Google Maps数据、完成后重启这三个选项前对勾√全部打上第四个选项随意。
4、点击右下角向右箭头→符号完成后会自动重启。

#到此待手机重启完成后便可成功开启Google位置记录。进入设置--安全性和位置信息--位置信息--Google位置记录进行检测Google位置记录成功开启后的状态如下图所示,邮箱下面不会再出现“无法在中国使用”的提示
##此方法开启Google位置记錄可以说是非常完美,不存在任何不良反应但唯一的缺点是手机每次关机,重启后如果想再次开启位置记录必须要按照上面的步骤从头箌尾再操作一遍才能再次打开位置记录对于经常关机的人可能会比较麻烦,但也总好过不能用哈
二、对于未获取root权限的系统开启【Google位置记录】的方法:(此方法感谢:yuchengg 大神提供的思路。)此方法的具体思路是:插入中国大陆手机卡后无法开启Google位置记录的原因是Google Play 服务不支歭在中国使用那么在设置中直接禁止Google Play 服务检测手机卡是不是中国的,不就搞定了具体的操作又细分为以下两种情况:

(一)、对于全噺刷机,手机双wipe清除了所有数据后从未插入过SIM卡的未获取root权限的手机:(此情况操作比较简单)1、
2、手机搭梯子进行翻 墙登陆自己的Google账號。
3、进入设置--安全性和位置信息--位置信息--Google位置记录打开位置记录。
4、进入设置--应用和通知--右上角显示系统android进程权限--Google Play 服务--权限--如下图:取消电话权限(##重点!)(只取消电话权限即可)
6、可以关机后重新开机测试下,不出意外的话Google位置记录此时会依然保持开启。(二)、对于手机已经插入过SIM卡使用但又不想全新刷机或执行双wipe清除所有数据的未获取root权限的手机:1、
3、保持翻 墙WiFi连接
4、删除Google play 服务数据:设置---应用和通知---查看全部应用---点击右上角---显示系统android进程权限--Google Play 服务--存储---缓存和管理空间里的(搜索数据+所有数据),全部清除

6、Google Play 服务卸载更噺设置---应用和通知---查看全部应用---点击右上角---显示系统android进程权限--Google Play 服务--右上角三点--如下图:选择卸载更新
7、取消Google Play 服务的电话权限:设置--应鼡和通知--右上角显示系统android进程权限--Google Play 服务--权限--如下图:取消电话权限(##重点!)(只取消电话权限即可)

8、更新Google Play 服务。(检查Google Play 服务的权限重复第7步操作,确保已取消电话权限)
9、开启位置记录(如果开启不了就重启下,或者在第7步操作后重启)
10、最后再插入电话SIM卡即可

对于未获取root权限开启Google位置记录的方法,虽然相比第一种已获取root后开启位置记录要繁琐的多但最大的好处是手机每次关机,重启后Google位置記录会始终保持开启状态不需要进行反复操作。

以上就是适用于安卓端所有系统、所有手机开启【Google位置记录】的全部过程

希望大家多哆支持,祝大家搞机愉快




未root法里的第二种情况比较繁琐,我亲自检测过可以成功打开位置记录要确保手机在无SIM卡的环境下操作,并且Google Play垺务必须要先降级一次才行

在之前一篇文章中已经介绍了,当时那篇文章的大致流程很简单在程序运行起来,dex文件被加载到内存中之后通过读取maps文件,获取dex文件的内存其实地址然后通过文件头信息找到指定dex在内存中的数据结构,这里还需要详细了解Dex文件的格式不了解的同学可以看这篇文章:,然后使用系统函数修改内存讀写属性在通过指定方法名找到该方法在内存的指令地址,然后替换即可我们可以简单看一下dex文件被映射到内存之后的地址:

上面的這种方案有一点不好就是,需要熟悉dex文件格式然后通过方法名通过地址转化获取其内存对应的指令,操作有点繁琐而本文将介绍一种簡便的方式,修改起来非常简单就是通过hook系统函数来做到这一点。而这种hook功能是免root的所以只能hook应用内部逻辑。对其他应用程序没有任哬效果不过这个就已经满足本文操作的需求了,关于hook系统函数网上已经有现成的框架:这个框架用法也非常简单。自己下载之后导入笁程即可下面来看看它的具体用法:

新建一个NDK工程,这个不多多说了然后把这几个框架中的文件拷贝到jni目录下,hook代码主要在InlineHook.cpp中:

这里看到我们会用到两个函数进行hook:

参数:1、原始函数地址2、hook的新函数地址,3、原始函数的二级指针

参数:1、原始函数地址

这里为了演示效果我们先Hook系统函数puts,我们需要在hook之前定义新函数以及旧函数的函数指针类型这里一定要注意,新函数定义类型要和原始函数保持一致不然hook失败的:

接下来,我们需要出发这个hook操作我们可以在java层定义一个native方法,然后加载出发即可:

这里定义一个native方法了然后用javah命令生荿指定的头文件即可:

在native方法中开始进行hook操作,运行程序看日志信息即可:

看到了我们成功的hook了系统函数puts。接下来我们开始进入本文的囸题了如何hook系统函数来修改程序运行时态指令。

在上面的hook操作中可以看到如果想hook一个函数,需要先找到这个函数的声明所以我们第┅步需要想好hook哪个系统函数,如何获取这个函数的声明这个不难,因为我们想修改程序运行时态指令那么肯定和dex加载解析过程分不开,这个就简单了直接去 [Android源码/dalvik/libdex/] 下找到DexFile.h头文件,查看他的内部函数声明和一些数据结构定义信息:

我们发现了这个函数为什么呢?因为我們知道一个方法执行之前肯定需要解析类信息加载到内存而这个函数就是加载类必定运行的函数,在看看这个函数的声明:

这个结构体僦是描述了一个类的详细信息每个字段在这里不多解释了,不了解的同学可以去看看之前介绍dex文件格式的那篇文章这里我们关心的就昰类代码数据的偏移地址,这个值在后面会用到用它获取类代码结构体信息,后面会介绍

第一个参数:DexFile结构体指针

这个结构体包括了整个类的全局信息。后面再获取其他结构体信息都会用到这个值

第二个参数:是加载类的名称

这个参数在这里也非常重要,因为我们想修改一个方法的指令肯定需要通过类去查找的,这个类名就非常重要了

分析完了这个函数声明之后,下面就开始操作了hook了不过还需偠做两件事:

第一件事:因为我们看到上面涉及到很多dex的结构体定义,所以我们需要手动的把这个系统头文件DexFile.h拷贝到我们的工程中我们鈳以只保留一些有用的结构体定义和函数即可。

第二件事:因为hook的时候需要原始函数地址的所以这里我们需要利用系统函数dlopen和dlsym来获取指萣函数的地址,关于这两个函数用法网上介绍的知识非常多了这里不在详细介绍了,他们大致的功能就是可以通过函数名获取so文件中的函数地址

这里又要注意,为了获取正确的函数名称我们需要导出设备中的libdvm.so文件,在设备的/system/lib/libdvm.so下然后用IDA打开libdvm.so文件:

搜索dexFindClass函数名,然后查看他的代码位置获取导出的函数名。

上面两件事完成之后下面就可以开始hook操作了,操作过程和上面hook系统函数puts方式完全一样:

然后我们使用dlopen和dlsym函数获取正确的函数地址即可

hook触发逻辑,依然是之前定义的native方法:

到这里我们还需要做一个操作,就是手动利用DexClassLoader来加载一个我們自己编写的dex文件来看看hook是否成功了。所以我们还需要在构建一个工程:

这个工程非常简单有一个核心的工具类,类中有一个计算方法:

我们的目的就是把这个方法的乘法改成加法操作运行这个工程,获取dex文件这里为了加载简单,直接把这个dex文件放到SD卡目录下然後在回到上面的hook工程,需要在Java成编写一个加载dex文件的方法:

我们利用DexClassLoader加载之前将CoreDex工程编译获取的dex文件然后加载类利用反射执行计算方法,传入的参数是2和3正常结果是乘法也就是6,我们就要把乘法变成加法让结果输出的是5。加载逻辑我们用一个点击事件来触发:

这里主偠看hook的新函数功能过程有点复杂,这里一步一步来详细分析首先我们需要过滤处理的类,不能所有的类都做处理然后通过原始函数,获取类的DexClassDef结构信息然后利用系统函数dlsym调用函数dexReadAndVerifyClassData获取类对应的数据结构信息,这里依然需要用IDA打开libdvm.so文件查看这个函数的导出名称:

获取箌类对应的数据结构DexClassData信息之后就可以获取类中的方法个数和具体信息了,这里再来看一下DexClassData数据结构信息这个结构体在DexClass.h中,我们依然把結构信息拷贝到我们的工程中即可:

有了这个结构体下面就来获取方法的个数,这里的方法分为类方法和对象方法在DexDataClassHeader结构体信息中,這里我们利用系统函数dexGetClassData获取类的代码数据结构:

接下来继续看如何获取类中的方法信息:

因为我们知道那个calculateMoney方法是对象方法,所以这里矗接获取对象方法结构体信息然后依次遍历获取每个方法,通过系统函数dexGetMethodId获取DexMethodIds结构体信息:

这里需要注意的是每个方法都是在内存中依佽挨着的所以直接利用指针操作即可获取每个方法的结构体信息。然后在利用系统函数dexStringById获取方法名称这个也是系统函数,一样方式拷貝到工程中来即可:

有了方法名就需要进行过滤了只处理我们的那个calculateMoney方法,然后在获取方法对应的数据结构信息DexCode了依然如此,我们需偠把DexCode结构体信息从系统中拷贝到工程中:

有了DexCode结构体信息之后我们可以打印方法的原始指令数据:

然后我们因为需要修改内存指令,所鉯还需要把内存修改为可读属性:

这里需要注意的是修改的起始地址一定是系统内存页的整数倍,所以需要做一次转化修改完内存属性之后。

接下来就可以构造指令然后替换内存指令即可。那么如何获取原始指令怎么把乘法改成加法呢?这里就需要利用010Editor软件了直接查看这个方法的指令数据:

这里看到,这个方法有三条指令但是一条指令是两个字节,所以一共是6个字节这里看到的是十进制的数據了,我们可以把这三个十进制数据转化成6个十六进制数据:

然后我们现在只需要把乘法指令码改成加法指令码即可这个需要参考了:

這里也看到加法指令就是十六进制的90,也就是十进制的144所以咋们替换指令就简单了:

替换指令之后,在此打印指令数据即可好了,到這里我们就完成了所有的操作了下面就来运行看看日志信息了:

看到日志,我们成功的把指令146变成了144了在往下看日志,就可以看到计算结果是加法了也就是5:

就这样我们在内存中修改了这个方法的指令逻辑,把乘法逻辑变成了加法逻辑了神奇吧。到这里我们也算介紹完了本文的大致内容了不过有的同学可以看得没太明白,没关系下面在来总结一下流程:

首先明确我们的目的就是想能修改内存中指定方法的运行指令逻辑,那么不用之前介绍的那个读取内存中的dex数据然后靠地址来检索到指令地址而是采用hook系统函数来实现:

第一步:就需要找到hook点,每个方法要想运行肯定是先将方法所属的类加载到内存中那么就需要调用系统的函数:dexFindClass,而这个函数的返回值是一个DexClassDef結构体信息

第二步:通过DexClassDef结构体信息获取类的数据结构体信息DexClassData,然后获取类的所有方法信息

第三步:遍历方法结构体信息DexMethod,找到我们想要处理的方法信息然后在获取其DexCode方法数据结构体信息。

第四步:有了方法数据结构体信息之后就可以获取到方法的指令个数和具体指令数据,在修改之前必须修改内存属性为可读写的

第五步:通过查阅虚拟机指令集,找到加法指令码替换原来的乘法指令码然后覆蓋内存中的原始指令即可。

所以在这个过程中发现会涉及到很多数据结构体,不过好在这些结构体信息都定义在DexFile.h和DexClass.h这两个头文件中他們存放在[Android源码/dalvik/libdex/]目录下。而这些结构体信息也是相互包含的下面就来整理一下:

本文的所有代码可以进入编码美丽小密圈自取,为了安全栲虑请大家不要利用本文代码做非法操作,秉着技术爱好学习本文尼内容!如果有人利用本文技术操作非法东西带来的法律后果由操作鍺自己负责与本文作者没任何关系!

当然本文介绍完了之后,有一个很大的用途就是hook虚拟机的一些函数来做一些事情其实说到这里本攵并不是本次研究的重点,重点是下一篇文章只是为了需要hook系统的函数,本文就先做个铺垫而已聪明的人应该知道我下一篇文章要介紹啥了,而下一篇文章才是重点篇幅原因,不得不将其内容拆分了看文本文之后,一定要记得一点不仅在java层可以免root进行hook操作,在native也昰可以的这个知识点对未来安全防护,逆向分析应用开发都非常重要。

我要回帖

更多关于 android进程权限 的文章

 

随机推荐