⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 select.cpp

📁 对QQ的聊天文件进行解密的源代码,只要选择聊天记录保存的文件
💻 CPP
字号:
#include <windows.h>
#include <ShlObj.h>
#include <CommCtrl.h>
#include <ole2.h>
#include "Select.h"
#include "Main.h"
#include "LocalMessage.h"
#include "DecryptMessage.h"
#include "md5.h"
#include "resource.h"
char QQFolder[MAX_PATH];
int ListIndex;
char QQNumber[10];
char QQDatabasePath[MAX_PATH];
char DecryptPassword[16];
DWORD FunctionVaule=NULL;
int SelectFolder(HWND hwnd)
{
	Select pro;
	DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_SELECT),hwnd,(DLGPROC)Select::DialogProc,(LPARAM)&pro);
	if(*QQFolder && ListIndex !=0)
		return 0;
	return 1;
}
INT_PTR CALLBACK Select::DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static Select *pro;
	switch(message)
	{
	case WM_INITDIALOG:
		pro=(Select *)lParam;
		pro->hwnd=hwnd;
		pro->Init();
		break;
	case WM_COMMAND:
		pro->WndPro_Command(wParam,lParam);
		break;
	case WM_CLOSE:
		pro->WndPro_Close();
		break;
	case WM_PAINT:
		pro->WndPro_Paint(wParam,lParam);
		break;
	}
	return 0;
}
int Select::WndPro_Command(WPARAM wParam,LPARAM lParam)
{
	switch(wParam)
	{
	case IDOK:
		if(this->BrowserFolder())
			this->GetQQNumberList();
		break;
	case IDCANCEL:
		this->WndPro_Close();
		break;
	case IDC_SEEK:
		this->View();
		break;
	}
	return 0;
}
int Select::WndPro_Close()
{
	EndDialog(hwnd,0);
	FunctionVaule = 0;
	return 0;
}
int Select::WndPro_Paint(WPARAM wParam,LPARAM lParam)
{
	//PAINTSTRUCT ps; 
	//HDC hdc;
	//HWND CurrentPaint;
	//HPEN hpen;
	//CurrentPaint  = GetDlgItem(hwnd,IDC_FOLDERPATH);
	//hdc = BeginPaint(CurrentPaint,&ps);
	//this->PaintEdit(CurrentPaint,hdc);
	//EndPaint(CurrentPaint,&ps);

	return 0;
}
int Select::PaintEdit(HWND HwndEdit,HDC hdc)
{
	HPEN hpen, hpenOld;
	

	hpen = CreatePen(PS_SOLID,1,RGB(255,0,0));
	hpenOld = (HPEN)SelectObject(hdc, hpen);
	//LineTo(hdc,0,0);
	//LineTo(hdc,rect.right+10,0);

	SelectObject(hdc, hpenOld);
	DeleteObject(hpen);
	return 0;
}
int Select::Init()
{
	HKEY key;
	char QQInstallPath[MAX_PATH];
	DWORD QQPathSize=MAX_PATH;
	int length;
	HwndCombo = GetDlgItem(hwnd,IDC_COMBO1);
	if(*QQFolder)
	{
		SetDlgItemText(hwnd,IDC_FOLDERPATH,QQFolder);
		this->GetQQNumberList();
	}
	else
	{
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\TENCENT\\QQ",
			0,KEY_QUERY_VALUE,&key)== ERROR_SUCCESS)
		{
			ZeroMemory(QQInstallPath,MAX_PATH);
			RegQueryValueEx(key,"Install",NULL,NULL,
				(byte *)QQInstallPath,&QQPathSize);
			if(*QQInstallPath==0)
				return 1;
			length = (int)strlen(QQInstallPath);
			QQInstallPath[length-1]=0;
			strncpy(QQFolder,QQInstallPath,length-1);
			SetDlgItemText(hwnd,IDC_FOLDERPATH,QQFolder);
			this->GetQQNumberList();
		}
	}
	//-----------------------------
	char tem[100];
	RECT rect,rect1,rect2,rect3;
	int x,y,width,height;
	HWND HwndParent,HwndEdit=GetDlgItem(hwnd,IDC_FOLDERPATH);;
	
	HwndParent = GetParent(HwndEdit);
	GetWindowRect(HwndEdit,&rect);
	GetClientRect(HwndEdit,&rect3);
	GetWindowRect(HwndParent,&rect1);
	GetClientRect(HwndParent,&rect2);
	x = rect2.right -rect3.right -(rect1.right-rect.right) +2;
	y = rect2.bottom -(rect1.bottom-rect.bottom) -rect3.bottom+2;
	width = rect.right-rect.left-2;
	height = rect.bottom-rect.top-2;
	wsprintf(tem,"%2d %2d %2d %2d",x,y,width,height);
	//SetWindowText(hwnd,tem);
	//width
	MoveWindow(HwndEdit,x,y,width,height,true);
	return 0;
}
int Select::BrowserFolder()
{
	char szFolder[MAX_PATH];
	//szFolder = QQFolder;
	ZeroMemory(szFolder,MAX_PATH);
	BROWSEINFO lpbi;
	ZeroMemory(&lpbi,sizeof(lpbi));
	lpbi.hwndOwner = hwnd;
	lpbi.lpszTitle = "选择QQ目录";
	lpbi.pszDisplayName = szFolder;
	
	LPCITEMIDLIST pidl = SHBrowseForFolder(&lpbi);
	SHGetPathFromIDList(pidl,szFolder);
	if(strlen(szFolder)==0)
		return 0;
	ZeroMemory(QQFolder,MAX_PATH);
	strcpy(QQFolder,szFolder);
	SetDlgItemText(hwnd,IDC_FOLDERPATH,szFolder);
	return 1;
}
int Select::GetQQNumberList()
{
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind = INVALID_HANDLE_VALUE;
	char QQFolderPath[MAX_PATH],*error;
	//DWORD dwError;
	ZeroMemory(QQFolderPath,MAX_PATH);
	strcpy(QQFolderPath,QQFolder);
	strncat(QQFolderPath,"\\*",3);
	SendMessage(HwndCombo,CB_RESETCONTENT,NULL,NULL);
	ListIndex = 0;
	hFind = FindFirstFile(QQFolderPath,&FindFileData);
	if(hFind == INVALID_HANDLE_VALUE)
	{
		error = "Find first file fail";
		goto Ex;
	}
	while (FindNextFile(hFind, &FindFileData) != 0) 
	{
		if(this->IsQQFolder(FindFileData.cFileName))
		{
			SendMessage(HwndCombo,CB_INSERTSTRING,
				ListIndex,(LPARAM)FindFileData.cFileName);
			ListIndex++;
		}
	}
	SendMessage(HwndCombo,CB_SETCURSEL,0,NULL);
	return 0;
Ex:
	return 1;
}
bool Select::IsQQFolder(char * name)
{
	char QQPath[MAX_PATH];
	WCHAR TemPath[MAX_PATH];
	if(IsQQNumber(name)==false)
		return false;
	RtlZeroMemory(QQPath,MAX_PATH);
	strcpy(QQPath,QQFolder);
	strcat(QQPath,"\\");
	strcat(QQPath,name);
	strcat(QQPath,"\\MsgEx.db");
	memset((char *)TemPath,0,(MAX_PATH*2));
	MultiByteToWideChar(CP_ACP,0,QQPath,
		(int)strlen(QQPath),TemPath,(MAX_PATH*2));
	if(StgIsStorageFile(TemPath)==S_OK)
		return true;
	return false;
}
int Select::View()
{
	char *error=NULL;
	int hr = S_OK;
	IStorage* ppstgOpen = NULL;
	IEnumSTATSTG* ppenum =NULL;
	IEnumSTATSTG* ppenum1 =NULL;
	IStorage* ppstgOpen1 = NULL;
	STATSTG rgelt;
	ULONG pceltFetched=1;

	WCHAR TemPath[MAX_PATH];
	if(*QQFolder==0)
	{
		error = "请选择QQ目录!";
		goto Ex;
	}
	if(ListIndex == 0)
	{
		error = "QQ号码列表为空!";
		goto Ex;
	}
	GetWindowText(HwndCombo,QQNumber,10);
	ZeroMemory(QQDatabasePath,MAX_PATH);
	strcpy(QQDatabasePath,QQFolder);
	strcat(QQDatabasePath,"\\");
	strcat(QQDatabasePath,QQNumber);
	strcat(QQDatabasePath,"\\MsgEx.db");


	memset((char *)TemPath,0,(MAX_PATH*2));
	MultiByteToWideChar(CP_ACP,0,QQDatabasePath,
		(int)strlen(QQDatabasePath),TemPath,(MAX_PATH*2));
	hr = StgOpenStorage(TemPath,NULL,0x12,NULL,NULL,&ppstgOpen);
	if(FAILED(hr))
	{
		error = "Failed StgCreateStorage";
		goto Ex;
	}
	hr = ppstgOpen->OpenStorage(L"Matrix",NULL,0x12,NULL,NULL,&ppstgOpen1);
	if (FAILED(hr))
	{
		error = "Failed OpenSrorage ppstgOpen1";
		goto Ex;
	}
	IStream *ppstm =NULL;
	WCHAR *pv;
	ULONG len;
	hr = ppstgOpen1->OpenStream(L"Matrix.db",NULL,0x12,NULL,&ppstm);
	if(FAILED(hr))
	{
		error = "ppstgOpen->OpenStream";
		goto Ex;
	}
	ppstm->Stat(&rgelt,NULL);
	pv = (WCHAR *)malloc(rgelt.cbSize.LowPart+10);
	memset(pv,0,rgelt.cbSize.LowPart);
	ppstm->Read(pv,rgelt.cbSize.LowPart,&len);
	ppstgOpen->Release();
	_asm{
		mov eax,pv
			mov edx,rgelt.cbSize.LowPart
	}
	if(func()==0)
	{
		error = "文件格式错误!";
		goto Ex;
	}
	char *p;
	p=(char *)pv;
	while(true)
	{
		if(strncmp(p,"CRK",3)==0)
			break;
		p++;
	}
	p+=7;
	MD5_CTX text;
	char EncryptPassword[16];
	int Passwordlength = 16;
	ZeroMemory(EncryptPassword,16);
	memcpy(text.buffer,QQNumber,strlen(QQNumber));
	MD5Init(&text);
	MD5Update(&text,9);

	decode(p,0x20,(char *)text.state,EncryptPassword,&Passwordlength);
	strncpy(DecryptPassword,EncryptPassword,16);
	free(pv);
	FunctionVaule = 1;
	EndDialog(hwnd,0);
	return 0;
Ex:
	MessageBox(hwnd,error,"错误",0);
	return hr;
}
bool IsQQNumber(char * name)
{
	size_t NameLength;
	char *pName;
	pName = name;
	NameLength = strlen(pName);
	if(NameLength>9 || NameLength<5)
		return false;
	while(*pName)
	{
		if(*pName<0x30 || *pName >0x39)
			return false;
		pName++;
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -