美文网首页
逆向实现PC微信防撤回

逆向实现PC微信防撤回

作者: 会吹B的码农 | 来源:发表于2020-10-29 03:45 被阅读0次

    本文章主要用于学习交流,如有侵权请联系作者删除。

    学习了逆向工程的相关知识,记录一下第一次实战的心得与过程--PC微信防撤回功能。首先,根据逆向三步走:

        1. 确定要做什么,或者要实现的功能。
        2. 搜集网上可用的信息,归纳总结可行的方法或者可用的信息。
        3. 然后分析目标对象的实现机理,对目标开展逆向,进行实际操作。
    

    目标与信息搜集

    这里,我们初步可以确定最主要的就是希望能够看到撤回的消息了,接下来就是到网上搜集看看是否有可以借鉴的思路了。从网上获取的信息主要如下:

    1. 微信撤回功能实现的代码存在于wechatWin.dll中。
    2. 撤回的关键词为revokemsg.
    3. 微信的核心功能使用了反逆向技术,但是撤回功能的代码没有使用反逆向技术。
    4. 微信使用了SQLite这个轻量级的数据库来存取消息。
    5. 目前已有的防撤回方案有两个,方案一是通过修改特征码,在判断是否调用撤回函数时,直接绕过了整个撤回函数;方案二首先利用CE定位到了要撤回消息的内存,然后在消息撤回后,观察相应内存变化,找到对应修改内存的函数栈,再使用dll注入,截取撤回的消息。

    根据方法一,如下图,根据Intel汇编指令表,只需要将 74 32 je wechatwin.715A76ED中的74改为BE即可实现跳转。该方法初步完成了我们的需求,但是这样修改之后,我们也无法感知到该消息是否被撤回过。因此这里我们可以进一步的细化了我们要实现的功能,即能够防止消息撤回,并且还能知道该消息是否被撤回过。

    撤回判断特征码

    方法二,基本达成了我们的需求,但是存在两个问题,经过实践发现,微信版本更新后,贴主所说的函数栈,已经不存在了,并且通过方法二定位的函数栈是关于左侧消息列表显示的信息。如下图:


    消息列表提示撤回

    那么这就存在一个问题,如果一个人发了两条消息,只撤回第一条,方法二是无法获取到撤回的消息的,因为左侧的消息列表信息没有变化。如下图:


    消息列表无撤回提示

    所以这两个方法都无法完全满足我们的需求,但其思路值得借鉴。通过前面搜集的信息,我们整理一下,微信撤回时的大致过程,微信服务器向要撤回的客户端,发送相应的撤回报文,然后客户端解析相应的报文,提取出要撤回的消息,调用撤回方法,并在屏幕上显示xxx撤回了一条消息

    具体实现思路

    结合方法一和方法二的思路,也有两个实现思路,从方法一的思路中,我们只要在开始调用撤回方法前,找到撤回报文,就能够获得关于撤回的消息信息,顺藤摸瓜,获取到撤回的消息记录下来,然后再调用撤回方法。

    从方法二的思路中,我们可以利用CE去定位在撤回时,聊天对话框中对应内存被改变的位置,因为撤回消息后,会在撤回消息位置,改成相应的xxx撤回了一条消息的提醒。所以从理论上来讲如果能够定位到这个替换函数的位置,我们也能够拿到撤回的消息,并且知道这条消息被撤回了。但是该思路在后续的实验中,被排除了,因为无法定位到相应的位置,似乎每次撤回后,消息聊天框的界面会被刷新,内存地址在动态改变。

    从方法一,我们知道,当74 32 je wechatwin.715A76ED直接改为jmp指令之后,所有关于撤回的方式都失效了,很可能这里就是我们要找的撤回方法前的位置。所以进一步观察了这个函数的调用栈,发现了一段报文,如下图:

    撤回报文
    这里显然可以获取到,要撤回的消息IDmsgid,要替换的消息idnewmsgid,还有撤回者的idwxid_xxxxx,以及撤回消息的备注名xxxx撤回了一条消息。继续再往下走,没有找到对应的通过id获取消息的逻辑,转念一想,这里似乎也不需要去查询消息,直接把相应的消息id替换为新的消息id,并且将报文后面replacemsg标签里的消息,替换到页面上即可。

    从这里我们又有两个思路了,第一个就是,利用dll在74 32 je wechatwin.715A76ED这条指令执行跳转到撤回方法前,通过消息id到数据库里面直接查到撤回的消息,再结合撤回报文中的被撤回者信息,即可完全满足我们的防撤回的需求。通过网上搜索,这里恰好有方法能够获取到数据的句柄.另外一个思路是,直接把撤回报文中的newMsgId的值改为oldMsgId的值,并修改replacemsg标签的内容为撤回的消息内容。这需要找到最原始报文的内存地址,进行修改,不能能是函数栈中的拷贝。该思路在这里仅作记录,等以后有空了再进行实践。

    归纳总结

    1. 在逆向前需要尽量对目标刻画完整,并且猜测逆向的目标程序相应的实现逻辑很重要。
    2. 从方案一和方案二可知,有两种方法可以定位相应功能的函数栈,第一种就是,通过搜索功能相关的关键词,然后在调试程序中搜索相应的指令,并打断点调试。第二章就是,通过CE观察内存变化情况,然后设置内存断点,得到相应的函数调用栈。
    3. 在实际的环境中,大多数应用程序不会全部采用反逆向技术,出于安全和效率的平衡,只有其核心库会使用反逆向技术保护。

    相关文章

      网友评论

          本文标题:逆向实现PC微信防撤回

          本文链接:https://www.haomeiwen.com/subject/nlghvktx.html