研究QQ密码的算法

在QQ对应号码目录下user.db文件从800h起20字节为与密码相关数据,其中后16个字节和Hash后摘要有关.这20个字节后4个字节是QQ号码。
下列是一些常用的Hash算法(从微软加密头文件中提取出来的)

#define CALG_MD2 1 MD2算法 \ iga Q\~
gt@SuX!@{^
#define CALG_MD4 2 MD4算法 "-0;#&!
h'!V8'}O?
#define CALG_MD5 3 MD5算法 U&Ab# m;
fnOIv#
#define CALG_SHA 4 SHA算法 (yGQa5v
^@"c`
#define CALG_SHA1 4 SHA1算法 "kr,x3 =
qHJ'1~?q
#define CALG_MAC 5 MAC算法 G_+Ph^
v:A:37#I
#define ALG_SID_RIPEMD 6 RIPEMD算法 HtUG#sc&`{
#define ALG_SID_RIPEMD160 7 RIPEMD160算法 >HIt}Zh
+;6)
#define ALG_SID_SSL3SHAMD5 8 SSL3SHAMD5算法 #B}Qt5w
]4GZ'&m}
#define CALG_HMAC 9 HMAC算法 Q]T BQ&
W]@6=OpH
*:[b'D!A
而MD5算法中需要使用下面几个初始值 zu [email protected]
kJ__:rS(T_
context->state[0] = 0x67452301; ",QPb3
Y6a$gXRT
context->state[1] = 0xefcdab89; &<@%{h@ =
)6g&v'dq
context->state[2] = 0x98badcfe; 4[Z1r~t\L
AsD1-$
context->state[3] = 0x10325476; wD}EW
|^Ur
呵呵,在QQ中一搜索,果然几个特征值赫然在目。但是显然QQ使用了上述20个字节中的前四个字节对MD5密文又做了处理,我跟了两天还是没有头绪(头晕脑胀)。但是我发现把这四个字节改成00 00 00 00,然后登陆输入正确密码,仍然会提示密码不一致是否到服务器验证,选择是,然后验证成功后,这20个字节的后16个字节恰好就是密码的MD5密文。有兴趣的高手可以继续看看奥(其中密码比较函数地址为:004A7E0C) Qf" 6PJ
zz[g{[SN
例: 9t.fij
Z3Bo @`&?
1B D5 01 00 5D D7 87 19 0D 92 6D E2 0A 56 E9 19 63 0F 5A E1 DF CA 20 05 *;>V2!N=U
5?<|3
DF CA 20 05即是我的QQ号。不过可不要暴力破解我的奥:) [_B+DD=}
*>?):-9"6N
1B D5 01 00 5D D7 87 19 0D 92 6D E2 0A 56 E9 19 63 0F 5A E1就是和口令相关的数据 aNuZ/9O
GapX$Jb,p
如果把1B D5 01 00改为00 00 00 00,然后按上述步骤登陆后,5D D7 87 19 0D 92 6D E2 0A 56 E9 19 63 0F 5A E1即变为口令的MD5密文。 Hsd|ka$x>
"@UU[o
A?6 {
算法源代码如下: ;T"m [D
$_ I%1
头文件: F$sF 'cw
5Xy^I^J
5,=B 1
// Decrypt.h: interface for the CDecrypt class. QB.*R?A
Y/e N)
// y uK5r
j O5:{%
////////////////////////////////////////////////////////////////////// 65e Wu=T
JXy667_
#define AFX_DECRYPT_H__916D97B8_C120_4435_BE23_2CF35B8763A2__INCLUDED_ J ]l@ r
'14l )1g.
E#X!*q&
#if _MSC_VER > 1000 !.GY~f5J2p^$s
#pragma once /s0VyUV=
8; N}d)*O
#endif // _MSC_VER > 1000 "dU#j,B2
(#Kvm
V1V4 #define _WIN32_WINNT 0x0400 _4#psxl[M
XD>@EYN#include Q $5:P&
srA ~gzF
#include R;ug+N
e5]0nClU 5
class CDecrypt %>z}P&Yz
R[t[M}q
{ lU& IS?^?
ZC-N4ESr
public: V ZGhF!To
-9EbU7>!
BOOL EncryptMessage(const TCHAR *Message,TCHAR *pHashData,int *pHashLen,int Algorithm); _6( =0::x
*XuzTGa"
CDecrypt(); +zvK/Fj2q
CAO$Z t
virtual ~CDecrypt(); )I@iW\`7
P+xZaf H
@47TDCr
}; Y*6*;0Kx
h W-[omr0
A /MOY@%G
#endif // !defined(AFX_DECRYPT_H__916D97B8_C120_4435_BE23_2CF35B8763A2__INCLUDED_) V1+IqOXAIp
)}EwEM
?VJ Fp^Ra
CPP文件: z\ \MLyS
6K,AQ.=V2
// Decrypt.cpp: implementation of the CDecrypt class. dfNNCPu]+
m49)cK?
// 5YRa2 #d
VLRW,lR9O
////////////////////////////////////////////////////////////////////// xw`Pq6
SDZ/rC!C
w?Y;pc}1B
#include stdafx.h G{)2f &<
[8[g_
#include Decrypt.h 8a)lrIg
,Tjc\;~%
g\:(1oY
#ifdef _DEBUG muc6gwBp
F!ZE4S_
#undef THIS_FILE KDxqz$14 -
"lLwgh;
static char THIS_FILE[]=__FILE__; Nk2n&(~$
#K&XY6cTj
#define new DEBUG_NEW \?tE,\Ln
?xW,2S
#endif 8B! MgNKV
hh!4DHv
gz#2}
////////////////////////////////////////////////////////////////////// Gv&%cq1
&G!~@\tMg
// Construction/Destruction mWF\h>]|.
Lb#PiTJI
////////////////////////////////////////////////////////////////////// _6m{zvyX>
1HLU &
M?5voV*
CDecrypt::CDecrypt() 85q!FpuH
'Z|Czd8E
{ He%v 4S
\~r_S
a]J>2A@-I
} {b-SK5%]L
|[p]]) o
A"0Yn(awWu
CDecrypt::~CDecrypt() k8i0`VY5Y
5k?xBk=<
{ Q(R -8"
gQ|?~hYYv
/g8nT1k
} 4^9qs%&
32pPeYxB!-
? :A%$T
BOOL CDecrypt::EncryptMessage(const TCHAR *Message,TCHAR *pHashData,int *pHashLen,int Algorithm) 1_8@yO
4tvZJS hV
{ [(vV45(E
gQeoCBCE
BOOL bResult = TRUE; $J]NWgXl@
A>)W6|m|
VK|$SY(
HCRYPTPROV hProv = NULL; N*KM6j
`R-VJR 2"
HCRYPTKEY hKey = NULL; h0l_9uI
~S0T+4$
HCRYPTKEY hXchgKey = NULL; pQ`S%]k.<
T 6=~vOzTJ
HCRYPTHASH hHash = NULL; %vU*4mH
^!K 8nW{*
DWORD dwLength; ;{"uG>#R
tsf !Q
// Get handle to user default provider. >fgV!o4
`R o>?H
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) #M8>)oc
L9 H.DNA
{ qAuq2pHA+d
CV6W)B%Se
// Create hash object. ?[ v C?P
.sif (CryptCreateHash(hProv, Algorithm, 0, 0, &hHash)) Z(fhH..T`
+v'n[xa1v
{ "Q<* H]6{\`a
// Hash password string. K1>(Fs$
`+0)dTA(g$
dwLength = sizeof(TCHAR)*_tcslen(Message); TID0x/j"K5
XL7jUi_4:L
if (CryptHashData(hHash, (BYTE *)Message, dwLength, 0)) M^^u{);q
{9 Op{bZ
{ xf@D<}~1
wWflZ"%
CryptGetHashParam(hHash,2,(BYTE*)pHashData,(DWORD*)pHashLen,0); JqH2c=}-
o=_4v ^
} k 9Kv
M)EUR0>8
else zAB-kE\ )
60AX2-sdJ,
{ 7X}_yMxc
#^#)OQ q]
// Error during CryptHashData! x|<|eRYK
PL+fLCk,I
bResult = FALSE; H#Og0gEE}5
!&'xkw`
} [email protected]"$
@$nI\ n?*
CryptDestroyHash(hHash); // Destroy session key. IYQYW.`ly
%*19S.=l
} 3tm z2JIb
fF d9D=EW.
else )-QNWN H
Ffxk] o&%c
{ jo|q,t
y="SzPl
// Error during CryptCreateHash! `HS4(2+C
cyhD%sB[D9
bResult = FALSE; YDNqW P7s
[;=WnG
} /SXz_ e
O&,O:b:@
CryptReleaseContext(hProv, 0); VM]IL%AN
j#e.rNG
} C|f7L>qe
Yg)V*%0n
sJb)HQ,7x
return bResult; g?~Tguv
{KDgK
} Q0cY/'>4
|= cCv_y
(a `FS,M
V5a?=vK9
使用: 8geek$FY x
jJ a V
TCHAR Hash[255]; z2w;oM$g
y"^yYO
int Len=-1; m0A#6=<
$$JIBf8
CString Message=Your Message; W`$[j0
{Eu'v$c!
m_decrypt.EncryptMessage((LPCSTR)(Message),Hash,&Len,CALG_MD5); vMhYpt?7\
P@gt di(Q
Hash中存放的就是MD5密文。你可以使用上述算法 LeSHRoD
#define CALG_MD2 1 MD2算法 /s|{by`we4
q[ ULG v
#define CALG_MD4 2 MD4算法 ewnfeg1
1fFj:p./l_
#define CALG_MD5 3 MD5算法 i#W*'
&yIGr` ;
#define CALG_SHA 4 SHA算法 WVX`<
H&4~Uo.5
来替换CALG_MD5参数.

你可能感兴趣的:(研究QQ密码的算法)