📄 qq.cpp
字号:
// QQ.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <TCHAR.h>
#include <string.h>
#include "ole2.h"
#include <assert.h>
#include "_md5.h"
void EnumStorage(IStorage *pStg) ;
void DocFileViewer(LPCTSTR lpszPathName);
int main(int argc, char* argv[])
{
MD5_CTX md5;
MD5Init(&md5);
unsigned char encrypt[200]; //存放于加密的信息
unsigned char decrypt[17]; //存放加密后的结果
memset(encrypt,0,200);
memset(decrypt,0,200);
strcpy((char *)encrypt,"45928963");
MD5Update(&md5,encrypt,strlen((char *)encrypt)); //对欲加密的字符进行加密
MD5Final(decrypt,&md5);
for(int i=0;i<16;i++)
printf("%2x ",decrypt[i]);
printf("\n\nshort: %d\n",sizeof(short));
printf("int: %d\n",sizeof(int));
printf("dword: %d\n\n",sizeof(DWORD));
DocFileViewer("c:\\a1.txt");
return 0;
}
void DocFileViewer(LPCTSTR lpszPathName)
{
::CoInitialize(NULL);
HRESULT hr;
IStorage * pStg = NULL;
hr = ::StgOpenStorage( // 打开复合文件
//L"c:\\a1.stg", // 文件名称
L"d:\\MsgEx.db",
NULL,
STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE,
0,
0,
&pStg); // 得到根存储接口指针
EnumStorage(pStg); // 开始枚举
if (pStg)
{
pStg->Release();
}
::CoUninitialize();
}
void EnumStorage(IStorage *pStg)
{
int count=0;
char szTemp[1024];
memset(szTemp,0,1024);
IEnumSTATSTG * pEnum = NULL; // 枚举器
HRESULT hr;
hr = pStg->EnumElements(0, NULL, 0, &pEnum);
assert(SUCCEEDED(hr));
STATSTG statstg;
IStorage * pStgSub = NULL; // 子存储接口指针
IStream *pStm = NULL;
unsigned short * p=NULL;
while (pEnum->Next(1, &statstg, NULL) == NOERROR)
{
p=statstg.pwcsName;
for(int i=0;i<wcslen(statstg.pwcsName);i++)
{
szTemp[i]=*p++;
}
//printf("%s\n",szTemp);
if(!strcmp(szTemp,"Matrix"))
{
count=1;
hr = pStg->OpenStorage( // 打开子存储
statstg.pwcsName,
NULL,
STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE,
NULL,
0,
&pStgSub); // 得到子存储接口指针
hr = pStgSub->EnumElements(0, NULL, 0, &pEnum);
pEnum->Next(1, &statstg, NULL);
hr = pStgSub->OpenStream( // 打开子存储
statstg.pwcsName,
NULL,
STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE,
NULL,
&pStm);
char data[1024];
memset(data,0,1024);
pStm->Read(data,1024,NULL);
data[7]^= data[8];
//printf("%x\n",0xc4^(data[1] & 0xff));
//printf("%x\n",0xc4^(data[2] & 0xff));
//printf("\n\n\n%s\n",data);
printf("key: %x\n",data[7]);
printf("\n");
printf("\n");
printf("\n");
for(int i=9;i<710;i++)
{
//printf("%2.2x ",(data[i] & 0xff));
printf("%2.2x ",(~(data[7]^(data[i] & 0xff)) & 0xff));
//printf("%c",(~(data[7]^data[i])& 0xff));
//printf("%2.2x ",(data[i] & 0xff));
if(i%10==0)
printf("\n");
}
count=0;
return;
}
switch (statstg.type)
{
case STGTY_STORAGE: // 子存储
count++;
hr = pStg->OpenStorage( // 打开子存储
statstg.pwcsName,
NULL,
STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE,
NULL,
0,
&pStgSub); // 得到子存储接口指针
if (FAILED(hr))
{
return;
}
EnumStorage(pStgSub); // 递归枚举子存储
break;
case STGTY_STREAM: // 数据流
// ...
//printf("2\n");
hr = pStg->OpenStream( // 打开子存储
statstg.pwcsName,
NULL,
STGM_READWRITE | STGM_DIRECT | STGM_SHARE_EXCLUSIVE,
NULL,
&pStm);
// 得到子存储接口指针
if(count)
{
char data[40];
memset(data,0,40);
//pStm->Read(data,40,NULL);
//printf("\n\n\n%s\n",data);
count=0;
}
if (FAILED(hr))
{
return;
}
break;
}
::CoTaskMemFree(statstg.pwcsName); // 释放名称所使用的内存
}
if (pEnum)
{
pEnum->Release();
}
if (pStgSub)
{
pStgSub->Release();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -