Windows逆向分析入门(八)——实战篇(收发文本消息)
2021-01-04 01:28
标签:文本 对比 也会 流程 条目 跟踪 ram 依据 prefix 这一篇,用到找偏移的第三个方法:日志;第四个方法:字符串;第五个方法:系统函数;第六个方法:第三方库。目标是收发文本消息。 1、发送信息的一般流程 1、界面上编辑消息 2、点击发送按钮 3、消息存入数据库 4、通过网络发送出去 2、可以切入的点 1、界面 2、数据库 3、网络发送函数 3、入手方式 界面入手,得跟踪Duilib的响应过程 数据库入手,得监听数据库Sqlite的函数 网络函数入手,数据依据加密了,难识别出来 数据从产生到发送,中间会有比较长的过程。 看下日志有没有可以参考的信息。 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. 名称=WeChatWi 文件版本=2.9.0.123 路径=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.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. 名称=WeChatWi 文件版本=2.9.0.123 路径=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll 偏移 = 内存地址 - 基址 接收消息hook位置 5A3B9743 - 5A090000 = 329743 被覆盖的数据偏移 5B4903C0 - 5A090000 = 14003C0 Windows逆向分析入门(八)——实战篇(收发文本消息) 标签:文本 对比 也会 流程 条目 跟踪 ram 依据 prefix 原文地址:https://www.cnblogs.com/wwgk/p/13199338.html
文章标题:Windows逆向分析入门(八)——实战篇(收发文本消息)
文章链接:http://soscw.com/index.php/essay/39938.html