PC微信逆向:终结篇——定位关键call的思路总结

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38474570/article/details/97820327

定位关键call的思路总结

一 寻找切入点

一般来说需要找的关键call可能会有多个地方有切入点,比如定位获取群成员的call,可以在消息窗口打开群列表

在这里插入图片描述

也可以在联系人窗口打开群列表

在这里插入图片描述

那么这两个切入点中,第二个切入点可用信息有群ID和微信ID,相对来说会比第一个切入点要好。所以找到一个好的切入点是一个好的开始

二 思考切入点背后的编程逻辑

找到了切入点之后,我们要思考这个切入点以及需要找的call背后的编程逻辑。例如:如果让你来实现一个发消息的函数,你会怎么写?

如果让我去实现一个发送消息的函数,那么至少需要有三个参数,第一个是消息的内容,第二个是消息的接收者,第三个是消息的类型。伪代码如下:

BOOL SendMessage(wchar_t wMegText,wchar_t wMsgRecver,DWORD dwType)
{
    //这里是代码
}

另外,思考清除切入点背后的编程逻辑有利于我们后面的分析,比如在排查堆栈的时候可以直接跳过三个参数以下的函数。

三 寻找切入点和已有信息间的联系

第三步,我们需要找到切入点和我们已掌握的信息间的联系,通过它们之间的联系进行入手。

以发消息的call为例,三个参数中我们已经能拿到其中两个参数,一个是接收者的微信ID,一个是消息内容。那么作为发消息函数的参数,在调用这个函数的时候就必然会访问这两个参数,所以我们可以先在CE中找到接收者的微信ID的地址,然后对这个地址下断点进行分析。

四 栈回溯 分析附近代码

在断点断下之后,逐个排查堆栈中的返回地址和参数,根据已有的信息,筛选出最有可能的那个返回地址。

例如我们知道发送消息的函数至少需要三个参数,那么在排查堆栈的时候就可以直接过滤掉三个参数以下的函数。

如果堆栈中没有找到我们所需要的call,那么可以直接返回到堆栈的最上一层的地址,在函数头下断点进行单步跟踪,一定可以找到所需要的call。

找到可能的call之后记得进一步验证,可以利用修改参数的方式测试是否是自己需要的call。

五 分步进行

如果在寻找切入点的过程中发现没有跟要找的call关联的最直接的切入点,那么可以尝试一下分多步进行,先找到和关键call有关联的call,然后再通过这个有关联的call去找关键call。

例如在定位发送xml名片的时候,我们需要先找到需要发送的对象的微信ID,然后对微信ID下内存访问断点。

在这里插入图片描述

但是我们很难去定位到这个好友的微信ID的地址,因为地址太多了。

这个时候可以先通过选字符串的提示找到这个选择的call,选择的call自然会将选中的好友的微信ID传入。找到了微信ID,就能直接对微信ID下访问断点,栈回溯分析了。

目前微信机器人的成品已经发布,需要代码请移步Github。还请亲们帮忙点个star
https://github.com/TonyChen56/WeChatRobot

展开阅读全文

没有更多推荐了,返回首页