QQ算法

在qq对应号码目录下user.db文件从800h起20字节为与密码相关数据,其中后16个字节和Hash后摘要有关.这20个字节后4个字节是qq号码。 

 

下列是一些常用的Hash算法(从微软加密头文件中提取出来的) 

 

#define CALG_MD2 1 MD2算法 

 

#define CALG_MD4 2 MD4算法 

 

#define CALG_MD5 3 MD5算法 

 

#define CALG_SHA 4 SHA算法 

 

#define CALG_SHA1 4 SHA1算法 

 

#define CALG_MAC 5 MAC算法 

 

#define ALG_SID_RIPEMD 6 RIPEMD算法 

 

#define ALG_SID_RIPEMD160 7 RIPEMD160算法 

 

#define ALG_SID_SSL3SHAMD5 8 SSL3SHAMD5算法 

 

#define CALG_HMAC 9 HMAC算法 

 

 

而MD5算法中需要使用下面几个初始值 

 

context->state[0] = 0x67452301; 

 

context->state[1] = 0xefcdab89; 

 

context->state[2] = 0x98badcfe; 

 

context->state[3] = 0x10325476; 

 

呵呵,在qq中一搜索,果然几个特征值赫然在目。但是显然qq使用了上述20个字节中的前四个字节对MD5密文又做了处理,我跟了两天还是没有头绪(头晕脑胀)。但是我发现把这四个字节改成00 00 00 00,然后登陆输入正确密码,仍然会提示密码不一致是否到服务器验证,选择是,然后验证成功后,这20个字节的后16个字节恰好就是密码的MD5密文。有兴趣的高手可以继续看看奥(其中密码比较函数地址为:004A7E0C) 

 

例: 

 

1B D5 01 00 5D D7 87 19 0D 92 6D E2 0A 56 E9 19 63 0F 5A E1 DF CA 20 05 

 

DF CA 20 05即是我的qq号。不过可不要暴力破解我的奥:) 

 

1B D5 01 00 5D D7 87 19 0D 92 6D E2 0A 56 E9 19 63 0F 5A E1就是和口令相关的数据 

 

如果把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密文。 

 

 

算法源代码如下: 

 

头文件: 

 

 

// Decrypt.h: interface for the CDecrypt class. 

 

// 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#define AFX_DECRYPT_H__916D97B8_C120_4435_BE23_2CF35B8763A2__INCLUDED_ 

 

 

#if _MSC_VER > 1000 

 

#pragma once 

 

#endif // _MSC_VER > 1000 

 

 

#define _WIN32_WINNT 0x0400 

 

#include 

 

#include 

 

 

class CDecrypt 

 

 

public: 

 

BOOL EncryptMessage(c*****t TCHAR *Message,TCHAR *pHashData,int *pHashLen,int Algorithm); 

 

CDecrypt(); 

 

virtual ~CDecrypt(); 

 

 

}; 

 

 

#endif // !defined(AFX_DECRYPT_H__916D97B8_C120_4435_BE23_2CF35B8763A2__INCLUDED_) 

 

 

CPP文件: 

 

// Decrypt.cpp: implementation of the CDecrypt class. 

 

// 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include stdafx.h 

 

#include Decrypt.h 

 

 

#ifdef _DEBUG 

 

#undef THIS_FILE 

 

static char THIS_FILE[]=__FILE__; 

 

#define new DEBUG_NEW 

 

#endif 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

// C*****truction/Destruction 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CDecrypt::CDecrypt() 

 

 

 

 

 

CDecrypt::~CDecrypt() 

 

 

 

 

 

BOOL CDecrypt::EncryptMessage(c*****t TCHAR *Message,TCHAR *pHashData,int *pHashLen,int Algorithm) 

 

 

BOOL bResult = TRUE; 

 

 

HCRYPTPROV hProv = NULL; 

 

HCRYPTKEY hKey = NULL; 

 

HCRYPTKEY hXchgKey = NULL; 

 

HCRYPTHASH hHash = NULL; 

 

DWORD dwLength; 

 

// Get handle to user default provider

if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0)) 

 

 

// * hash object. 

 

if (Crypt*Hash(hProv, Algorithm, 0, 0, &hHash)) 

 

 

// Hash password string. 

 

dwLength = sizeof(TCHAR)*_tcslen(Message); 

 

if (CryptHashData(hHash, (BYTE *)Message, dwLength, 0)) 

 

 

CryptGetHashParam(hHash,2,(BYTE*)pHashData,(DWORD*)pHashLen,0); 

 

 

else 

 

 

// Error during CryptHashData! 

 

bResult = FALSE; 

 

 

CryptDestroyHash(hHash); // Destroy session key. 

 

 

else 

 

 

// Error during Crypt*Hash! 

 

bResult = FALSE; 

 

 

CryptReleaseContext(hProv, 0); 

 

 

 

return bResult; 

 

 

 

 

使用: 

 

TCHAR Hash[255]; 

 

int Len=-1; 

 

CString Message=Your Message; 

 

m_decrypt.EncryptMessage((LPCSTR)(Message),Hash,&Len,CALG_MD5); 

 

Hash中存放的就是MD5密文。你可以使用上述算法 

 

#define CALG_MD2 1 MD2算法 

 

#define CALG_MD4 2 MD4算法 

 

#define CALG_MD5 3 MD5算法 

 

#define CALG_SHA 4 SHA算法 

 

来替换CALG_MD5参数

你可能感兴趣的:(QQ算法)