文章来源:网友投稿

0x00 适用场景

本文所采用技术,仅用来实现自定义功能,适用场景仅为自己两台电脑使用聊天软件互发消息学习研究使用。

*本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

0x01 需求产生

某聊天软件有已读回执功能,可以通过查看标记,判断对方是否读了你的消息:

经常出现这样一种情况,联系人发来几条消息,啊T.T,我好想看看他说了什么:

然后点开看了一下,完蛋,又是借钱的:

这个辩解苍白无力~

那么伟大的需求就此诞生:如何偷偷看他消息,而不让他知道我已读了?

0x02 探究原理

盲猜原理一定是这样:

客户端查看了消息->客户端发送已读回执到服务器->服务器向消息发送者发送已读状态

那也就是说,只要我们使用的PC客户端不发送已读回执,服务器就永远不知道我们读了该条消息,对 放也就不会知道我们看过了。

一开始想看有没有人造过轮子,于是github上翻了翻,但没什么收获。不过在翻的过程中发现了一个有 意思的项目:dingtalk-interceptor,但该项目删除了,于是就去网上翻了翻,果然找到了相关的文章,针对的是老版的客户端(3.x),该版本就是Electron包装的一层网页,项目实现原理是通过拦截所有包含updateToRead的请求,从而实现永远未读消息的。

因此我们要寻找的突破口就在这个关键字上:updateToRead

0x03 环境准备

调试环境:

win10 2004 x64

x96dbg

ida7.0

顺便推荐个工具,可以让ida和od/xdbg/lldb等同步调试:

通过不断尝试,发现该聊天软件的核心逻辑都在MainFrame.dll中,因此只针对MainFrame.dll进行搜   索,关键字:updateToRead。

先定位到模块中:

后在该模块中搜索updateToRead,并全部设置断点

发送两条消息并阅读测试,命中断点如下:

关闭其他断点,并用另一个号给调试的账号发送消息,并查看:

在第一个断点处,消息依然是未读状态

在第二个断点处,消息依然是未读状态

在第三个断点处,消息依然也是未读状态

在断到第四个断点处,消息依然是未读状态,但放过断点,消息就变成了已读:

解决方案有几个

1. 破坏原有数据包,使其服务器无法正确更新状态

2. 在发送前拦截该数据包,使其不发送

3. 不进入检测消息是否未读状态

此处通过调用该接口“/r/IDLMessageStatus/updateToReadV2”向该接口发送请求,来告诉服务器,消息已经被读了。此处可以直接暴力将接口修改,修改成错误的地址,也可以实现看了消息不显示已读。  但直接通过该种方式修改,有两个弊端,

1.会向服务器发送一条数据,虽然服务器没能正确处理,但会返回一个异常。

2.客户端收到该错误响应后会认为自己与服务器断开连接,会经常认为自己掉线了从而发不出去消息

路线1走不通,因此继续寻找突破点,使用ida反编译该模块,查找该接口:

发现该接口是出自sub_1127B210函数:

进入sub_1127B210内容:

往上跟踪,发现sub_110BA580调用了sub_1127B210

往上跟踪,发现sub_107269E0调用了sub_110BA580

sub_107269E0函数内容:

其中包含多个接口,作用是向服务器发送一个包含消息id的请求包,从而实现消息已读。

此时已经基本了解大概情况,继续用x64dbg调试,在调试过程中发现在执行完sub_107269E0消息并未直接变成已读,而是继续向上层函数继续返回,直到返回了这样一个函数:

伪代码:

该函数

sub_10C77E70在if ( v3 )

处存在两个分支,一个分支调用sub_10C785D0(i, &v4),

另一个分支即已读分支sub_10C77210(i),也就是我们的call所调用的函数。因此,v3是一个关键判断点

v3所对应汇编代码为:jz short loc_10C77EAC

偏移为:C77298

在C77298上下断点,通过修改寄存器zf标志位,使其进入sub_10C785D0(i, &v4)

修改后发现,后续发送的消息均不显示已读,且不会再进入该判断,因此只要让v3永远=True,即可永不进入sub_10C77210(i)分支,即修改该处条件跳转为jmp

修改后Patch到dll上即可。

特征码:

C0 75 33 8D 45 F0 8B CE 50 E8 CE F1 FF FF 80 7D F0 00 8B CE

修改后:

C0 EB 33 8D 45 F0 8B CE 50 E8 CE F1 FF FF 80 7D F0 00 8B CE

0x05 已读不回

0x07 免责申明

本文是作者闲暇之余,方便自己搞的一个小功能。如果对其他人/公司造成不好的影响请联系我们处理。

推荐文章++++

*一份礼物.apk的逆向分析

*逆向分析Cobalt Strike安装后门【附cs4.1下载】

*菜鸡开始学习逆向工程,首先是最简单的题目

od拦截消息 comboboxonchange_某聊天软件逆向之偷看消息不quot;已读quot;相关推荐

  1. 基于Qt的聊天软件设计实现手把手教学——高仿QQUI设计(一)

    文章目录 前言 一.使用工具 1. Qt Creator 二.项目介绍 1.客户端 1.1 Socket套接字 2.服务端 2.1 数据库 2.2 数据处理 3.效果图 4.总体系统架构图 小结 前言 ...

  2. 12.Java实现P2P聊天软件(服务器端实现)

    经过前面一段时间的学习,我们学习到了如何利用Socket实现各种功能. 下面,激动人心的时刻到了. 我们要对前面学习提纯的Demo进行综合利用,做出一款真正的聊天软件,这个聊天软件不仅可以发送消息,也 ...

  3. Web聊天室消息[已读未读]的实现

    聊天室快速访问 继上次完成聊天室的历史记录功能后,我又想着实现聊天记录的已读未读功能.(轻喷..) 开始之前 首先我看了抖音和钉钉这两款应用的消息已读未读功能的呈现效果.首先是抖音,在聊天界面,给好友 ...

  4. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...

  5. 短信聊天软件需求征集

    *********短信聊天软件功能需求征集************* 前段时间在网上搜S60的短信聊天软件,想像以前palm上进行聊天.可是发现虽然有一些软件有这功能,但总是和以前palm上有差距. ...

  6. 高仿Telegram IM Chat 聊天软件 即时通讯 在线聊天加社群 纯静态UI架构介绍

    高仿Telegram IM Chat 聊天软件 即时通讯 在线聊天加社群 纯静态UI 全端覆盖!苹果手机端.安卓手机端.网页版.电脑PC版.无论哪个平台,都能畅通无阻! 性价比高!功能全面而价格低廉! ...

  7. 小众Tox——大众的“去中心化”聊天软件

    ★Tox是什么 一个反窥探的开源项目:一种基于DHT(BitTorrent)技术的即时通讯协议:一个为安全而生的加密通讯系统 . 美国棱镜计划曝光后,一个名为 irungentoo 的牛人于17天后的 ...

  8. Zulip 2.0.3 发布,功能强大的群组聊天软件

    百度智能云 云生态狂欢季 热门云产品1折起>>>   Zulip 2.0.3 发布了,Zulip 是一个强大的开源群组聊天软件. 用 Python 编写,使用 Django 框架,支 ...

  9. Java实现 简单聊天软件

    简单的聊天软件 //客户端package yjd9; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...

最新文章

  1. Apache学习路线
  2. android:scaleType=matrix布局文件加载图片时候的显示方式
  3. Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别 (Pytorch 代码讲解)
  4. 开机自启动程序关闭方法_电脑非常卡,总有软件偷偷自启动?学会这1招,永久关闭它们!...
  5. 面试官系统精讲Java源码及大厂真题 - 42 常用的 Lambda 表达式使用场景解析和应用
  6. Webservice工具soapUI下载和使用
  7. 本科毕业论文引用、编写英文参考文献格式的方法
  8. dm9000数据速率_STM32网络通信之DM9000A电路设计
  9. linux图片分辨率设置吗,Ubuntu-修改图片分辨率,手机怎么修改图片分辨率
  10. 2013~深圳百公里徒步
  11. 【读点论文】ViTGAN: Training GANs with Vision Transformers 将视觉transformer和gan结合起来
  12. android studio 添加 ignored files 忽略文件
  13. JPA 之 detach方法的使用及注意事项
  14. 含论文基于JAVA的户籍信息管理系统【数据库设计、源码、开题报告】
  15. Oralce数据库断电之ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [37]
  16. 7个流行的强化学习算法及代码实现
  17. java字符串上坡度,坡度分析 | SuperMap iDesktop Java
  18. 计算机毕业设计Java教务排课系统(源码+系统+mysql数据库+lw文档)
  19. 2.2 法学的历史(二):中国法学的历史
  20. python .net web开发对比_Python与C#/.NET——在使用Python开发大型web应用程序时,需要考虑哪些关键区别?...

热门文章

  1. 使用Calendar增加日期
  2. Javascript s04
  3. Server.MapPath方法的应用方法(转)
  4. python随机读取字符_Python random模块(获取随机数)常用方法和使用例子
  5. Git(6)-- 记录每次更新到仓库图文版(git clone、status、add、diff、commit、rm、mv命令详解)
  6. Java静态代理、动态代理以及CGLIB动态代理
  7. Mac安装jadx查看dex文件
  8. socket解决:Address already in use报错问题
  9. android c++标准命名空间demo
  10. 计算机基础(七):ION定义与使用方法