1625-5 王子昂 总结《2017年11月18日》 【连续第414天总结】
A. PCQQ防撤回 (2)
B.
QQ(PC端)防撤回
(测试版本8.9.5)
应用背景
QQ为手误操作等理由提供了弥补选项–撤回。
撤回功能本是方便不小心打错字、发错地方等失误而提供的,但是有些人却利用它来逃避责任,例如打下欠条、做出承诺后撤回,发布广告甚至是反动消息后撤回
本项目就是为了防止成员传播反动、色情等违法违规消息或发布广告等垃圾消息后撤回,便于管理员进行管理而开展的
原理
撤回机制
目标
使本地数据库中的消息不被删除,从而防撤回
方法
- 拦截服务器发送的撤回消息,这需要分析QQ的协议,难度比较大
- 修改本地客户端接收到消息以后的代码
操作步骤
搜索相关代码
利用工具UltraEdit搜索文件夹内所有Dll,查找有Recall、Revoke字符出现的Dll
可以看到出现次数较多的主要是IM.dll和MsgMgr.dll两个文件,于是优先对它们进行分析
MsgMgr.dll
查询可知它是负责消息管理器相关的功能,与消息框的撤回无关
IM.dll
查询未果,进行逆向分析
查找字符串发现以下内容
逐个检验可知DoRevokexxx处为本地发起撤回的相关功能,OnRevoke处则是具体实现撤回的功能(包括撤回自己的消息和别人的消息被撤回)
对本地消息进行处理的函数分为4个子函数
负责撤回别人消息的关键函数为
将其**掉(直接RETN 10返回)即可实现撤回功能失效
其他3个函数还包括撤回消息的回复、撤回自己消息等功能,进行**的话还可以实现保留本地消息的同时,发出撤回他人消息请求的效果
效果截图
可以看到,无论是对方的撤回,还是自己的撤回,都可以在本地拦截下数据删除,而向服务器正常发出消息
结论
缺陷
QQ程序本身没有加壳,从而导致逆向可以直接查看源代码
Log记录都是明文,从而使得逆向者在不具备符号文件来参考函数名、变量名时,可以通过明文Log来索引定位关键代码
修复方法
对程序加壳,从而对抗****
将Log记录中的字符进行简单加密,使用时再解密