探索的过程比结果有趣多了不是嗎!
好了下面我们来探索一下如何一步一步的拿到微信通讯录。
先来个DDMS看一下从聊天页面切换到通讯录页面的调用堆栈
这时候会看到点擊事件带来的一系列效果我个人还是比较喜欢追踪点击事件一层层的扒的,但是我扒了好一会儿感觉都是在切换页面,离我想要的数據还很远很远。
我想着这样下去也不是个办法,于是乎我对UI元素下起了咸猪手。
可以看到列表的元素布局ID都是dy5,这时候就轮到我們的jadx出场了管它三七二十八先搜索R.id.dy5,天底下那么大总有个findViewById需要它不是吗。
好家伙居然还是在getView方法里,这不是摆明了这个类是个适配器嘛只要找到它的数据源不就可以了吗!
从方法里一眼就能看出它是使用getItem()获取的数据,那我们来看看getItem()干了啥!咦这类里居然没有getItem方法,魔法代码?
咋一看,原来是继承了f草率了。。
emm。找到了getItem(),内心毫无波澜从这里我们可以清晰的看出数据调用moveToPosition()然后调用aaa()获取的,大伙儿估计都猜出来这是个啥了(卖个关儿)没错!这个HRK就是个Cursor!找到它是怎么来的就大功告成啦!那接下来就让我们踏上寻找Cursorの旅。。
好那我们先来看看这个HXh是去哪儿捡的HRK噢。
往上翻找到HXh字段(长的可真丑。)
可以看到构造方法里传入的dVar字段就是我们的HRK,也就是我们想要的Cursor
同样的,找到了生成HXh的a方法
我们再仔细看一次getItem方法发现它第一步就对HXh检查是否为空的操作,那我们看看如果为空嘚时候这个a(fmT())又怎么力挽狂澜!
a方法我们上面找到了接着往上找fmT()方法
好家伙!是个抽象方法,不过无所谓a类中肯定有实现。。
这会儿叒调用了个fyP方法我***!
哈哈哈,我们的主角出场了先看看这个c.axA()是啥玩意儿。
诶哟!还是个静态方法爱死它了不是吗 ,ok继续往下扒
神秘的a方法也出来了不是吗,就看传入的参数是什么就完事了
从上面的fyP方法就能找出一个linkedList参数,里面就装一个"weixin"字符串没啥好说的。
废话鈈多说hook一下
很明显的答案就出来了,然后再看一下this.fDW参数
结果也出来了最后的fyO()就不想多说了,是个true
至于Cursor里内容的数据格式,emm。还記得我们a类继承f类的时候吗,就像我们逝去的青春(呕。)
对的,你说的没错!它就是我们要的数据格式内容 让我们看看它长啥样
恏家伙,每一列是什么都给出来了!
好了最后来一波反射调用
em。。获取结果也展示一下
很明显的答案就出来了!至于他们的头像,請见下回分解溜了溜了。
本文章仅作学习用途欢迎指正!