最终效果
情景模拟
我们能在接收消息CALL中获取以下参数
1. 谁发给你的?
2. 发了什么?
3. 什么类型?
4. 还有一串加密的类似hash的字符串(可能是标识作用)
如果我们是程序员,我们在做撤回功能的时候肯定得给函数传入参数应该就是消息的ID吧?
那我们现在对程序内部是一无所知的,所以我想通过我们看的到的去追寻我们看不到的。
查看看得见的变化
我们在wx中撤回一条消息,原信息消息,输出了一条 “某某某 撤回了一条消息”
所以在CheatEngine中搜索 “撤回”
返回了20多条结果
可以把 “Type” String Unicode 长度的大一些,这样我们就可以看到在这条记录后面跟着的很多数据。
20多条数据,测试起来很方便了,直接将他们拉下来进行进一步测试
第二步选定变量地址
我们重复撤回,寻找跟随变化的变量地址,乱码的变量就可以直接删掉了,因为是个临时变量。
这样就能更加精确的缩小范围。
第三步内存断点
函数在撤回消息的时候,肯定需要访问内存获取数据。
可以通过内存断点,查询堆栈中函数调用的情况
在这里我们看到了即将撤回的 消息内容,和即将输出的内容,这说明附近可能有我们要的函数地址。继续往栈底看。
有我们要撤回的消息,和消息中的那串加密字符串。找到需要的参数数据!!
我就在此函数地址下断
函数追踪
收信的时候,不执行该幻术撤回的时候,执行了该函数
这说明这是撤回操作需要的函数【很可能是我们要的】
mov eax,[arg.1] // 传入参数 test eax,eax ... push eax call 函数 add esp,0x4 // 平衡堆栈
我修改 call 直接 jmp 到下一个命令,发现消息并没有撤回,但是点击继续运行,消息撤回了!
这说明:这个函数是必经之路,但是不是最重要的,撤回的函数应该在其后面。
然后我傻乎乎的跟进函数,发现进入的一个循环。姑且认为是个消息循环,总之没跟随到。
再换一个思路…
之前断下的函数传入了一个参数 [arg.1],保存再eax,eax呢又压入了堆栈让即将调用的函数使用,那么问题来了,[arg.1]就是我们看到的堆栈