关于OICQ(200分)

  • 主题发起人 主题发起人 UFO is me
  • 开始时间 开始时间
U

UFO is me

Unregistered / Unconfirmed
GUEST, unregistred user!
我们的主机是通过代理服务器上网的,而网管关闭了服务器的某些功能,
使我们不能用OICQ,但我想能不能写一个程序 A,发布到自己在某个网站上的网页中,作为
一个中转,自己的主机上则放一个客户程序 B。
自己的OICQ发的消息首先是通过 B 转化成HTTP格式的消息传到 A, 然后由 A 再把接受到
的消息,转化成OICQ格式的消息,传给目的人。
接受时也一样。A 先接受到消息,再传给 B, B再传给OICQ
注:s2h 作不到这个功能。(我用s2h 也没有用)
我觉得,我们首先要知道OICQ 的 传输协议。
 
OICQ 的传输协议能有几个人知道?
 
不可能(可能性很小)
 
不是有那种把sock等协议转成http协议的软件的吗?
可惜记不清是在电脑报上还是计算机文章上看到的。
 
如果可以的话,OICQ早就被别人黑了。
 
搞清楚QQ的协议基本上不可能,你的意思其实就是架一个代理服务器,但是要求也太高了,
要求只能在网页上实现。ASP除非ASP服务器上有ACTIVEX控件可以使ASP使用SOCKET,JAVA
APPLET的SOCKET一般则只能连回到原来的服务器,PHP的也有类似问题。如果以上关键的
问题解决了则我想完全可以实现架设一个网页上的代理服务器。不过话说回来,这个东西
耗的资源也太不合算了,除了自己偷偷用之外,大规模用不如找一个真正的代理服务器。
 
它走的是udp.
 
这个是把socks请求转成http请求,如果你那边连http都不开的话,建议公司换你做网管算了
Socks2HTTP 查看版本及下载 >>
一个代理服务器协议转换软件,它能将基于 Socks 协议的请求转换为HTTP协议的请求,并通过你指定的 HTTP代理服务器处理这些请求。此软件配合 SocksCap32,能使只提供 HTTP 代理服务的局域网或是 169 用户使用非HTTP协议的软件,如 FTP 客户端软件,E-Mail 客户端软件,Telnet 客户端软件,以及聊天软件等等!
http://202.101.237.103/f/jwjjt/soft4/setups2h07.zip
http://202.101.237.103/f/jwjjt/patch10/s2h07-ro.zip
 
这软件似乎very slow,我用过,只能发一条信息就不行了。结果我还是用代理。

你可以试试61.144.238.145作服务器地址,端口号8000
 
有谁能告诉我,oicq接受消息的端口号是多少?

socks2http 我这根本用不了,一连接就报错。
用djdsz的服务器地址也没有用。
 
呵呵,只要一锁8000的端口,OICQ服务端口, 你会飞天也收不到OICQ信息,
OICQ服务器传不进来!
解决方法:1、和网管搞好关系;
2、争取自己做网管,最好是老总:)
3、跳槽。
 
最新版本的qq2000支持http代理了
 
用djdsz的服务器地址有用. 我就是用那个的。
 
还是不行呐!太惨了。icq 都可以,oicq 却不行。
 
OICQ 的传输协议:
协议是UDP的,但问题是在于它的信息加密格式不知道.
如果QQ接收到信息后发现加密不对就不显示出来(不弹出窗口)
 
我在WWW.CSDN.com上看到一张帖子讲的是OICQ的协议,我还未研究完,现帖上一起研究。

发信人: flyingblue (好想睡觉!), 信区: Encrypt
标 题: Re: 请教OICQ的加密原理
发信站: 武汉白云黄鹤站 (Wed May 31 13:52:22 2000), 站内信件

c前言:
Oicq 作为Inet实时通讯应该是一个不错的选择,
众多的用户群也证明了这点。(按照腾讯主页(www.tencent.com)
上的说话,截至目前,Oicq 用户已经突破 450 万,而且以每天30000的速度增加)
在安全问题日益突出的今天,一个如此*广泛使用*的产品不去考虑
安全方面的问题,显然是不明智的。而且这个考虑应该是在产品
规划阶段就提上日程的。Oicq 显然没有把安全放在第一位,几个月
前,安安(watchsea@sina.com)就已经指出了 Oicq 存放在本地的用户
口令仅仅使用了微弱的加密手段。 ( build:220 中,Oicq
声称已经将其修正)
经过我们的分析测试,更加严重的问题还在后面。在发现了这些问题后,
我们马上通知了腾讯公司,腾讯的反应很快,一夜间,Oicq 的版本就从
220 升级到了 410 . 在其 whatnew 中,声称解决了这些问题。
我们立即对其进行了测试。应该看到,在 Oicq build 410 中,腾讯使用
了某种加密协议,从而解决了明文传输的问题。应该说是一个很大的进步。
因此本文分为两章,第一章针对 Oicq Build 220 及其以下版本。
第二章针对 Oicq Build 410 (截至目前最新版本)
应该看到,本文不带有任何地感情色彩,我们也是使用 Oicq 进行日常的
联络的.希望腾讯公司能尽快的解决这些问题。
- I -
-
测试报告:
除开安全问题,Oicq 应该是一个很好的选择,其功能实用,不花哨。
但作为一个放在互连网上的产品,必须还要考虑到安全性。
Oicq 采用的是 server-client 模型,使用的是 UDP 协议。和 TCP 相比,
UDP 本身就是不可靠的,可被轻易的伪造。使用 UDP 协议的软件必须自身在
两端进行可靠性检测。但和 TCP 相比,UDP 在资源占用上显然要
小许多,这也是 Icq,Oicq 选择 UDP 的一个主要原因。
经过分析,Oicq 在所有的传输过程中,任何数据都使用了明文发送,也就是
说,一个窃听者能直接的偷听到经过其的所有 OICQ 信息。这是一个不大不小
的问题,象往常一样,你有两个选择,更低的资源占用率和更高的安全性。很难作出
决定在二者之间。显然, Oicq 选择了前者。
在Oicq中最常用的消息传送时,Oicq 采用了如下策略: 当二者能直接(点到点)
通讯时,消息就直接的发送到对方,否则重试 N 次后通过Oicq 服务器转发。接受方
在收到消息后返回一个回应信息,发送方就是通过这个信息来确认消息是否已经收到。
消息的结构是:
(注意:本文中所有的 Oicq 协议结构是通过分析得来,不能保证其正确性)
struct TOicqPtoP
{
char Tag1; // 0x02 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag2; // 0x01 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag3; // 0x07
char Tag4; // 0x00
char Tag5; // 0x78
char Tag6; // 这两个字节相当于 unix 上的进程 ID,
char Tag7; // 随便赋值就可。
char cOicqNub[]; // 发送方的Oicq 号码。 exp:123456
char cFF; // 0x1f 在所有的Oicq 信息结构中,分割符都是 0x1f
char cR; // '0' 固定
char cFF; //
char cE[]; // "75" ,这一位相对固定,可能是操作方式。
char cFF;
char cDateTime[]; // exp: "2000-4-10",0x1f,"12:00:12",0x1f
char OutMsg[]; // 发送的消息内容。
char cEnd; // 0x03 ,所有的 oicq 信息都已 0x03 为标记结束。
};
当接受方收到以上格式的 Udp Packet,就会显示有信息收到,完全没有其他的验证过程。
也就是说,如果我从 linux 上发了个符合上述格式的 Udp packet,在 cOicqNub 处可填
写任意的oicq 号码,也就是可以伪造了任何的 oicq 号码。(你看到Oicq 上显示号码
为 1 的用户向你发信,不要吃惊。)
例如:有 A, B ,C 三用户,Oicq 分别是:
A: 10000
B: 20000
C: 30000
已知 B 和 C 是好友,则 A 可以发送一个带有 B 号码的Udppacket 给 C, 在
C 处看来,完全就像是 B 亲自发给他的一样,但此时如果 C 点回复的话,
信息会回到 B 的地址(IP)上。A 不能收到。也就是说 A 只能冒充B 发消息。
如果此时 A 不停地发,就形成了 Oicq Flood,注意的是,此时Tag6,Tag7 两处要不停地
变化,Oicq 对两个完全一样的信息只显示一次。
严重的是,虽然Oicq 本身对发送的消息的长度做了限制,但这种限制是在发送方进行的,
一旦发送的长度超过 2000 or >2000 个字节,接受方的 Oicq 就会发生缓冲区溢出,
相当严重的远程溢出。
接下来就是谈谈怎样让 C 回复伪造消息时直接返回到 A 处。
运行 Oicq 时,过程如下:
start oicq.exe-> 上线 -> oicq 把口令发给 oicq server -> oicq server 返回
其好友名单以及其对应的 IP (Oicq 把他存到本地内存中的一张表中)
当 Oicq 给相应的好友号码发送消息时,依据的地址就是这个 IP.
即首先与该 IP 联系,反复多次没有回音就通过服务器转发。
下面是 Oicq server 通知Oicq 好友上线和下线的消息结构:
struct TOicqUp
{
char Tag1; // 0x02 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag2; // 0x01 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag3; // 0x00
char Tag4; // 0x00
char Tag5; // 0x81
char Tag6; // 这两个字节相当于 unix 上的进程 ID,
char Tag7; // 随便赋值就可。
char cOicqNub[]; // 通知上线的Oicq 号码。 exp:123456
char cFF; // 0x1f 在所有的Oicq 信息结构中,分割符都是 0x1f
char cIP; // 该号码所在的 IP 地址
char cFF; //
char cE[]; // "8685" ,这一位相对固定,随便添一个四位数字
char cFF;
char cDD[]; // exp: "10",0x1f,"107" 基本固定
char cEnd; // 0x03 ,所有的 oicq 信息都已 0x03 为标记结束。
};
//--------------------------------------------------------
struct TOicqDown
{
char Tag1; // 0x02 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag2; // 0x01 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag3; // 0x00
char Tag4; // 0x00
char Tag5; // 0x81
char Tag6; // 这两个字节相当于 unix 上的进程 ID,
char Tag7; // 随便赋值就可。
char cOicqNub[]; // 通知上线的Oicq 号码。 exp:123456
char cFF; // 0x1f 在所有的Oicq 信息结构中,分割符都是 0x1f
char cIP; // 该号码所在的 IP 地址 // 随便填
char cFF; //
char cE[]; // "8685" ,这一位相对固定,随便添一个四位数字
char cFF;
char cDD[]; // exp: "20",0x1f,"107" 基本固定
char cEnd; // 0x03 ,所有的 oicq 信息都已 0x03 为标记结束。
};
向目标发送一个上述的UDp packet ,可让任意的在其列表上的好友上线或下线。
在上线时,IP 可填任意的你所希望的。然后Oicq 就会更据该 IP 来发送消息。
这样,上面的例子就改为:
首先, A 发送一个带有 B 上线信号的消息给 C, 但其 IP 添写 A 自己的IP,
不管此时 B 在线上没有, C 的 oicq 中就会显示 B 正在线上,此时 C 给 B 发消息,
更据的地址(IP) 就是 A 的地址,其所有的消息都会发往 A 处。
但此时有个问题:
如果 C 反复发送多次都没有收到来自 ‘B' 的回复时,就会通过Oicq 服务器转发。
这样 真正的 B 也会收到。解决方案是 C 在收到消息的同时也给 A 发送一个
回复。结构是:
struct TOicqReply
{
char Tag1; // 0x02 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag2; // 0x01 // 显然是 Oicq 的协议编号 or 版本,固定
char Tag3; // 0x07
char Tag4; // 0x00
char Tag5; // 0x79
char Tag6; // 值得注意的是,此时Tag6,Tag7 不能随便了,应该添写发过来的消息中的
char Tag7; // Tag6,Tag7.
char cOicqNub[]; // Oicq 号码。 exp:123456
char cEnd; // 0x03 ,所有的 oicq 信息都已 0x03 为标记结束。
};
//--------------------------------------------------------
值得注意的是,如果此时 A 所指定 C 回复的 IP 处正好有一个 Oicq ,
C 发给 B 的信息就会直接显示在其上面,不用伪造回复包。
至此,完整的一次Oicq 欺骗就完成了。
再来一次:
A 发送一个带有 B 上线信号的消息给 C, 但其 IP 添写 A 自己的IP(或所希望的),
这样 C 的 oicq 中就显示了 B 正在线上,当 C 给 B 发消息时,更据的地址
却是 A 的地址,其所有的消息都会发往 A 处。A 及时的返回一个表示已收到的消息
给 C ,C 处不会感到任何地异常,就仿佛是在和真正的 B 通讯一样,
如果当 A 发送消息时 B 已经在 C 的 Oicq 线上,此时 C 的 IP 表中关于 B 的ip
是其真实的 地址,此时我们有两种方法:
1. 向 c 发送一个 B 已下线的信号,让真正的 B 下线,然后再发送一个假的上线信号
2. 直接发送一个假的 B 上线信号,同样的, C 的IP 表中关于 B 的地址也会更新。
在 Oicq 的所有消息传送过程中,除了上线和下线时向oicq server 效对了口令之外,
其余的所有过程中,都没有进行任何的口令效验. 显然这是腾讯公司程序员的疏忽。
-
- II -
-
在我们告知腾讯公司关于 Oicq 的问题之后,腾讯很快的就推出了一个新版。
以修正其安全问题。在此之前,我就得知,Oicq 最近会有大的改动,可能是我们的
原因,迫使得他们提前将不成熟版推出。在新版中, 腾讯使用了某种新的算法将所有
的明文进行加密。算法的强度我们不得而知。但应该会在很大的程度上增强其安全性。
如果其早一周公布,这篇文章也就不会公布了。
在新版中,以前能随意使用户上下线的方法不行了,但其他的问题依然存在。
首先是缓冲区溢出,问题依然,任何熟悉安全的人士都知道这是个严重问题,
远不止当掉 Oicq 那么简单。希望腾讯能马上解决。
其次是类似于 build: 220 中那种假冒任意用户的 bug 依然如故。方法一样。
这也是个严重的问题,我们应该相信谁?
最后是象 Build 220 中那种完全欺骗 C 的技巧依然存在,即可以在某些情况下
截获任何人的对话,然后冒充之。
这个问题严重吗?赫赫
老话,希望腾讯马上修正。
-

总结:
有 ICQ 的前车之鉴, Oicq 本应做得更好。作为一个传递着纵多用户隐私的重要
通讯工具,Oicq 应该说在安全方面做得很糟。发展到现在,为了保持向下兼容,Oicq 也
很难立即作出大的改动。希望腾讯公司能尽可能修复这些问题,保护好广大用户的利益。
zer9 (zer9@21cn.com)
2000-4-12 15:47 于 I S B A S E 网络安全实验室
-
附录 & FAQ:
001.exe 和 002.exe 只是作为测试使用,请不要使用在违背国家法律的地带。
001.exe 和 002.exe *只能* 使用在 Microsoft Windows2000 平台上,测试是在
Windows2000 Server & Windows2000 Adv Server 上进行的。
001.exe 的作用是向目标发送完全匿名的消息,以及测试 Oicq 的远程溢出。
同时,对于 Build: 410 的 Oicq ,你向目标发送的匿名消息,目标回复时,消息
会回到指定地点。(UPD 源地址) 如果你正好在 该地址上装有 Oicq, 就会直接显示。
exp: 已知 A: Oicq: 10000 IP: 10.0.0.1
B: Oicq: 20000 IP: 10.0.0.2
C: Oicq: 30000 IP: 10.0.0.3
A 希望冒充 B 给 C 发送消息,同时希望接受到 C 给 B 的回复。
则在 UPD 源地址中添 A 自己的 IP,目标地址添 C 的 IP,目标号码添 B 的号码,
端口不变。就可以了。
002.exe 则只能用在 Build: 220 一下版本中,主要是使对方上下线。
最后,如果测试的任何一方处于网管或 Firewall 后,都可能不会成功。

声明:我们对该程序不提供技术支持,也不提供任何的保证)

 
OICQ用户到OICQ服务器的通讯协议 引导符 (0x81+0x0A+0x01)
报文类型 报文内容 报文说明
0x01 昵称(S)+肖像(M)+用户密码(S)+性别(T)+年龄(T)+真实姓名(S)+国家/地区(T)+省(T)+市(S)+地址(S)+邮编(S)+学历(T)+毕业院校(S)+职业(T)+电话(S)+寻呼(S)+电邮(S)+爱好(S)+说明(S)+身份验证(T)新用户注册,身份验证用于当有人要将他加入好友时询问是否允许
0x02 服务号(L)+密码(S)+注册方式(T)老用户注册,方式分为0正常,1隐身
0x03 服务号(L)+对方服务号(L)+内容(S) 发送信息到某人
0x04 服务号(L)+组号(L)+内容(S) 广播信息,组号=0为全体
0x05 服务号(L)+朋友服务号(L) 查看朋友资料
0x06 服务号(L)+组名称(S) 增加组
0x07 服务号(L)+组编号(T)+组名称(S) 修改组名称
0x08 服务号(L)+组编号(T) 删除组
0x09 服务号(L)+移动人数(T)+{朋友服务号(L)+目的组号(T)} 移动组成员
0x0a 服务号(L)+起始编号(L)+回传个数(T)+查找标志(T) 看谁在线上
查找标志 1=向小找 2=向大找
0x0b 服务号(L)+SQL语句(S) 自定义查找
0x0c 服务号(L)+朋友服务号(L) 增加好友
0x0d 服务号(L)+朋友服务号(L)+加入原因(S) 请求加入好友
0x0e 服务号(L)+朋友服务号(L) 删除好友
0x10 服务号(L)+显示模式(T) 更改显示方式 1上线2隐藏3免打扰4离线
0x11 服务号(L)+监视服务号(L) 监视某人谈话
0x12 服务号(L)+昵称(S)+肖像(M)+用户密码(S)+性别(T)+年龄(T)+真实姓名(S)+国家/地区(T)+省(T)+市(S)+地址(S)+邮编(S)+学历(T)+毕业院校(S)+职业(T)+电话(S)+寻呼(S)+电邮(S)+爱好(S)+说明(S)+身份验证(T)更改用户基本信息
0x13 服务号(L)+朋友服务号(L)+文件名(S)+文件长度(L) 请求发送文件
0x14 服务号(L)+朋友服务号(L)+允许/拒绝 是否允许发送文件
0x15 服务号(L)+朋友服务号(L)+文件内容(B) 发送文件
0x16 服务号(L) 连接测试报文
0x17 服务号(L)+朋友服务号(L)+同意标志(T) 应答对方请求加入好友
0=拒绝
1=同意

OICQ服务器到OICQ的通讯协议
报文类型 报文内容 报文说明
0x01 成功/失败(T)+服务号(L) 新用户注册结果返回
0x02 成功/失败(T)+组个数(T)+{组名称(S)+组编号(T)+朋友个数(T)+{朋友服务号(L)+肖像编号(T)+朋友状态(T)+朋友昵称(S)] 老用户注册结果返回
朋友状态
1=上线=2隐藏=3免打扰4离线
0x03 标志(T) + 朋友服务号(L)+信息(S)+信息类型(T) 标志 1=系统 2=用户
发送消息,服务号=0是系统消息
1=用户某某已经把你加为好友
2=用户某某请求你通过身份验证
3=用户某某同意了你的验证要求
4=用户某某拒绝了你的验证请求
0x04 成功/失败(T)+朋友服务号(L)+昵称(S)+肖像(M)+性别(T)+年龄(T)+真实姓名(S)+国家/地区(T)+省(T)+市(S)+地址(S)+邮编(S)+学历(T)+毕业院校(S)+职业(T)+电话(S)+寻呼(S)+电邮(S)+爱好(S)+说明(S)朋友信息回送
0x05 成功/失败(T)+组编号(T)+组名称(S) 增加组结果回送 1/0
0x06 成功/失败(T)+组编号(T)+组名称(S)修改组名称结果回送1/0
0x07 成功/失败(T)+组编号(T) 删除组结果回送1/0
0x08 成功/失败(T) 移动组成员结果回送1/0
0x09 成功/失败(T)+在线个数(T)+{服务号(L)+昵称(S)+肖像(M)+省(T)+市(S)} 查找在线人员结果回送
0x0a 成功/失败(T)+找到个数(T)+{服务号(L)+昵称(S)+肖像(M)+省(T)+市(S)} 自定义查找结果回送(最多50)
0x0b 标志(T)+朋友服务号(L) 增加好友结果回送标志
0=数据库失败
=1成功
=2需要身份验证
=3对方不允许加入
=4需要身份验证且不在线
0x0c 朋友服务号(L)+昵称(S)+肖像号(M)+朋友状态(T) 给在线用户增加好友
0x0e 成功/失败(T)+朋友服务号(L) 删除好友结果回送
0x10 服务号(L)+显示模式(T) 显示模式回送 =1上线=2隐藏=3免打扰4离线
0x11 成功/失败 更改用户基本信息结果回送
0x12 朋友服务号(L)+文件名(S)+文件长度(L) 请求发送文件
0x13 朋友服务号(L)+允许/拒绝 是否允许发送文件 1允许 0拒绝
0x14 朋友服务号(L)+文件内容(B) 发送文件
0x15 朋友服务号(L)+当前状态(T)朋友状态回送(系统发送)=1上线=2隐藏=3免打扰4离线
0x16 服务号(L) 连接测试
 
高人啊,。。。
 
udp如何发送Record类型的数据?

Type apple=Record
color:=Color;
name:string;
end;

..................
 
我爱高手!
TmpStr:=char($81)+char($0A)+char($01)+char($02)+'10000'+'(L)'
+'123123'+'(S)'+'1'+'(T)';
MyStream := TMemoryStream.Create;
try
MyStream.Write(TmpStr[1], Length(tmpStr));
UDP.SendStream(MyStream);
finally
MyStream.Free;
end;
我这样写为什么没反应?
 
后退
顶部