revit找不到附加模块程序集_WeTool逆向:借用别人的成果 打造自己的程序

本文为看雪论坛优秀文章

看雪论坛作者ID:鬼手56

目录

什么是WeTool前置知识&基于WM_COPYDATA的消息模型 进程通讯相关知识 WM_COPYDATA的相关知识 WM_COPYDATA的缺点 示例代码逆向WeTool 定位WeTool核心模块 分析WeChatHelp 分析SendMsg函数WeTool逆向和微信逆向的对比 微信逆向 WeTool逆向方法扩展

什么是WeTool

百度直接搜索WeTool就可直接找到WeTool官方网站。

6d2e579d46b89b37a3513132d27507e2.png

这是一款专业的微信粉丝和社群的管理工具,是目前市面上微信HOOK做的非常不错的一款产品。不管是从产品设计角度还是用户体验角度或者是产品安全角度来看都无可挑剔。具体功能各位可以去官网看相关介绍,这里就不多做说明。目前官网已经不提供免费版本下载了,我会在文末放出免费版本的安装包。

前置知识&基于WM_COPYDATA的消息模型

>>>>进程通讯相关知识

WeTool的客户端和服务端之间的采用WM_COPYDATA的方式进行进程通讯。要想逆向WeTool,就必须理解WM_COPYDATA消息模型。在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有:

  • 使用内存映射文件
  • 通过共享内存
  • 使用SendMessage向另一进程发送WM_COPYDATA消息

比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一种方法。

>>>>WM_COPYDATA的相关知识

我们可以用下面的函数发送WM_COPYDATA消息:

SendMessage(hwnd,WM_COPYDATA,wParam,lParam);

其中,WM_COPYDATA对应的十六进制数为0x4A,wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:

typedef struct tagCOPYDATASTRUCT
{
    DWORD dwData;//用户定义数据
    DWORD cbData;//数据大小
    PVOID lpData;//指向数据的指针
}COPYDATASTRUCT;

其中dwData既可以是数组,也可以是结构体。能发送这两种数据类型,其实就已经满足大部分的进程通讯需求了。

>>>>WM_COPYDATA的缺点

这种通讯方式有一个缺点:接收方必须是窗口程序。所以要想实现exe和dll之间的通信,就必须在dll里注册一个窗口类,并将其显示方式设置为隐藏。

>>>>示例代码

发送端:

COPYDATASTRUCT show_qrpic;
show_qrpic.dwData = WM_ShowQrPicture;
show_qrpic.cbData = 0;
show_qrpic.lpData = NULL;
//发送消息
::SendMessage(hWeChatHelp, WM_COPYDATA, (WPARAM)hWeChatHelp, (LPARAM)&show_qrpic);

接收端:

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    if (Message == WM_COPYDATA)
    {
        COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT*)lParam;
        switch (pCopyData->dwData)
        {
            //显示二维码
        case WM_ShowQrPicture:
        {
            GotoQrCode();
            HookQrCode(QrCodeOffset);
        }
        break;
      }
}

逆向WeTool

>>>>定位WeTool核心模块

7f9e5a56378a27a1ef4627fe497f6ca4.png

我们打开WeTool,并登陆微信。WeTool分为两个部分,一个是客户端,就是现在大家所看到的这个,负责显示UI和数据,还有一个是服务端,负责从微信进程获取数据,并将数据传到客户端。WeTool的核心功能都在服务端里面。所以我们要做的就是找到WeTool的核心模块。

cd3a70e96e8a78e6ba3da69ed7fe7c7a.png

打开PCHunter,选中微信进程,右键->查看进程模块,并按照模块路径排序。

2a2de054ef8a26ce2ee04ab7985a2037.png

接着在这里我们看到了一个特殊的东西,之所以特殊是因为这个模块的路径既不属于微信,也不属于系统dll。

6f181900f28b3517e1b7a7359104d0c5.png

接着右键->定位到模块文件,找到这模块所在的路径。这个文件夹的名字WeToolCore其实已经暴露了这个dll的功能了。没错,这个就是我们要找的WeTool的核心模块。

aea7cec1e058b0b9854bc1c8798e8535.png

这个文件的原始路径是在WeTool文件夹下的WeChatVersion这个子文件夹下。WeTool启动后,会先检测当前微信版本,并根据不同的微信版本注入不同的dll。这里我们选择分析2.6.5.52这个版本的WeChatHelp。

>>>>分析WeChatHelp

接下来我们用IDA载入WeChatHelp。

c2bf19764c191344505be02bc827c8bf.png

在左侧的函数窗口,能直接看到一堆带有名字的函数。之所以能看到这些带有名字的函数,是因为WeTool将这些函数作为接口导出了。

dc62d53f30866232fa48cc22292d82d1.png

我们可以使用LoadPE查看其导出函数。

>>>>分析SendMsg函数

4c3af6a54e6ddcaea4569d556451b203.png

接下来,为了和微信逆向的过程进行对比,我们选择分析SendMsg这个函数,双击SendMsg,并按F5查看伪代码。

89be3ef02ea0b0337925b41e1297b27d.png

这里将一个全局变量赋给了lParam,并且调用SendMessage,参数为lParam和0x4A。根据之前我们学习过的WM_COPYDATA通信模型,很容易就能看出这里并不是真正的SendMsg函数,而是和客户端进行通信的函数。那么怎么找到真正的SendMsg函数呢?

a95510acab1f20252c4bacd4e1e6b5ea.png

选中赋值给lParam的这个常量,右键,跳转到交叉引用。

7314d9b2780eafb454659c9b1d68c74f.png

选择第二个调用:

196957fc39af6a46d59deab69fdd92dc.png

这里实际上是在判断lParam的消息类型是否是发送消息,如果是则调用sub_100050F0发送文本消息,如果要翻译成源码,就是这个样子。

6505fccbccc4069edbe6660de1552d9b.png

接下来进入sub_100050F0这个函数:

0def36e39c466cbf754896fc997fde59.png

重点关注和数字相关的地方,比如0x2EB4E0。接着用OD附加微信(记得退掉WeTool)。

76fc7b6508563b1e0dd3b01b7bb43f94.png

用RVA的方式跳转到WeChatWin模块0x2EB4E0的地方,下断点:

88b09bc6ff5ea6e1bade89c726565d96.png

然后随便发送一条消息,程序断下:

fed13037cb741260aac40b24d9c56c45.png

接着通过堆栈,找到上一层返回地址,下断点,让程序再次断下,分析函数参数:

07d6b62af764052eb8002f48b1ce6bbc.png

此时edx指向消息接收者的微信ID:

c09329458dc219e3250f1c73c72c7a40.png

ebx指向消息内容:

014c923450f86f6a202d69fc16aa3c99.png

那么要想确定这个是不是发送消息的call,只需要修改发送的消息内容。接着F9运行。

559eb3ee52a206464f386454da191481.png

此时消息内容已经被修改,我们就已经找到了发送消息的call。这里为了节省篇幅我只分析了SendMsg函数内的一个地址,事实上,只要是函数内有的偏移,都需要逐个排查一遍,一个多多个其实没什么差别,只不过多花点时间而已。

WeTool逆向和微信逆向的对比

>>>>微信逆向

请看我上一篇文章,PC微信逆向:发送与接收消息的分析与代码实现:https://blog.csdn.net/qq_38474570/article/details/93339861这里我们找到发送消息的接口,总共需要以下几步:

  1. 寻找切入点:消息内容
  2. 给消息内容下内存访问断点,栈回溯分析
  3. 验证是否是发送消息的call

>>>>WeTool逆向

而WeTool逆向则完全不同,只需要两步:

  • 找到函数内的所有偏移
  • 逐个排查偏移,并最终确定call

明显直接逆向WeTool会比逆向微信要省很多时间。特别是在一些不可控的情况,比如找不到切入点,无法确定是不是关键call等等。

方法扩展

14e6526d1c731235982ce5a49bc07460.png

只要掌握了上面的方法,就能搞定WeChatHelp里导出的所有函数。这些你都可以直接拿过来,变成自己的程序。事实上我的微信机器人,其中百分之三十的功能就是来自于WeChatHelp。

最后 附上WeTool安装包和微信机器人的成品地址:链接:https://pan.baidu.com/s/1GHjFhkdlUCxjIRfwyo89sA

提取码:d5v6https://github.com/TonyChen56/WeChatRobot

79bbc03fe92e04660306c6dd4ce5155e.png

- End -

看雪ID:鬼手56

https://bbs.pediy.com/user-833057.htm

*本文由看雪论坛 鬼手56 原创,转载请注明来自看雪社区

推荐文章++++

* AFL afl_fuzz.c 详细分析

* 小白的CVE-2010-0249——极光行动漏洞分析

* 一款二代壳的脱壳成长之路

* 手动打造应用层钩子扫描

* 跨平台模拟执行 - AndroidNativeEmu实用手册

34184b661bcd17978d7be40030461f2f.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Revit是一款广泛用于建筑设计的BIM(建筑信息模型)软件。在使用Revit时,我们可以使用外部工具来扩展Revit的功能。但有时候会遇到一个问题,就是Revit不到附加模块程序。 出现这种情况通常有以下几个可能的原因: 1. 缺少必需的附加模块程序:某些外部工具需要特定的程序来运行,如果这些程序丢失或丢失,则Revit将无法到它们。在这种情况下,我们需要安装或重新安装所需的程序。 2. 文件路径问题:外部工具的程序通常存储在特定的文件夹中,并在Revit加载时自动搜索这些文件夹。如果外部工具的程序被移动到其他位置或删除,则Revit将无法到它们。在这种情况下,我们需要确保程序位于正确的文件夹中,并且文件夹路径正确。 3. Revit版本兼容性问题:有些外部工具只适用于特定版本的Revit。如果我们在错误的Revit版本上尝试运行它们,Revit将无法到它们。在这种情况下,我们需要确认外部工具与我们所使用的Revit版本兼容,并且在正确的Revit版本上运行它们。 如果在使用Revit时遇到了不到附加模块程序的问题,我们可以按照以上三个步骤逐一排查并解决问题。通过安装或重新安装必需的程序,检查文件路径是否正确,以及确认外部工具与Revit版本兼容,我们应该能够解决这个问题,使外部工具正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值