这段时间在忙着新版本SDK的开发,也在准备换工作的事情,虽然现在是“寒潮”,但是还是想走出舒适区,去感受一下春天的“寒冷”。也很久没有接触逆向方面的工作了,昨天一个大学同学问我,能不能通过一个人的手机号以及微信号找到那个人对应的wxid,其实我也不清楚,但是我们来尝试一下找一下。
1. wxid 是什么?
wxid是顾名思义就是微信的ID,也就是一个手机号码刚注册的时候,微信给予用户的一个初始化ID,这个和后面的微信号其实是分开的,经过我测试,如果设置了微信号之后,可能原始的wxid就会被覆盖。但是也有一些是不会被覆盖的,这个就不清楚微信是怎么处理的了。
2. 开始wxid的寻找之旅
2.1 分析
当我们通过手机号码查找一个人的时候,查找出来的界面是只会显示下面的信息,不会有wxid或者微信号这样的信息。
但是直觉告诉我,既然已经搜出来这个人,那么这个控制器里面肯定有一个包含这个人信息的对象,看一下那个对象里面的全部信息,可能会找到我想要的。所以我们的目标就是找到这个对象的控制器,然后看看里面有没有一个类似于联系人之类的对象,然后再看一下这个对象里面的属性。Let’s do it.
2.2 探究
在探究之前如果你不清楚LLDB+DebugServer的使用可以看这里
2.3 首先拿出我那台祖传的iPhone,连上数据线,然后SSH登陆上去:
- iTerm打开一个窗口,将本地的2222端口映射到iPhone的22端口
1 | Last login: Thu Mar 28 11:20:01 on ttys003 |
- iTerm打开另外一个窗口,通过ssh连接上去
1 | LemonsMcBookPro:~ lemon$ ssh root@localhost -p 2222 |
2.4 登陆上去之后,看一下当前微信的进程ID,然后通过将debugserver挂到微信上面,然后接受来自LLDB的命令,达到动态调试微信的目的。
- 先在手机运行微信,然后查找微信的进程ID,然后通过debugserver监听来自1234端口的消息。
1 | LemonsMcBookPro:~ lemon$ ssh root@localhost -p 2222 |
- 此时debugserver正在监听1234端口的消息。此时我们还是通过将本地的1234端口映射到iPhone的1234端口,然后连接本地的1234端口。
iTerm 打开一个新窗口
1 | Last login: Thu Mar 28 11:20:24 on ttys003 |
iTerm 打开一个新窗口
1 | Last login: Thu Mar 28 11:31:52 on ttys005 |
- 此时微信的进程已经停止了,并且正在等待我们的命令。我们先输入c让进程继续。(这是LLDB的基础命令,c代表continue)
2.5 打开目标界面,查找目标对象
上面我们已经将LLDB挂到微信上面了,接下来我们先搜索一个手机号,然后去到添加联系人界面。
我们搜索到联系人之后,我们需要找到当前界面的控制器。下面是关键命令:
1 | (lldb) process interrupt |
process interrupt: 中断当前进程
[[[UIApplication sharedApplication]keyWindow]recursiveDescription] : 答应当前界面的信息,此时会显示所有的界面的元素。
此时我们可以根据名字“默默等待”来找到到对应的Label,然后通过这个label的找到对应ViewController。使用nextResponder一级一级的找到对应的ViewController。通过上面的信息我们可以看到当前的ViewController是ContactInfoViewController。
2.6 打印对象属性。
- 打印ContactInfoViewController的所有成员变量。
1 | (lldb) po [0x13fc0c400 _ivarDescription] |
这个时候我们可以看到在最上面有一个
m_contact (CContact*): <CSearchedContact: 0x1433b0550>
我猜测这个应该是我们搜索出来的微信号信息的对象,我们可以试着打印一下这个对象看看。
1 | (lldb) po [0x1433b0550 _ivarDescription] |
结果没有让我们失望,到这里已经看到了m_nsFullPY这个属性包含的就是wxid。这次逆向很简单,都没有用到静态分析看汇编代码等方法,直接就能实现我们想做的。
最后有个小tips,一般通过wxid是加不了好友的,但是在wxid前面加几个汉字可以搜索到好友哦。