这里的伪装不是真的伪装,并不会让对方下线,也不能以对方的身份发送信息或发朋友圈之类。

这里的伪装可以让客户端上的信息完全变成目标对象的信息,连相册也变成对方的相册。所以,如果对方是好友则相册全是对方发朋友圈的内容,如果对方不是好友则只能看到部分内容。

动态修改的目标变量是m_nsUsrName、m_nsNickName、m_nsAliasName之类。

(1)一个漏洞

仅以修改m_nsUsrName为例。

微信运行起来后,把m_nsUsrName改写成一个陌生人(非好友)的用户名,在看到界面头像之类发生变化后,退出微信。

在这个陌生人再次登陆微信,小编也再次运行自己的微信时,会看到这样的提示: 
微信伪装他人_java

也就是,可以知道,目标对象在什么时候,在什么设备上,登陆了微信。

小白:那有什么,不就是告诉你我用iPhone吗,总比叶城主你用vivo高档多了。

叶孤城:你不觉得这个可以用来监视你女朋友是不是起床了吗?

小白:我女朋友不会用手机!


叶孤城:。。。

(2)用户名在哪里

同样,是class-dump几板斧的使用,在拿到类结构信息后,以lldb调试或hook输出信息的方式,定位变量所在类。

比如微信某个版本的CSetting类: 
微信伪装他人_java_02

所以,只需要把m_nsUsrName的“get”函数重写就好,比如用iosOpenDev来写的话:

NSString* m_nsUsrName() {
    if (g_canmodify) {
        return "wxid_tagetxxxid";
    }
    return %orig();
}

小白:喂,你能讲一下iosOpenDev吗?

叶孤城:这种资料很多,你会用浏览器吗?或者,等有兴趣的人来投稿分享给你吧,到时你要给红包她!

小白:她?

(2)何时修改

上面的代码,是在g_canmodify为YES时,才进行修改。比如可以在点击某个按钮后、或切到某个页面后,才把这个值置为YES,这时username才被更改。

如果一运行就更改这个值,会看到这样的提示: 
微信伪装他人_java_03

(3)修改效果

这里演示一下,把username改成小编心目中的牛人“锋哥”的用户名,看一下会有什么状况出现。

动态修改后,先看“我”这个页面: 
微信伪装他人_java_04

注意,头像秒变锋哥,而昵称跟微信号并没有变,因为这里只改用户名。

再看一下相册: 
微信伪装他人_java_05

可以看出,锋哥是一个很尽责推“编程牛人”公众号的人,他要服务于程序员,让他们轻松找到工作与情人…

小白:哇,这马屁够了吧!还找情人?

注意,相册“今天”那一行,是“奇哥”发的test信息,实际上并没有变成锋哥发的内容,因为这只是一个假的伪装者。另外,因为小编已经加了锋哥,所以能看到相册里面的所有内容。

而至于朋友圈的内容,则只有头像变成了锋哥的,其它还是小编自己朋友圈的内容。

https://mp.weixin.qq.com/s/O6qF8tow-4SqqBrPcuWaMg