0×0. 前言最近又学习了某位大佬用CE的方法,大佬的一句话有点醍醐灌顶,然后有了新的感觉,然后开始尝试实践这篇文章。 自己总结一下CE用法的核心思路:通过各种技巧搜索找到内存中关键数据,然后结合动态调试找到操作数据的函数。 0×1. 了解CE官网:https://www.cheatengine.org/ 看看来自百科的介绍:
在我看来,CE做的最好的就是各种策略的内存搜索能力: 1.支持准确数据(整数、字符串、十六进制、浮点数、字节数组等等)搜索,针对目标数据明确效果显著,比如金币数; 2.支持数据范围的搜索,比如大于某个值,小于某个值等等。比如想找到没有显示数值的血量数据; 3.支持多组数据同时搜索,针对数据结构复杂的情况; 4.支持搜索结果的多次过滤(图中框选的Next Scan),最终找到目标数据。比如血量未知时,通过加血、减血多次搜索最终找到血量地址。 说到底CE内存搜索的能力就是通过各种策略帮助你找到游戏中需要修改的数据(比如血量、分数、金币等等),然后通过内存修改能力(直接改血量)打破游戏平衡,外挂制作工具生成外挂,助你超神! 0×2. 分析进入正题,本文是要拿到微信聊天的语音消息,然后dump保存下来。 要按以前我的思路,会通过网络通信找到接受消息的函数,然后找到语音数据,看起来很简单,但是有点难。 因为函数真的很多,网络消息也会受到很多干扰。 现在用CE了,应该怎么办呢? 找到关键数据关键数据肯定是语音消息了,但是怎么搜索呢,肯定搜语音内容不现实,所以转了弯,先看看文字消息,找到接受文字消息处理函数之后,猜测语音处理函数会相同或者在不同分支。 接着,如何搜索文字消息呢?已经收到的显示在聊天窗口的内容当然可以通过CE找到,但是没用啊,它和接受文字消息处理函数已经没关系了,流程已经处理完成了。 那么在测试中肯定知道发送的消息内容,通过CE来搜索可以吗? 额,我觉得不行,还没收到消息呢,内存中也没有这个文字消息,搜索不到(如果可以,请大佬指点一下)。 能想到的是,在接受到消息某一点通过调试器断下来,然后CE搜索,这样可以,但是这个断点找不到阿,放弃。 那怎么办呢? 看到左侧聊天列表中显示的最新一条消息,有了新的思路。 每次收到新消息后,都会在列表中显示最新消息内容(图中绿框指示位置、注意是unicode字符)。 那么,先用CE(First Scan)搜索当前搜到的消息内容,找到可能的内存地址。多次接受不同消息后,Next Scan按钮搜索每次新的消息内容,最终确定聊天列表中显示的最新消息内容的内存地址。 多次刷选之后,留下两个地址,通过CE修改内容,在界面中查看是否改变,最终确认第二个地址就是我们的目标,暂把该地址记录为MsgAddr。 分析消息接收函数关键数据地址已经找到,下面的工作复杂也不复杂,就看微信是如何实现的了。 猜测微信实现消息显示的流程是这样的: 1.recv收到消息,组装完整包后,分发给消息处理函数; 2.根据wxid找到要显示消息的列表项,如果不在已聊天消息列表,就新建一个项; 3.在列表中显示消息,如果是表情显示[文字],语音显示为[语音],消息插入wxid对应消息队列,或者存入数据库。 步骤3中肯定要写前面找到的MsgAddr内存,把最新消息显示到界面中,这个流程肯定在消息处理函数内部。 So,通过OD对MsgAddr下内存写入断点,回溯堆栈就可以找到消息处理函数。 具体操作如下: OD挂载Wechat.exe进程后,在左下角内存窗口处Ctrl+G,输入找到的MsgAddr(11A11F34)回车,定位到该数据,然后再HEX数据处,右键弹出菜单,选择断点->内存写入。 断点设置完成后,测试发送文字消息,OD断住,代码窗口显示的就是修改MsgAddr的代码位置,如上图10CE412C处。 Alt+K查看当前堆栈: 看到这个调用栈是不是感觉好少,分析起来肯定简单。但,其实是OD显示的并不全,此时真的很想用windbg。 在OD的右下角堆栈窗口,可以看到当前调用栈的参数和预览数据。F8单步(或者Alt+F8执行到返回)逐步的回溯每层堆栈。关注MsgAddr的数据是如何生成的,也就是找到数据来源,然后找到消息处理函数。 跟踪过程不赘述(需要熟悉汇编知识),直到看到的最顶层的WeChatWi.10206460处,发现是把收到的消息内容显示到聊天列表处的一个界面功能函数。 那这里不是可以拿到消息了吗,是的,普通文字消息已经可以拿到,但是语音内容不行。 通过观察内存窗口的数据,整理WeChatWi.10206460处的关于消息参数的大致结构。 wstring msg字段就是文字消息内容,而语音消息则是预览中看到的[语音]两字,并没有实际能够听到的语音数据,所以还得继续往前找。 继续往上回溯了3层左右,进入了102DDC50,找到了语音消息的新信息。 在wstring msg处就是普通文字消息内容,而语音消息并不是我想象的就是直接语音的数据,而是…如下: 真是一波三折,还不是语音的数据,而是关于语音信息的xml,有语音的大小,来自谁,在语音缓冲区中的id(bufid)等等信息。 继续往前找呗,最后回溯到了所有消息处理的分发函数10323FF0中。这个函数处理逻辑很复杂,我并没有很快就找到如何生成语音消息的xml,以及处理语音数据的函数。 一度卡住,重复分析了很多次。 后来又回神想到了逆向神器IDA,xml中数据如voicemsg肯定是模块中会在代码中用到,看看有没有有用的信息。 用IDA打开Wechatwin.dll,shift+F12分析出所有字符串,Ctrl+F找到关键字voicemsg,看来有戏。 真的是柳暗花明又一村。 点击字符串跳到代码窗口,按下x,跳到引用该数据的位置。 找到了解析语音xml数据和解码语音数据的关键函数。 函数103148E0解析xml拿到几个字段的内容,返回上层函数调用一个语音解码的函数进行处理,而这个解码函数就会直接操作语音数据。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|