记一次动态调试和hook位置信息过程

一、目标与准备工作


我的目标就是hook某些函数,达到修改app位置信息的目的,差不多就是模拟定位。但是我试过几款xposed模块,发现都无法hook定位。于是只能自己动手来丰衣足食了。


我先是在百度上找安卓获取定位信息的原理,发现有很多种,比如IP定位,GPS定位等,于是我直接锁定了GPS定位。安卓利用GPS定位有两个主要方法:


android.location.Location类的double getLongitude()返回经度 和 double getLatitude()返回纬度,换成smali就是
  1. Landroid/location/Location;->getLatitude()D
  2. Landroid/location/Location;->getLongitude()D

复制代码

二、理论存在,实践开始


我直接hook修改这两个方法的返回值,结果就是:没有任何卵用。于是我又去dex搜了下,结果并没有发现有继承android.location.Location的类,所以这条路就算走断了。


但是,当我搜索这两个方法名时,发现出现了n个结果,这不就又有条路子了?那么怎么在这一堆方法中确定我想要的方法呢?我用的是log插桩的办法来进一步缩小范围:

 

-1

 

由于这两个主要方法的返回值都是double类型,所以我就打印所有是double类型的返回值。打印结果就不展示了,这两个方法返回的一个是经度一个是纬度,我所在的经度是108.xxx,所以我就直接搜了108.,不出所料,有两个方法在不断返回经度和纬度,进到这两个方法发现,都是调用的接口类的抽象方法:

 

-2

 

invoke-interface就是调用接口类的抽象方法,下面图中用abstract修饰的方法就是抽象方法。

 

-3

 

我尝试过直接hook这个抽象方法,但是没有用。那针对这些抽象方法要怎么改呢?我认为,针对接口类(interface class),找实现(implements)它的类;针对抽象类(abstract class),找继承(extends ,smali中是super)于它的类。
既然这个类是接口类,那我就找实现它的类,搜implements 类名

-4

 

结果就是只找到一个,这不就好办了?老样子,hook这个类中的重写方法(getLatitude和getLongitude)。你猜怎么着,当我自信满满得用simplehook来hook完打开后,位置还是没有变!简直是离天下之大普,这玩意java层就只有这个类实现了那个接口类的呀,难不成在so层?本着不达目的不罢休的原则加上正己大佬关于动态调试的方法,我也踏上了动态调试(java层)之路。

 

三、小白初战动态调试

 

3.1使用jeb调试

 

按照正己大佬的教程弄好一切环境之后,直接打开jeb,找到之前log日志里面的调用抽象方法的方法,在invoke-interface那段下个断点,adb以调试模式启动软件:

 

-5

 

由于在使用jeb调试的时候,调试的对象是那个软件的旧版本,所以图中画圈的结果和后面使用androidstudio调试的结果会略有不同。看上图的调试结果,这个类就是实现了上文提到的那个接口类,但是,我硬是在apk中的dex里面搜不到这个类。此时我的脑子是懵逼的,十万个为什么在脑子里打转。直到后面用androidstudio调试才弄明白了。至于为什么会想到用as来调试,请看jeb调试的小插曲:
第一次用jeb调试这么大的软件,一开始jeb一直限定使用内存在4G,然后我就一直卡在3.9G,最后以报错提示结束。看看上图,调试这个软件我用了差不多11G。那么怎么突破内存上限呢?我试过百度上的很多方法,只找到一个有用的,就是在jeb的根目录那(就是有jeb_wincon.bat这个文件的目录),新建一个jvmopt.txt文件,打开这个txt,里面写-Xmx11000m这里的11000就是内存上限。在搜索如何突破内存上限的过程中,我看到了用androidstudio来调试apk的内容,抱着试一试的心态,我打开了androidstudio…

3.2使用androidstudio(以下简称as)调试

 

具体的教程百度上都有,主要还是在as上安装个smalidea-0.06插件。一切就绪,调试开始:

 

-6

 

由于用as调试的时候,调试对象被我换成了最新版本,所以这里的类和上面jeb调试的结果会不同。找到了这个类,as里面还提供了更多的细节:

 

-7

 

 

 

这直接把这个类的classloader搞出来了,其中包含了这个类所在的dex,它居然在data/data !我就说为什么在apk的dex里面搜不到。百度了下才知道,这原来就叫dex的动态加载。现在换到手机,进入上图路径里面的dex,implements 类名

 

-8

 

果不其然,找到了这个类重写的方法,直接hook这些方法。
可恶然而,就在我以为势在必得的时候,发现不论是simplehookR1.3.3还是算法助手2.1都是hook不到的

 

-9我真的哭死
后来又想到可能这玩意是动态加载的dex,所以hook不到,既然说到动态加载,我又找到了正己大佬的hook multiDex的方法

 

《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为
复制粘贴到as,生成apk,lsp选作用域,打开被hook的软件,一切都似乎在好的方向发展。

 

结果却又又又给我当头一棒,还是hook不到。然后又复制的百度上的一些hook multiDex的方法,一样还是不行。于是我试着打印获取的所有类,结果如图:

-10

搜索一番,并没有上面调试出现的那个类。正当我准备放弃的时候,@子夜猫说:算法助手可以hook到!他截图发给我,我才知道他用的算法助手2.1.0版本,我也试了下发现真的可行

 

-11

 

算法2.1和算法2.1.0版本在作用域上的区别就是2.1.0包含了系统框架,我猜算法2.1.0可以hook这种dex应该和这个有点关系吧?军哥牛逼

 

-12

标签

发表评论