OICQ 99c版本加密方法研究报告
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 是安全的,仍然在
使用的早期用戶間明文通信協議不在本文考慮之內。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3275
總結
以上是生活随笔為你收集整理的OICQ 99c版本加密方法研究报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp企业财务管理系统设计与实现(论文+
- 下一篇: 如何提取flash游戏和保存其进度