某即时通讯聊天软件防止撤回的patch
文章目录
1前言
因为经常混迹在一些不可描述的群中,为了更好的查看不可描述的图片保留犯罪证据,决定patch掉chr(0x54)IM的撤回功能。
2前期准备
按照网上一些教程给出的方法,基本是在bin文件夹下找到含有revoke字串的dll进行patch,本人尝试搜索但没有结果,想是再加载到内存中又经过了几层转换。根据大部分教程,chr(0x54)IM撤回的功能在IM.dll中。拖进IDA中分析也没有看到明显的函数流程,于是准备动态调试,这时候我们知道:撤回功能在IM.dll中。
3Hack it!
首先打开chr(0x54)IM,由于是32位的程序,我选择用x32dbg附加到进程调试,F9先让程序跑起来。
然后在符号栏中找出im.dll,并进入该模块
发挥传统艺能,利用关键字revoke搜索字符串
发现3个可疑的函数,其中有buddy(好友),disc(讨论组),group(群),大胆猜测这三个字符串代表而的函数应该就是实现撤回功能的函数,于是在这三处下断点。这里说一下本人逆向的全部过程:在所有带有revoke的语句都下了断点,一步一步踩坑最后跟踪到了这个地方,虽然会由于一些antidebug耗费一些时间,但这个过程我认为是必不可少而且很有趣的。说坑的原因是在进入函数跟踪的时候很容易跑飞触发一些antidebug的函数,然后主进程会新建检测线程对栈内容和指令进行检测(这个很骚,没有完全跟踪到检测的逻辑),或判断是否在调试状态,最后抛出异常使调试器卡死在ntdll.dll中。
回到正题,发给小号一条消息并撤回,正好命中在我们猜测的断点上。
然后我们回溯函数,可以轻松看到call这个函数之前push了2个参数,于是我们把该函数的push ebp
patch成retn 8
,再让程序运行,这时我们阻止撤回的操作已经完成了:)(这里本人猜测采用的是cdecl的函数调用约定,所以ret后的参数是多少无所谓,最终会由调用者平衡堆栈)
以上是实现了好友间的防撤回,若想在群和讨论组中应用,将其他两个函数进行同样操作即可。
4挖一点小坑
- a.不对这个函数进行patch,让其正常执行,消息也没有被立即撤回,进一步猜测这个函数的功能是初始化被撤回内容的参数
- b.一开始本人想对被撤回的字符串进行跟踪,但肯定是被加密过的,于是乎对着加密流程日了一下午,小有收获但并没有破解成功
- c.这么patch仅仅完成防撤回的功能,显然是非常low的,理想功能应该是“xx撤回了一条消息,但被阻止了”,因为
懒还有其他任务要做,所以先埋下一个坑,以后再填 - d.欢迎大佬指正