• Windows逆向分析入门(九)——实战篇(内存直接读取通讯录)


    前言

      上一篇,聊到函数的调用关系是一条线的。这一篇,聊下函数的调用关系是分叉的,应该怎么分析。目的是内存直接读取通讯录。

     

    分析

      通讯录,是数据。

      全局数据直接读取,局部数据间接拦截。

      通讯录要经常用到,写成全局数据,方便读取。

      看着和个人信息一样,是全局数据,内存里直接搜索。

      但用什么搜索呢?并没有一个明确的数据可以代表通讯录。

      一般说,通讯录里面有很多好友信息,要获取某个好友信息,在里面搜索。

      也就是说,通讯录可以是一个数组,链表,或者一棵树,而这个集合的开头写成全局数据。

     

    切入点

      从获取某个好友的信息入手。

      要获取某个好友信息,得在通讯录里面搜索。

      顺藤摸瓜,知道获取单个人的信息,就知道通讯录的了。

      依然是从日志入手,看下有什么线索。

     

    日志

      和上一篇一样,注入打开日志模块的插件,点击通讯录某个好友,看看日志有什么。

      有一个字符串:NetSceneBatchGetContact,表示通过网络获取联系人的信息。

     

      对字符串进行下断点:NetSceneBatchGetContact

     

      点击通讯录某个好友的头像,触发到断点

     

      堆栈往下翻,发现这里已经有好友的多个信息

     

     

      已经有信息,还需要网络获取,意味着本地存储了一些基本信息,然后还需要去网络获取。

     

      可以猜测,WX获取好友信息的函数大概是

        获取好友信息(参数:好友ID)

          调用函数:获取好友本地信息

          如果消息不全

            调用函数:通过网络获取

     

      而我们现在断点到的是:通过网络获取,要找的函数是:获取好友本地信息。也就是遇到的是分叉情况,获取好友本地信息这个函数不在堆栈里面。

      所以要回到分叉点,也就是已经有基本信息的函数里面,从函数头开始分析。

     

    分析

      1、返回分叉的地方(已经有好友的基本信息)

     

      2、往上翻翻代码,到函数的头部,定下断点

     

      前两个函数都没有wxid,直到第三个才有

     

      但这个函数里面只是对数据处理,没有调用别的函数,排除掉

     

      接下来的两个函数和刚才的一样,也排除掉

     

     

      接下来的函数还是没有微信ID,到了第二个才有。

     

     

      3、F7进入函数,F8单步执行,到这个函数,才有微信ID

     

     

      函数里面是拿到一个写死的全局变量 0x10995060

     

     

      执行结果eax,又给下一个函数使用:mov ecx,eax

     

     

      4、跟踪进去下一个函数,里面有很多字符串和jnz,这里应该是对微信ID的过滤

      跳过字符串,到这个函数又有微信ID,但执行完这个函数,只是把微信ID传入堆栈。

     

     

      5、继续F7进入下一个的函数,到这里又有微信ID

     

     

      6、再进入这个函数,注意这里有个je是向上的,意味着是一个循环

     

     

      单步进行分析,确实是在对通讯录进行遍历,并且通讯录是一个先序排列的二叉树。

     

     

      在前面有一个全局变量,跟踪这个数据的传递过程

      (中间重启过,基址变了,全局变量不一样)

      5A279D03    A1 6050615B     mov eax,dword ptr ds:[0x5B615060]

      5A279D08    83C0 28         add eax,0x28

      5A22E5FD    8BC8            mov ecx,eax

      5A4026AB    8BD9            mov ebx,ecx

      5A40276C    8BCB            mov ecx,ebx

      5A400E87    8BF1            mov esi,ecx

      5A400EAE    8D9E 84000000   lea ebx,dword ptr ds:[esi+0x84]

      5A400EB5    8BCB            mov ecx,ebx

      59FB2584    8B19            mov ebx,dword ptr ds:[ecx]               ; WeChatWi.5B3B4994

      59FB2587    8B73 04         mov esi,dword ptr ds:[ebx+0x4]

     

      通讯录第一个节点 = [[[0x5B615060] + 0x28+0x84]+0x4]

      左节点:mov esi,dword ptr ds:[esi]

      右节点:mov esi,dword ptr ds:[esi+0x8]

      节点是否有效:cmp byte ptr ds:[esi+0xD],0x0

     

    算偏移

      基址:59F60000

        Executable modules, 条目 7

        基址=59F60000

        大小=01946000 (26501120.)

        入口=5ACB4A63 WeChatWi.<ModuleEntryPoint>

        名称=WeChatWi

        文件版本=2.9.0.123

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

     

      偏移 =  内存地址 - 基址

        通讯录偏移:5B615060 - 59F60000 = 16B5060

    代码

     

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

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

  • 相关阅读:
    拼接个URL你也能搞错,还写个屁的爬虫
    在 Python 中接管键盘中断信号
    关于re.sub从匹配的文本中处理后之际替换匹配匹配到的数据
    loguru 如何把不同的日志写入不同的文件中
    Linux 中,没有 zip命令,怎么生成 zip 文件?
    mysql查询tinyint变成true,false;
    muislider设置选项卡,muislider设置默认选项卡
    js数组排序 js排序
    "enablePullDownRefresh": false,mui配置是否下拉刷新,mui配置下拉刷新
    Webview窗口刷新
  • 原文地址:https://www.cnblogs.com/wwgk/p/13199553.html
Copyright © 2020-2023  润新知