吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 24663|回复: 132
收起左侧

[原创] PC微信逆向--实现消息防撤回

    [复制链接]
luoyesiqiu 发表于 2020-3-7 11:21
本帖最后由 luoyesiqiu 于 2020-3-14 00:38 编辑

自从聊天软件消息撤回功能问世后,对于撤回的消息,我们对它一直有种强烈的好奇感。“Ta刚撤回了什么?是骂我的话?还是说喜欢我?还是把发给其他人的消息误发给了我?好气呀,都看不到了...”这是我们看到消息被撤回后的内心独白。但是今天,看完了本篇文章你就可以说:
表情包.png
我们看一下效果图,撤回的消息被我们看到了,相当于防(防止)撤回

view.png

好了,看完效果,接下来我们看一下怎么找到它的位置,并用代码hook它。

本文用到的软件工具:

  • 微信 2.8.0.121
  • Cheat Engine 7.0(用于内存搜索,下文简称CE)
  • Ollydbg吾爱破解版(用于动态调试,下文简称OD)
  • Visual Studio 2017(用于编写Hook代码,下文简称VS)

用CE打开微信进程
ce_open.png

用另一个微信号给在电脑登录的微信号随机发一条消息,勾选UTF-16选项,然后在CE中搜索消息内容

ce_search.png

撤回消息,看到一条xml消息,双击它添加到地址列表
ce_xml.png

打开OD,附加微信进程,用dd命令定位到上面的那个地址

od_location.png

再给电脑登录那个微信号发一条消息,然后在上面那个地址下内存写入断点,再把消息撤回,此时断点被触发,微信被断下,断下后,删除内存断点。在堆栈里寻找我们想要的内容,看到一个包含撤回提示wxid撤回内容的call
wxid,tips,msg.png
在反汇编窗口中跟随这个call,点击这个call,按F2在该call下断点,按F9继续运行。再给在电脑登录那个微信号发一条消息并撤回,该call断下

call的汇编.png

说明,这个call就是我们要找的消息撤回的位置,而且它有我们想要的数据

找到时的堆栈.png

找到了call,来整理一下该call的数据,数据都是存在堆栈里,所以有:

  • esp + 0x4 :撤回消息的提示
  • esp + 0x50 : 撤回消息人的wxid
  • esp + 0x78 : 撤回消息的内容

接下来编写一个dll,来hook这个call。在VS创建一个dll项目,核心代码如下:

#include "resource.h"
#include "hook.h"
#include "module.h"
#include <wchar.h>
INT_PTR CALLBACK Dlgproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void DlgThread(HMODULE hInstance);

#define REVOCK_CALL_RVA 0x28c33f
#define REVOCK_CALL_TARGET_RVA 0x28ccd0

DWORD revockCallVA = 0;
DWORD revockCallTargetVA = 0;
DWORD revockCallJmpBackVA = 0;

DWORD wechatWinAddr = 0;
BYTE backCode[5];

HWND m_dialog_hwnd;
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(DlgThread), hModule, 0, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

void OnRevock(DWORD esp) {
  wchar_t *tips = *(wchar_t **)(esp + 0x4);
  wchar_t *msg = *(wchar_t **)(esp + 0x78);
  if (NULL != tips) {
    WCHAR buffer[0x8192];
    wchar_t* pos = wcsstr(tips, L"撤回了一条消息");
    if (pos!= NULL && NULL != msg) {
      swprintf_s(buffer, L"%s,内容:%s",tips, msg);
      SetDlgItemText(m_dialog_hwnd, IDC_EDIT1, buffer);
    }
  }

}
DWORD tEsp = 0;
_declspec(naked) void _OnRevock() {
        __asm {
                mov tEsp, esp
                pushad
        }
        OnRevock(tEsp);
        __asm {
                popad
                call revockCallTargetVA
                jmp revockCallJmpBackVA
        }
}

void DlgThread(HMODULE hInstance) {
  DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dlgproc);
}

INT_PTR CALLBACK Dlgproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
    case WM_INITDIALOG: {
      m_dialog_hwnd = hWnd;
      wechatWinAddr = GetWxModuleAddress();
      revockCallVA = wechatWinAddr + REVOCK_CALL_RVA;
      revockCallTargetVA = wechatWinAddr + REVOCK_CALL_TARGET_RVA;

      revockCallJmpBackVA = revockCallVA + 5;
      StartHook5(wechatWinAddr+REVOCK_CALL_RVA,backCode,_OnRevock);
    }
    break;
    case WM_CLOSE:
      Unhook5(wechatWinAddr + REVOCK_CALL_RVA, backCode);
      EndDialog(hWnd, TRUE);
      break;
  }
  return 0;
  }

代码写完后,生成dll,把它注入到微信进程,防撤回消息就能实现了。DLL和源码:https://www.lanzouj.com/ia8dmib

总结:微信版本一直会变化,相应的hook地址也会改变,但是有了这个思路,它更新版本,我们也能快速的找到call。这个消息撤回的call也比较好找,像我这样初学逆向的朋友可以尝试自己找一下。

免费评分

参与人数 27威望 +1 吾爱币 +42 热心值 +25 收起 理由
rt不输出 + 1 + 1 我很赞同!
求知 + 1 + 1 谢谢@Thanks!
tqwyyds + 1 + 1 强啊,非常有用
InsafeMacro + 1 + 1 用心讨论,共获提升!
psycongroo + 1 我很赞同!
晓晓涛 + 1 + 1 我很赞同!
kaidage19 + 1 + 1 用心讨论,共获提升!
b15131865151 + 1 + 1 用心讨论,共获提升!
winniethepoop + 1 + 1 谢谢@Thanks!
Lectter + 1 用心讨论,共获提升!
ShawnWang + 1 + 1 我很赞同!
皇帝陛下万岁 + 1 + 1 谢谢@Thanks!
JMCSec + 1 + 1 谢谢@Thanks!
yanqin + 1 + 1 你这样还叫初学逆向??……
hostclsecho + 1 + 1 谢谢@Thanks!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wuaili1314 + 1 + 1 感谢楼主分享
yangtuo + 1 + 1 我很赞同!
catcatcatwinwin + 1 用心讨论,共获提升!
hnwang + 1 + 1 谢谢@Thanks!
lvfeihongshou + 1 热心回复!
黄非红 + 1 + 1 大神,能否开发个企业微信android的或者PC版的,也是需要防撤回的。xposed.
Xiaxia0315 + 1 谢谢@Thanks!
idol0088 + 1 + 1 我很赞同!
dns2018 + 1 鼓励转贴优秀软件安全工具和文档!
叽歪 + 1 + 1 热心回复!
唐三没藏 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

twinsjackies 发表于 2020-9-21 12:23
我就想要那种下载软件就有防撤回功能的,你发的是什么鬼,标题和内容不符合,哈哈哈哈
头像被屏蔽
guudboy04 发表于 2020-4-30 01:45
13729181580 发表于 2020-3-7 11:23
caojiale 发表于 2020-3-7 11:23
大佬牛皮
a3032805058 发表于 2020-3-7 11:28
感谢分享
xgq6688 发表于 2020-3-7 11:31
多谢分享
hbj.xyz 发表于 2020-3-7 11:38
学习了,支持一下
jiang5886 发表于 2020-3-7 11:39
感谢楼主分享!
头像被屏蔽
隔壁王老 发表于 2020-3-7 11:39
提示: 作者被禁止或删除 内容自动屏蔽
daymissed 发表于 2020-3-7 11:41
看不懂,感谢分享
xrdmwan 发表于 2020-3-7 11:43
直接改微信的dll不就可以了吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 02:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表