📄 select.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 + -