专栏首页FreeBuf逆向实践:批量验证微信号是否存在

逆向实践:批量验证微信号是否存在

一、前言

xposed是一款安卓平台下强大的hook框架,我们可以用他来开发很多强大的插件,以此来帮助我们更方便地解决某些实际的问题。本文将尝试利用xposed来解决一个实际问题:如何批量地验证微信号是否存在。

二、明确目标

现在手头有一批微信号,想要分辨出其中哪些是有效存在的,哪些是不存在的。显然如果直接手动去微信上一条条搜索,会是一件很麻烦的事情,接下来就要研究如何来批量地验证这批微信号。首先来看一下这个搜索接口:

从图中可以看出事实上这个接口还可以根据qq号和手机号来搜索某个微信号是否存在。我们的目的就是希望能够自动地可控地大量地来调用这个接口帮我们进行验证。

三、确定思路

明确了目标之后,我们就会想到,得到这个接口的函数调用栈是很重要的,这样我们就可以在关键函数上下hook点,然后插入我们自己的逻辑代码,以此来随心所欲地控制这个接口,达到我们最终的目的。所以大致可以总结出这样的步骤:1、得到这个过程中重要的函数调用栈。2、从函数调用栈中找到合适的函数,hook这个函数。3、思考整个批量验证的逻辑,插入我们自己的逻辑代码,实现xposed插件,以此来控制整个验证流程。4、用一小批样例来验证我们的插件是否有效。

四、动手实践

1、

如何得到一个过程的函数调用栈?这是一个我们在逆向的过程中经常会遇到的问题。最开始接触逆向的时候我只会用关键字搜索,后来接触的工具多了,发现用andbug不错,可以把一个点击过程中的所有过程都弄出来,直到前几个月在看雪上看到TraceReader,才发现原来有更好用的工具。其实逆向的好工具有很多,能用的顺手的工具就是好工具,具体的工具的用法我就不在这里赘述了。

我用的是TraceReader。得到一堆函数调用栈之后,接下来就要找我们需要的调用栈,我认为这是整个过程中最难的问题。因为这个时候得到的函数量往往很大很大,而我们根本不知道我们需要的函数的名字是什么,如果又碰上微信这种混淆超级变态的应用,那么这一步往往就要花费我们大量的时间。这一步没有什么好的办法,运气是最关键的因素,然后就是根据种种迹象来推理我们需要的函数的位置。八仙过海各显神通,我来说说我的做法。因为这个接口的功能是“搜索某个微信号是否存在”,所以我先用关键字“search”来碰运气,当然那么多函数,包含这个关键字的函数有很多。然后我再在这些包含“search”的函数里一个个去看,结果运气不错,找到一个既带“search”,又带“AddFriendUI”的函数。根据函数名,这个函数很大可能就是我们要找的函数。如图:

接下来验证一下我们找的对不对,用xposed来hook这个“AL”函数,打印出他的参数,xposed的用法网上很多,不再说明。最后结果如图:

我在搜索框随便输入了一串字符串,结果打印出来的这个“AL”函数的输入参数正是我输入的字符串,看来找的位置不错,那个这个函数所在的整个函数调用栈就是我们要找的东西了,用jeb逆他的代码后可以仔细地看一下这些函数,帮助我们理解整个过程。

2、

接下来是找合适的hook函数。其实hook函数需要两个,一个是hook请求,以此来控制整个批量验证流程;另外一个是hook应答部分,以此判断当前验证的微信号的返回结果。

请求的hook函数暂时就定为前面找的”AL”函数,如果之后测试的时候出现问题再考虑换,这一步并没有确定的答案,只能是通过实际的测试来验证,所以选哪个函数无所谓,到时候不行的话再返回来看源码,重新选择测试即可。

应答的hook函数一般可以通过看前面的请求函数调用栈来找,但也不绝对,找的方法和前面一样,怀疑哪里就测试哪里。这一步我是在请求的调用栈中找的,但是找了好多地方都没有找到一个合适的位置,然后也没耐心继续找了,就用了个取巧的办法。一个微信号不存在和存在的返回页面是不同的,如图:

显然我们可以根据返回页面的不同来判断当前的微信号是否存在。接下来查看一下两个页面的activity,如图:

可见两种情况的activity是不同的,当微信号存在时,会返回该微信号的信息界面,该界面的activity是ContactInfoUI,那么我们就可以通过hook这个activity,判断这个activity是否被创建,来判断某个微信号是否存在。接下来验证一下我们的猜想,hook一下这个类的构造器:

生效后来看下效果:

确实按照我们的预想打印出了“YES”,也就验证了我们的猜想。

3、

批量验证逻辑这部分也没有确定的模式,完全可以根据个人的需求来进行定制。值得一提的是,上一步中hook的位置和这一步逻辑的设计有很大关联。比如说,在上一步中,我没有找到一个很好的应答hook位置,只是取巧根据activity来判断,那么也就是说,只有当一个微信号的搜索结果页面被加载出来之后,我才能对结果进行判断,这中间就会产生出很多问题。比如我必须控制两个请求之间的间隔时间,留出充分时间来让搜索结果界面进行加载。又比如当微信号数量比较大的时候,持续的页面加载会消耗大量内存,导致程序越来越慢,甚至机器发热,损耗电池。而这些问题都是必须在设计程序时应该考虑的问题。反之,如果前一步找的hook位置更合适的话,那么后续就会简单方便很多。欠下的债总是要还的,总的来说如果前面偷懒了,那么相应的后面就麻烦很多,而如果前面下了功夫,那么后面就会更轻松。条条大路通罗马,具体在整个过程中如何选择,最好根据自己实际的需求和手头上的资源来确定。

现在我们只是做一个简单的测试,并不用考虑太多。我的想法是截断上面找到的“AL”函数,并自己控制对他的循环调用,代码比较粗糙,也不贴上来了,直接看最后的结果。

4、

输入的微信号存在txt文件里,放在sdcard中,输出最后的判断结果,也存成文件,在正确的微信号后面加上“YES”标签,如图:

五、总结

本文只是一个xposed应用的小例子,在这个过程中想必大家也发现了,只要运用得当,很多接口都可以用这个方法来加以利用,同时也能满足很多小需求。

当然如果进一步考虑对方的风控规则,整个流程的自动化等等的因素之后,这种方法同样也能满足一些大的需求,大家可以自行探索。

本文分享自微信公众号 - FreeBuf(freebuf),作者:siotb

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信也被监控:HackingTeam语音监控代码分析

    在HackingTeam泄漏的文件,我们发现了有针对主流聊天软件中的语音进行监控的代码,其中包括国内常用的微信。下面就以微信为例,来分析一下HackingTea...

    FB客服
  • 逆向分析Spotify.app并hook其功能获取数据

    在开始本文的正式内容之前我想先来吐槽下。大多数的软件开发人员可能都有着这样一个烦恼,就是由于工作和其他责任,不得不搁置自己的一些个人项目甚至是最终完全的遗忘和埋...

    FB客服
  • 如何把SQLMap里的功能移植到自己的程序中?

    不知道各位有没有听过不要重复造轮子?因为有些开源的工具,它们经过时间和众人的捶打,其实会比我们自己一个人造出来的轮子考虑的更加周到和全面。可是有时候有些开源工具...

    FB客服
  • 深度神经网络中的数学,对你来说会不会太难?

    选自MIT 机器之心编译 参与:Jane W 这是一篇讲解深度学习数学的系列文章,但并非是基础数学,还涉及到了拓扑与测度论等内容。本文为该系列文章的第一部分,...

    机器之心
  • C++中函数重载、隐藏、覆盖和重写的区别

    C++规定在同一作用域中,同名函数的形式参数(指参数的个数、类型或者顺序)不同时,构成函数重载。

    Dabelv
  • 马云上市公开信:我本身就充满争议

    大数据文摘
  • macos 系统 Nday 漏洞从挖掘到利用

    最近挖了三个 Nday 漏洞,结合在一起能够实现 MacOS 的内核本地提权,就当作一个练手的小项目分享给大家,下面先讲一下这三个小漏洞:

    信安之路
  • 【Pytorch 】笔记八:Tensorboard 可视化与 Hook 机制

    疫情在家的这段时间,想系统的学习一遍 Pytorch 基础知识,因为我发现虽然直接 Pytorch 实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这...

    阿泽 Crz
  • 关于xml中大于等于、小于等于解析错误,还有就是在xml里面根据对应的时间字段查询近一年内的数据

    1.CDATA区:它的全称为character data,以"<![CDATA[ "开始,以" ]]>" 结束,在两者之间嵌入不想被解析程序解析的原始数据,解析...

    一天不写程序难受
  • 注意力机制下的激活函数:自适应参数化ReLU

    本文在综述传统激活函数和注意力机制的基础上,解读了一种注意力机制下的激活函数,即自适应参数化修正线性单元(Adaptively Parametric Recti...

    用户6831054

扫码关注云+社区

领取腾讯云代金券