分享
 
 
 

OICQ 99c版本加密方法研究报告

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

OICQ是Internet网上常用的通信软件,本文将给出OICQ最新版99c的口令加密方法

、与服务器进行通讯的加密方法和用户之间的加密加信方法。

一、 口令加密

每个oicq帐号的口令都保存在本地的一个文件中。登录oicq时,先将输入的口令

与本地的文件进行比较。如果口令与文件中保存的不符,将提示"输入的密码与上

次成功登录的密码不一致,是否到服务器验证?"。

OICQ 99c的口令文件为matrix.cnt。OICQ 99b的口令文件为matric.ewh。

口令加密算法的函数原型为:

void CalcPassword(char *password ,int len ,char *outbuffer)

参数:

password为输入的明码口令

len: password长度

outbuffer:固定16个字节长度的加密后的口令。

说明:该函数用调试工具查到入口地址为15f:456718。在口令加密和用户之间通

讯时都要用到这个函数。已知能够计算的最长口令为20个字节,见下文用户之间

加密通信。

Oicq99b的口令文件就是将口令进行一次CalcPassword计算后保存在每个oicq帐号

目录中的matrix.ewh,该文件正好为16个字节。因此有这个文件就可以使用暴力

进行口令破解了。

Oicq99c的口令文件就复杂多了,第一次将明码的口令用CalcPassword进行计算,

然后将结果再作为口令进行计算,迭代计算很多次。计算次数用4个字节的双字表

示。将4个字节的次数和计算后的口令保存在每个oicq帐号的matrix.cnt文件中,

这个文件正好为20个字节长度。因为迭代计算了很多次,使口令计算时间极大地

延长了,使用暴力破解oicq99c的口令几乎不太可能。

二、 聊天历史的查看

与每个人聊天的历史都存在自已的oicq号目录下,文件名为对方的oicq号.msh(9

9b)或.msj(99c)文件中。

核心解密函数的原型为:

BOOL Decode(char *src ,int srclen ,char *decodekey, char *outbuffer,in

t * poutlen)

参数:

src:存放加密数据的缓冲区。

Srclen:src字节数。

Decodekey:固定16个字节的密钥。

Outbuffer:输出明文缓冲区的地址。

Poutlen:解密后的长度存放地址。

说明:该函数入口地址:15f:456D33。这个函数以密钥进行解密。如果成功返回

TRUE,否则返回FALSE。

显而易见,解密的关键是如何得到16个字节的密钥decodekey。

查看聊天历史的密钥生成不需要口令。算法为:

1、用当前使用的oicq号为口令,调用口令计算函数CalcPassword,得出一个临

时密钥keycode1。

2、用keycode1为密钥,进行解密。数据为文件matrix2.ewh(99b为matrix.ewh)

从0起第17个字节,长度为32个字节,解出16个字节的密钥为keycode2。

3、 用keycode2为密钥,可以解开跟任何人聊天的历史。

例如要查看oicq号为123456的聊天历史记录,算法为:

BYTE keycode1[16];

BYTE filebuffer[32];

//读文件matrix2.ewh,从0起第17个字长,长度为32的内容读出保存在filebuff

er。

ReadToBuffer(filebuffer);

//用当前的oicq号计算keycode1

CalcPassword('123456', 6 , keycode1)。

//计算keycode2

BYTE keycode2[16];

int len = 16;

Deocode(filebuffer , 32 , keycode1,keycode2,&len);

//现在keycode2就是能看任何聊天历史的密钥了。

//如看跟888888的聊天历史,将文件888888.msj读到缓冲区largerbuffer

Decode(largerbuffer,largerbufferlen,keycode2,outbuffer,*outlen),成功后

outbuffer中为解密后的聊天记录。

三、 与服务器通信的加密

与Decode相对应,是一个加密函数Encode。

void Encode(char *src,int srclen,char *encodekey,char *outbuffer,int *

poutlen)

参数:

src:明文缓冲区。

Srclen: 明文缓冲区的长度。

Encodekey:固定16个字节的加密的密钥。

Outbuffer:输出加密缓冲区。

Poutlen:输出长度的保存地址。

说明:该函数入口地址:15f:456b62。将明文进行加密,密钥为encodekey。用d

ecode函数和同样的密钥可以进行解密。

l 登录服务器:

发送的数据包为

{BYTE b1;固定为0x2

BYTE b2;固定为0x3

BYTE b3;固定为0XA

BYTE b4;固定为0X0

BYTE cmd; 登录服务器为0X15。

WORD seq; 顺序号,从高到低存放

DWORD oicq号;以从高到低顺利存放二进制的OICQ号。

BYTE key[16] ;随机产生的16个字节的密钥。

BYTE buffer[64];64字节的加密内容。

BYTE endchar ;固定为0x3。

最核心的是buffer[64]的内容。用口令调用CalcPassword进行一次计算,然后作

为密钥对0长度的明文进行加密,得出16个字节的结果,再进行加密发送。例如口

令为'abc123',算法为

BYTE passkey[16]

CalcPassword('abc123',6',passkey)

BYTE keycode[16]

int keycodelen=16;

Encode(0,0,passkey,keycode,&keycodelen)

BYTE sndbuffer[51];

memset(sndbuffer,0,51)

memcpy(sndbuffer,keycode,16)

//sndbuffer其余的内容为当前机器的ip等信息,与检查口令无关

BYTE result[64]

int sresultlen=64

Encode(sndbuffer,51,随机产生16个字节的密钥,result,&resultlen)

最后把16个字节的随机密钥和64字节加密后的口令一同发给服务器验证。如果能

用sniffer侦听到别人与服务器的通信,就能进行口令破解。当然也可以通过服务

器进行在线的口令破解,只是速度很慢,没有实用价值。

l 如果登录成功,服务器返回16个字节的密钥--ServerKey。

l UPD数据包的格式为

BYTE b1;固定为2

BYTE b2;固定为1

BYTE b3;固定为0

BYTE b4;固定为0

BYTE cmd;登录为0X15

WORD seq;从高到低顺序,与发送的seq一致。

BYTE msg[56];

BYTE endchar ;固定0x3。

用口令经过一次CalcPassword计算,得出16个字节的密钥,对msg进行解密。从第

1个字节开始的16个字节即为与服务器通信的密钥暂称为ServerKey。该密钥经常

变化。

在本次登录中,以后所有跟服务器的通信都用这个ServerKey为密钥进行加密和解

密。

四、 其它用户发来的加密消息的解密。

其它用户的发来的加密消息格式为:

BYTE b1;固定为0x0

BYTE b2;固定为0x3

BYTE b3;固定为0xA或0X2

BYTE salt; OICQ号加密用

DWORD EncodeOicqID;加密后的从高到低的oicq号。

DWORD seq;序号

BYTE msg[变长]

l 对方oicq号的解密。

将EncodeOicqID的4个字节分别与salt进行异或操作,然后取反。

如salt = 0XA0, EncodeOicqID = 0X 5F5EBD1F。

//分别进行异或操作

0X 5F5EBD1F XOR 0XA0A0A0A0 = 0X FFFE1DBF

//再取反

NOT 0X FFFE1DBF = 0X1E240,转为10进制就是123456。因此对方的oicq号为123

456。

l 消息的解密。

先合成一个20字节的口令。前4个字节为从高到低的二进制对方的oicq号。后16个

字节为服务器发来的ServerKey。ServerKey的来源见第三节。

如对方的oicq号为123456,20字节的口令为

00 01 E2 40 + 16字节的ServerKey。

用口令算法对这20字节的口令进行计算,得16个字节的密钥,就可以解开对方发

来的消息。

五、 发给其它用户消息的加密

在登录后,服务器会通知好友的IP地址和端口,以及一个16个字节的密钥。就是

当前的OICQ号加对方16个字节ServerKey通过CalcPass的计算结果。

向对方发送消息时,只要用这16个字节进行加密即可。

六、 一些结论

oicq 99c的加密是严密的,不易进行破解。除非得到某人的口令,否则不可能进

行消息假冒等。如果你有每秒能运算百亿次的巨型机,也许能解开对方跟服务器

通信的16个字节的ServerKey,而且必须要快。总之oicq 99c 是安全的,仍然在

使用的早期用户间明文通信协议不在本文考虑之内。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有