前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逆向实践:批量验证微信号是否存在

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

作者头像
FB客服
发布2018-02-26 17:26:13
3.2K0
发布2018-02-26 17:26:13
举报
文章被收录于专栏:FreeBufFreeBuf

一、前言

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应用的小例子,在这个过程中想必大家也发现了,只要运用得当,很多接口都可以用这个方法来加以利用,同时也能满足很多小需求。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、明确目标
  • 三、确定思路
  • 四、动手实践
    • 1、
      • 2、
        • 3、
          • 4、
          • 五、总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档