• Windows逆向分析入门(八)——实战篇(收发文本消息)


    前言

      这一篇,用到找偏移的第三个方法:日志;第四个方法:字符串;第五个方法:系统函数;第六个方法:第三方库。目标是收发文本消息。

    一、发送消息
      分析

      1、发送信息的一般流程

        1、界面上编辑消息

        2、点击发送按钮

        3、消息存入数据库

        4、通过网络发送出去

      2、可以切入的点

        1、界面

        2、数据库

        3、网络发送函数

     

      3、入手方式

        界面入手,得跟踪Duilib的响应过程

        数据库入手,得监听数据库Sqlite的函数

        网络函数入手,数据依据加密了,难识别出来

     

        数据从产生到发送,中间会有比较长的过程。

        看下日志有没有可以参考的信息。

     

      Xlog

        WX的日志模块是第三方库:Xlog。

        关于Xlog的介绍和分析,后续会分享了《微信日志Xlog分析——带源码》。

        注入打开日志的dll

        随便操作界面,就有日志输出

    发送一个文本信息

      日志看到了关键词On MsgAdd PrefixId,和 sendTextMsg。

     

      用OD搜索字符串,发现没有sendTextMsg,但是有On MsgAdd PrefixId,进行断点。

    触发断点

      函数调用的关系有两种

        1、函数A调用函数B,函数B调用函数C(一条线)

        2、函数A调用函数B,函数A调用函数C(分叉开)

      点击发送按钮,WX会收到操作信息,部分信息给Duilib处理,部分信息给系统自带的函数处理:ntdll.NtdllDefWindowProc_W。

      堆栈里面往下翻,发现有这个函数。意味着这个断点的位置,和发送消息函数的调用的关系是一条线的。也就是说,在堆栈就能找到发送消息的函数。

      

    找函数

      问题来了,堆栈这么多函数,到底哪一个呢?

      一般发送消息函数的格式是:发送消息函数(参数:接收人,参数:发送的消息)

      函数的调用约定有多种情况 __fastcall __stdcall __cdecl __thiscall。

      这就意味这发送消息函数至少需要两个参数.

      但不一定都在堆栈,可能在ecx或者edx。

      从断点往回找,看有没有满足条件的。

     

    1、第一个函数,堆栈没有关键的参数,函数也没用到ecx和edx,排除。

     

    2、第二个函数,堆栈有发送的消息;两个参数,其中一个是0,函数也没用到ecx和edx,排除

     

    3、第三个函数,堆栈有接收人;三个参数,没有发送的消息,函数也没用到ecx和edx,排除

     

    4、第四个函数,堆栈有发送的消息;用到ecx和edx,加上3个push,总共五个参数,断点看下

     

      可以看到这里的参数是齐全的。

     

      但是参数1未知,[ebp-0x738]是函数内一个变量,清空后发现能发送信息,可以直接伪造

     

    修改发送的内容,验证下

      1、发送老的信息 oldmsg

      2、od里看下拦截的数据也是oldmsg

      3、修改成newmsg

      4、最终发送的是newmsg,这里就是我们要找的发送信息函数

     

    算偏移

      基址 :5A090000

        Executable modules, 条目 8

        基址=5A090000

        大小=01946000 (26501120.)

        入口=5ADE4A63 WeChatWi.<ModuleEntryPoint>

        名称=WeChatWi

        文件版本=2.9.0.123

        路径=C:Program Files (x86)TencentWeChatWeChatWin.dll

     

    源码

      5A17CA91    6A 01        push 0x1                                 ; 参数5:1

      5A17CA93    8D43 34    lea eax,dword ptr ds:[ebx+0x34]

      5A17CA96    50              push eax                                 ; 参数4:空结构

      5A17CA97    53              push ebx                                 ; 参数3:发送的消息

      5A17CA98    8D55 9C         lea edx,dword ptr ss:[ebp-0x64]          ; 参数2:接收人

      5A17CA9B    8D8D C8F8FFFF   lea ecx,dword ptr ss:[ebp-0x738]    ; 参数1:未知 可置空

      5A17CAA1    E8 AAFF2500     call WeChatWi.5A3DCA50                 ; 发送文本消息函数

      5A17CAA6    83C4 0C         add esp,0xC ;平衡堆栈用

     

    参数

      eax

        13EF5AA8  00000000

        13EF5AAC  00000000

        13EF5AB0  00000000

        13EF5AB4  00000000

      ebx

        13EF5A74  13FB51E0  UNICODE "发送文本消息"

        13EF5A78  00000006

        13EF5A7C  00000008

        13EF5A80  00000000

        13EF5A84  00000000

     

      ecx

        空buffer:char buffer[0x738] = {0};

     

      edx

        0096EF00  13CA0610  UNICODE "filehelper"

        0096EF04  0000000A

        0096EF08  00000010

        0096EF0C  00000000

        0096EF10  00000000

     

    偏移 = 内存地址 - 基址

      发送文本消息函数 5A3DCA50 - 5A090000 = 34CA50

    写代码

      参数结构

      

      构造参数

      

      调用函数

      

     

    二、接收消息

    当WX收到消息时,也会在On MsgAdd PrefixId处触发断点。

     

    跳转到ebp(ebp相对比较稳定)

    双击ebp所在的行,地址这一列显示的是相对地址。

      发送者 : ebp-0x220

        $-220    > 13BD3EC0  UNICODE "filehelper"

      发送的消息:ebp -0x1F8

        $-1F8    > 13C0C380  UNICODE "手机发送的消息"

     

    拦截需要至少五个字节,这里刚好五个(68 C0 03 49 5B)

      5A3B9743    68 C003495B     push WeChatWi.5B4903C0                   ; UNICODE "On MsgAdd PrefixId : %I64d RealId : %I64d, SvrId :"

    算偏移

      基址:5A090000

        Executable modules, 条目 8

        基址=5A090000

        大小=01946000 (26501120.)

        入口=5ADE4A63 WeChatWi.<ModuleEntryPoint>

        名称=WeChatWi

        文件版本=2.9.0.123

        路径=C:Program Files (x86)TencentWeChatWeChatWin.dll

    偏移 = 内存地址 - 基址

      接收消息hook位置 5A3B9743  - 5A090000 = 329743

      被覆盖的数据偏移 5B4903C0 - 5A090000 = 14003C0

     
    写代码
     
     

    工具和教程,放群里(163419350),方便交流。

    实战代码也会放在github:https://github.com/KongKong20/WeChatPCHook

  • 相关阅读:
    udelay、mdelay、ndelay、msleep使用比较说明
    linux多线程驱动中调用udelay()对整个系统造成的影响(by liukun321咕唧咕唧)
    linux设备驱动那点事儿之平台设备理论篇
    misc_register、 register_chrdev 的区别总结
    platform_driver与file_operations两种方法开发led驱动
    rc522 ,pn544区别
    内核驱动中常见的miscdevice、platform_device、platform_driver
    file_operations结构2
    file_operations结构体解析 1
    android5.0问题
  • 原文地址:https://www.cnblogs.com/wwgk/p/13199338.html
Copyright © 2020-2023  润新知