记录4月作出的一点微小工作

    令人惆怅(……)的4月已经过半,回想一下这半月来自己的状态,依旧可以用咸鱼二字概括。为了防止自己忘记暂且记录下这半个月完成的事情。

    1.关于xposed hook

    之前早在3月就用xposed简单的实现了对定位、发送短信和录音的关键函数的Hook。后面就开始写针对这三种服务获取过程的hook,看应用层代码发现定位和短信发送获取服务都会用到getSystemService函数。例如:

mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
    然后想用xposed hook getSystemService这一函数,失败后才发现getSystemService是抽象函数(基本没有研究过Android源码的我QAQ)所以无法用xposed hook到的。于是顺着源码看了下,发现在ContextImpl.java文件中,实际获取服务的函数是getService。
registerService(LOCATION_SERVICE, new ServiceFetcher() {
                public Object createService(ContextImpl ctx) {
                    IBinder b = ServiceManager.getService(LOCATION_SERVICE);
                    return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
                }});

    通过打印函数的参数也可以区分出是调用的哪种系统服务(定位或是短信发送)。除此之外本来还想找出录音服务获取的函数然后Hook(之前在应用层Hook的函数是start,stop,setAudioSource),但是查看源码/frameworks/base/media/java/android/media/MediaRecorder.java发现,start和stop函数其实是native方法。

public native void start() throws IllegalStateException;
public native void stop() throws IllegalStateException;
    于是关于用xposed hook这三种服务就只完成到这种程度了。

    2.关于从native层直接获取地理位置

    这个是参考的github上的一个例子,主要是对照着com_android_server_location_GpsLocationProvider.cpp代码稍作修改,将文件放在Android源码中编译(因为需要用到源码中的头文件)为可执行文件,然后直接在Android设备上运行来获取地理位置信息。之前在真机上测试时,无论如何都拿不到location的回调(其中就是我们想要的经纬度信息),然后就开始了漫长的一边摸鱼一边换运行环境的过程......因为想到手头上的手机可能有厂商定制的内容,再加上之前文件是在Android4.4源码中编译的,所以索性把4.4的源码编译了一遍,然后把镜像刷进了手机(此过程参考了一篇博客,写得十分详细http://blog.csdn.net/qq1084283172/article/details/54562606)。运行之后发现仍然不行,于是又考虑可能因为实在室内,gps信号弱定位不到是常事,所以改用虚拟机进行测试,因为Genymotion虚拟机是x86架构,于是又重新将文件编译为x86下的可执行文件。运行后发现依然不行......

    其实中间停停做做折腾了很久,感觉都要放弃这个方法了,但是就在某一天在修改利用binder获取地理位置信息的时候,为了方便打印想看到的信息,我把本来是共享库的文件编译成了可执行文件,直接在设备中运行,然后发现之前可以拿到的经纬度如今都变成了0,即使在虚拟机中测试发送了虚拟地理位置信息,也依然拿不到想要的结果。于是打印exceptioncode,发现ExceptionCode是-1,查看源码发现-1代表SecurityException,似乎是权限问题,可执行文件没有获取地理位置信息的权限,然后又改为so文件通过在app中加载来调用,发现可以成功获取地理位置信息。以此类推,我开始思考当时native层一直没能拿到location回调会不会也是因为可执行文件的权限问题......

    于是把代码稍微修改,编译为so文件,在app中加载调用,虽然运行的时候大概率会应用无响应,但最终还是成功的拿到了想要的经纬度信息。

    不过目前只在虚拟机上测试成功,在真机上测试的时候返回的经纬度依然是0。我没有太搞清楚虚拟机上模拟地理位置的原理,因为真机上测试gps信号弱的原因,我在网上下载了模拟地理位置的代码,编译后安装在真机上,java层和jni反射调用地理位置都成功了,但涉及到binder获取和native层就返回值为0。下一步打算弄明白虚拟机模拟地理位置的原理,看看和真机上的那个模拟代码有何区别,然后再真机上也能运行处想要的结果。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值