PC微信逆向分析——内存直接读取通讯录

前言

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

分析

  1.   通讯录,是数据。
  2.   全局数据直接读取,局部数据间接拦截。
  3.   通讯录要经常用到,写成全局数据,方便读取。
  4.   看着和个人信息一样,是全局数据,内存里直接搜索。
  5.   但用什么搜索呢?并没有一个明确的数据可以代表通讯录。
  6.   一般说,通讯录里面有很多好友信息,要获取某个好友信息,在里面搜索。
  7.   也就是说,通讯录可以是一个数组,链表,或者一棵树,而这个集合的开头写成全局数据。

切入点

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

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

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

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

日志

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

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

  对字符串进行下断点:NetSceneBatchGetContact

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

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

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

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

      如果消息不全

        调用函数:通过网络获取

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

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

分析

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

PC微信逆向分析——内存直接读取通讯录

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

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

  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.

    名称=WeChatWi

    文件版本=2.9.0.123

    路径=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll

  偏移 = 内存地址 - 基址

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

代码

PC微信逆向分析——内存直接读取通讯录

PC微信逆向分析——内存直接读取通讯录

PC微信逆向分析——内存直接读取通讯录

最新版本2.9.5.41的偏移量,请私信我


原文地址:https://www.cnblogs.com/wwgk/p/13199553.html


分享到:


相關文章: