美文网首页macOSiOS开发iOS开发
震惊! macOS 版微信竟可以这样消息防撤回

震惊! macOS 版微信竟可以这样消息防撤回

作者: TKkk | 来源:发表于2017-04-21 09:28 被阅读9070次

2017-10-11 ==> 新增窗口置顶 & 会话多选删除
2017-09-17 ==> 新增置底 & 免认证
2017-09-11 ==> 修复聊天记录消失的bug
2017-08-23 ==> 支持多回复
2017-08-16 ==> 新增远程控制 & 微信多开


一、 前言

前一阵子入了 iOS 逆向的坑,整了个微信机器人,不过由于是用自己的证书打包,因此只能用7天,之后还得重新打包,实在麻烦。于是就拿 macOS 动刀了。

本篇主要制作 macOS 版微信的插件,实现消息防撤回与自动回复的功能,从而熟悉 mac OS 插件制作,由于 (lan ai) macOS 逆向分析与 iOS 类似,且不像 iOS 有那么多的工具,因此花费的时间较多,这里暂不阐述。之后有时间再整理 iOS 逆向分析过程。

  • 基本原理:与 iOS 注入动态库类似,通过 app 启动时调用我们注入的库,从而进行 hook。
  • 插件 GitHub 地址: WeChatPlugin-MacOS
  • Demo 演示
消息防撤回.gif
自动回复.gif

二、安装与使用

  • 下载 WeChatPlugin, 先进行 Build (command + B),之后 Run (command + R)即可启动微信,此时插件注入完成。(若出现 Error 请往下看 3.5 注意 部分)

  • 登录微信,可在菜单栏-帮助中看到消息防撤回与自动回复。

  • 消息防撤回:点击开启消息防撤回或者快捷键command + t,即可开启、关闭。
  • 自动回复:点击开启自动回复或者快捷键conmand + k,将弹出自动回复设置的窗口,在窗口中输入关键字与回复内容,点击保存即可。(若无关键字保存,则所有消息都会自动回复)
自动回复设置.png
  • 卸载

    /Applications/WeChat.app/Contents/MacOS 目录中,删除 WeChatWeChatPlugin.framework,将WeChat_backup 重命名为 WeChat 即可。

三、plugin 制作

3.1 创建Framework

使用 Xcode 创建 macOS 的 Cocoa Framework.

创建Cocoa Framework.png

3.2 Edit Scheme…

编辑 Scheme,在 Debug 模式下启动 WeChat。


Edit Scheme.png choose executable.gif

3.3 添加Run Script

在 Build Phases 中添加 Run Script

add run scripe.gif

Script 内容如下

其中 app_name为要注入的app名称,framework_name`为插件名称。

#!/bin/bash
# 要注入的的app
app_name="WeChat"
# 此framework名字
framework_name="WeChatPlugin"
app_bundle_path="/Applications/${app_name}.app/Contents/MacOS"
app_executable_path="${app_bundle_path}/${app_name}"
app_executable_backup_path="${app_executable_path}_backup"
framework_path="${app_bundle_path}/${framework_name}.framework"
# 备份WeChat原始可执行文件
if [ ! -f "$app_executable_backup_path" ]
then
cp "$app_executable_path" "$app_executable_backup_path"
fi
cp -r "${BUILT_PRODUCTS_DIR}/${framework_name}.framework" ${app_bundle_path}
# 注入动态库
./insert_dylib --all-yes "${framework_path}/${framework_name}" "$app_executable_backup_path" "$app_executable_path"

其中insert_dylib来源于github(与iOS的insert_dylib不同)

3.4 创建 main.mm

创建 main.mm 文件,添加构造方法。

main.mm.png

此时,一运行,即可执行initalize中的方法,并启动微信。

因此,我们就可以在这里愉快的进行hook!!!

3.5 注意

  • 若 Error,提示无权限,请对 WeChat 赋予权限。
    sudo chmod -R 777 /Applications/WeChat.app
  • 若 Error,提示找不到 Framework,先进行 Build。

四、愉快的 hook (以撤回消息为例)

4.1 创建 NSObject 分类

新建 NSObject 分类,加入类方法+(void)hookWeChat;并在 main.mm 中执行该方法。之后所有的 hook 都可以在该类方法中进行。

#import "WeChat+hook.h"

static void __attribute__((constructor)) initialize(void) {
    NSLog(@"++++++++ WeChatPlugin loaded ++++++++");
    [NSObject hook_WeChat];
}

4.2 寻找注入点

首先使用class-dump,dump 出微信的头文件信息。(如何使用请左转iOS 逆向 - 微信 helloWorld)
因为在 iOS 中,微信撤回的函数为- (void)onRevokeMsg:(id)arg1;因此,我们在微信的头文件中搜索该方法,最终在MessageService.h中找到。

4.3 runtime 登场

到这里就要开始进行 hook 了,在+(void)hookWeChat;中进行methodExchange
MessageService- (void)onRevokeMsg:(id)arg1;方法实现替换成NSObject- (void)hook_onRevokeMsg:(id)msg方法。

+ (void)hookWeChat {
    //      微信撤回消息
    Method originalMethod = class_getInstanceMethod(objc_getClass("MessageService"), @selector(onRevokeMsg:));
    Method swizzledMethod = class_getInstanceMethod([self class], @selector(hook_onRevokeMsg:));
    if(originalMethod && swizzledMethod) {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

- (void)hook_onRevokeMsg:(id)msg {
    NSLog(@"=== TK-LOG-msg = %@===",msg);
    [self hook_onRevokeMsg:msg];
}

4.4 验证

由于是使用 Xcode,就不用像 iOS 逆向那样只能用 lldb 调试了。可以在- (void)hook_onRevokeMsg:(id)msg中打个断点,然后撤回消息看是否会触发。结果证明该方法确实是微信消息撤回的处理方法。

4.5 使用 Hopper Disassembler

接着我们在- (void)hook_onRevokeMsg:(id)msg中直接return就可以了。
然而这时候看不到到底是撤回了哪一条信息。我们可以在用户撤回的时候将下面的内容改成"拦截 xx 的一条撤回消息:xxxx"。

撤回.png

这时候就要使用神器 Hopper Disassembler.用hopper Disassembler 进行分析,分析- (void)onRevokeMsg:(id)arg1;的实现。(分析过程与 iOS 类似,这里暂不阐述)
最终得到了主要的代码实现。(完整代码在工程中)

MessageService *msgService = [[objc_getClass("MMServiceCenter") defaultCenter] getService:objc_getClass("MessageService")];
MessageData *revokeMsgData = [msgService GetMsgData:session svrId:[newmsgid integerValue]];
MessageData *newMsgData = ({
        MessageData *msg = [[objc_getClass("MessageData") alloc] initWithMsgType:0x2710];
        [msg setFromUsrName:revokeMsgData.toUsrName];
        [msg setToUsrName:revokeMsgData.fromUsrName];
        [msg setMsgStatus:4];
        [msg setMsgContent:newMsgContent];
        [msg setMsgCreateTime:[revokeMsgData msgCreateTime]];
        [msg setMesLocalID:[revokeMsgData mesLocalID]];
        
        msg;
    });
    
[msgService AddLocalMsg:session msgData:newMsgData];

五、效果

点击菜单栏-帮助-开启消息防撤回,当好友撤回消息是可以看到提示。

消息防撤回.gif

六、小结

最终我们得到了拥有消息防撤回与自动回复的 macOS 版微信,虽然整个过程挺简单的,但主要目标是为了熟悉了如何制作 macOS 插件的过程,这样以后就可以给 macOS 上的 app 增加点小功能了。

由于本人还只是个逆向新手,难免会有所疏漏,还请大牛们指正。
本项目仅供学习参考。

七、参考

如何愉快地在Mac上刷朋友圈

相关文章

网友评论

  • 7bc681a7055d:能有个Win10版本的吗?
    nodzhang:能有个win7版么
  • 356448bcb3d8:要是想把 注入后的工程给同事电脑也安装一个 直接打dmg好像不行额
  • Bug集:有没有qq的插件:heart_eyes:
  • Bug集:cp: /Users/potter/Library/Developer/Xcode/DerivedData/WeChatPlugin-crlasqtvsupwsqgehfvoflprcghj/Build/Products/Debug/WeChatPlugin.framework/Modules: No such file or directory
    cp: /Users/potter/Library/Developer/Xcode/DerivedData/WeChatPlugin-crlasqtvsupwsqgehfvoflprcghj/Build/Products/Debug/WeChatPlugin.framework/Modules: No such file or directory
    /Applications/WeChat.app/Contents/MacOS/WeChat already exists. Overwrite it? [y/n] y
    LC_CODE_SIGNATURE load command found. Remove it? [y/n] y
    Added LC_LOAD_DYLIB to /Applications/WeChat.app/Contents/MacOS/WeChat
    Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure
    Bug集:直接用脚本安装了
  • ec4191326dc4:厉害 准备入坑逆向... .多多指教...
  • 1ca70fc2aa4d:厉害,特定注册一下来评论。还有一个问题,想请教,mac 版本的微信占用CPU 和内存过高有没有办法解决?
  • helloDolin:厉害了,我的哥
    TKkk:@helloDolin 射射:smirk:
  • kang_KK:很棒啊!!!!我很喜欢! ! ! !
  • 9928fee320b2:看了半天写一个数字觉得好复杂,比如我想模糊查一个车牌号“京A123DC”的信息,我输入“123”就可以模糊查询到这个号码“京A123DC”,如有重复的,我就设置需要输入“123DC” 才能查到 “京A123DC”
    TKkk:@无头男尸 正则的话水太深,要学好挺费时间,也不用去学,要用的时候百度下就行了,比如你说的“京A123DC”,搜一下“正则 特定字符”,就可以知道要这么写了 “.*京A123DC.*”
  • Mrshang110:iOS抢红包有人写了,貌似mac还没人写,你可以为你的项目新增这个功能
  • 勇敢的呆喵:UC震惊部不服就服你:clap:
  • df1a743dae81:十分感谢!过程看着很有收获~
    但有个问题想问一下,如果macOS的微信更新后插件会继续存在还是需要重新安装一次?
    df1a743dae81:@TKkk 好的,十分感谢!
    TKkk:@kazma_na 是的,因为需要重新注入…
  • 9928fee320b2:支持楼主 一直在追你的更新 新版把自动回复再优化 优化,比如:“你好” 如果被人输入 “你好你好“ 就不好使了, 或者”你好XXX“也不好使,还有英文字母大小写 也是无法区分。我不太懂啊 是不是可以 自动区分英文大小写,
    特意注册一个账户支持你 也只找到这个地方可以留言给你。
    9928fee320b2:@TKkk 不会正则表达式啊 不太懂啊 能不能转一个简单的说明和使用方法啊,更新你的新版了,现在是第一个微信可以免登陆了,但是第二个就不行了,这个好像有点困难哈,就不难为你了,继续支持,希望持续更新,看看大家的要求哈 ~ 顶
    TKkk:@无头男尸 谢谢谢谢谢谢支持,其实自动回复是精确匹配的,就是要完全一致才会回复,因此没有做英文大小写的判断。另外为什么不模糊匹配是因为怕误触发自动回复,就比如你说的这个“你好”,如果是别人发了“你好像知道什么”,也是会自动回复的。虽然可以用正则来处理,但是一般的用户不会用正则,或者说没办法测试自己的正则是否正确而又误触发自动回复。后面的话我再加个正则进去好了,之后使用者要清楚自己的正则是否正确就是了。
  • gujiangjiang:支持啊,简直厉害’
  • zero_zql:为啥之前的聊天记录全没了
    5906055820d4:试着拷贝聊天记录或者重新拷贝一份安装好插件的Wechat放到别的路径下都不行 :joy:
    zero_zql:@TKkk 👌,不过还是建议提示下使用的基友们,怕有些重度依赖者。资料全在里面顿时奔溃了
    TKkk:@zero_zql 注入动态库,沙盒位置改了,所以聊天记录没了。可以先卸载,卸载后所有的记录跟未安装时一样
  • e71f89d7c11d:想自动回复图片,不知道有没有 找到发送媒体消息的方法类似SendTextMessage的原始方法
  • 0e37276edafc:希望QQ里面也可以制作类似防止撤回的插件 谢谢 不介意花钱支持!
    TKkk:@老夫即是正义 nice
    0e37276edafc:@TKkk 结果一搜就找到了。。。谢谢
    TKkk:这个以前写过…还有自动回复的,只是找不到了。其实很简单,只要hook
    QQMessageRevokeEngine类 的对象方法handleRecallNotify:isOnline: 就行了。github 上面应该有,去搜一下
  • 三十一_iOS:厉害厉害
  • 鬼晓晓:文章很好 就是标题有点哗众取宠了
    TKkk:@鬼才晓得 毕竟是要进UC震惊部的男人
  • 1d2aa59a2e8b:<如何愉快地在Mac上刷朋友圈>参考的这篇文章看不了:joy:
    TKkk:@Tk_Jacky 这模块就有点大了:joy: :joy: 你可以去github上搜搜,我记得有人fork了那个文章的源代码
    1d2aa59a2e8b:@TKkk 大佬能捣鼓个朋友圈不:flushed:
    TKkk:@Tk_Jacky 原作者删了…
  • 2d4f32296da8:超级新手,怎么进行build和run。。。
    2d4f32296da8:@TKkk 谢谢你!
    TKkk:更新了 Github,为你写了个脚本。如果没有安装Xcode,可以用终端运行Install.sh。详细看github
    TKkk:@Hunddd 是否有安装 Xcode?
  • 73号王先森:仔细看了一下代码 能学习的有很多 太喜欢楼主这样的有钻研精神的人 而且还是在关键有用的软件上下手~
    TKkk:@73号王先森 谢谢哈哈哈,有需求才有动力
  • 73号王先森:厉害厉害 亲测好用 支持黑科技!
  • sky_kYU:最新版本的微信是不是就不可以了 启动不起来闪退
    sky_kYU:@TKkk 我用的是最新版的mac微信
    sky_kYU:@TKkk 是的 进不去 类似于app进不到首页
    TKkk:@SKY鱼 是一启动微信就立马闪退么
  • ba7fc5937070:关注你了,不知道你是否有商业合作的意向 有的话加我QQ 767872
    TKkk:@TieLang 不好意思,做这个仅仅只是出于兴趣,无这方面的打算
  • 开心的话蜜瓜:厉害了!有空写写iOS的防撤回呀
    73号王先森:iOS现在越狱打flex补丁可以 不越狱作者也说了 因为签名7天过期很麻烦
  • luban_:一开始还以为是个标题党,没想满满的干货。6
    TKkk:@iyifei咖啡 毕竟是要进UC震惊部的男人:smirk:
  • Pusswzy:厉害, 但是在简书里面碰见这么好的文章,我都会怀疑一下是不是转载的, 如果是原创的话, 真的佩服
    TKkk:原创的,里面代码、截图都可以看到"tk"。只是有些工具用的是别人写的,站在巨人的肩膀上敲代码。
  • 4b3bb5eef806:学习了老铁
    TKkk:可以的大兄弟
  • zhanghengiOS:很厉害呀,你是怎么入门逆向的呀?
    TKkk:@zhanghengiOS 主要是看《iOS应用逆向工程 第2版》,但有些工具没有用这本书的,在网上找的。

本文标题:震惊! macOS 版微信竟可以这样消息防撤回

本文链接:https://www.haomeiwen.com/subject/uixiottx.html