// Testcookies0325.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Testcookies0325.h"
#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>
#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// The one and only application object
CWinApp theApp;
using namespace std;
typedef struct _COOKIE_FIELD
{
TCHAR m_szKey[128];//键
TCHAR m_szValue[512];//值
TCHAR m_szDomain[128];//域
TCHAR m_szFlag[32];//标志
TCHAR m_szLowExpire[32];//过期时间的低32位
TCHAR m_szHighExpire[32];//过期时间的高32位
TCHAR m_szLowCreate[32];//创建时间的低32位
TCHAR m_szHighCreate[32];//创建时间的高32位
} COOKIE_FIELD, *LPCOOKIE_FIELD;
//获取Cookie的名称
BOOL CookieGetUrlName(LPTSTR lpszUrl, LPTSTR lpszUrlName)
{
TCHAR szUserName[32];
DWORD cbUserName;
TCHAR szHostName[128];
URL_COMPONENTS urlComponents;
cbUserName = 32;
GetUserName(szUserName, &cbUserName);//获取当前用户名
memset(&urlComponents, 0, sizeof(urlComponents));
urlComponents.dwStructSize = sizeof(urlComponents);
urlComponents.dwHostNameLength = 128;//主机名长度
urlComponents.lpszHostName = szHostName;//主机名
if(InternetCrackUrl(lpszUrl, lstrlen(lpszUrl), ICU_ESCAPE, &urlComponents))//破解Url
{
lstrcpy(lpszUrlName, _T("Cookie:"));
lstrcat(lpszUrlName, szUserName);
lstrcat(lpszUrlName, _T("@"));
lstrcat(lpszUrlName, szHostName);
lstrcat(lpszUrlName, _T("/"));
return TRUE;
}
return FALSE;
}
//获取Cookie的路径
BOOL CookieGetPath(LPTSTR lpszUrl, LPTSTR lpszFilePath)
{
BOOL bRet;
HANDLE hEnumHandle;
LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry;
DWORD cbCacheEntry;
TCHAR szCookieUrlName[256];
bRet = FALSE;
CookieGetUrlName(lpszUrl, szCookieUrlName);//获取Cookie的名称
cbCacheEntry = 10240;
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO)LocalAlloc(LMEM_FIXED, cbCacheEntry);//分配足够内存
hEnumHandle = FindFirstUrlCacheEntry(_T("cookie:"), lpCacheEntry, &cbCacheEntry);//查找Cookie缓存
if(hEnumHandle)
{
do
{
if(lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY)//应该是多余的
{
if(lstrcmpi(lpCacheEntry->lpszSourceUrlName, szCookieUrlName) == 0)//判断是否是我们要找的Cookie名
{
lstrcpy(lpszFilePath, lpCacheEntry->lpszLocalFileName);//复制Cookie的文件路径
bRet = TRUE;
break;
}
}
cbCacheEntry = 10240;
}
while(FindNextUrlCacheEntry(hEnumHandle, lpCacheEntry, &cbCacheEntry));//下一个
FindCloseUrlCache(hEnumHandle);//关闭句柄
}
LocalFree(lpCacheEntry);
return bRet;
}
//解析Cookie数据
VOID CookieResolveData(LPTSTR lpszCookieData, LPCOOKIE_FIELD lpCookieFields, LPDWORD lpdwCookieField)
{
LPTSTR pStr;
LPTSTR pStr2;
LPTSTR pStr3;
LPTSTR pStr4;
LPTSTR pStr5;
LPTSTR pStr6;
LPTSTR pStr7;
LPTSTR pStr8;
LPTSTR pStr9;
DWORD i;
/*
Cookie之间以*分隔,每个字段8行,只有0x0a没有0x0d
*/
pStr = lpszCookieData;
for(i=0; *pStr; i++)
{
pStr2 = _tcschr(pStr, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szKey, pStr, pStr2 - pStr + 1);
pStr2 += 1;
pStr3 = _tcschr(pStr2, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szValue, pStr2, pStr3 - pStr2 + 1);
pStr3 += 1;
pStr4 = _tcschr(pStr3, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szDomain, pStr3, pStr4 - pStr3 + 1);
pStr4 += 1;
pStr5 = _tcschr(pStr4, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szFlag, pStr4, pStr5 - pStr4 + 1);
pStr5 += 1;
pStr6 = _tcschr(pStr5, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szLowExpire, pStr5, pStr6 - pStr5 + 1);
pStr6 += 1;
pStr7 = _tcschr(pStr6, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szHighExpire, pStr6, pStr7 - pStr6 + 1);
pStr7 += 1;
pStr8 = _tcschr(pStr7, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szLowCreate, pStr7, pStr8 - pStr7 + 1);
pStr8 += 1;
pStr9 = _tcschr(pStr8, _T('\n'));
lstrcpyn(lpCookieFields[i].m_szHighCreate, pStr8, pStr9 - pStr8 + 1);
pStr9 += 1;
pStr = _tcschr(pStr9, _T('\n'));
pStr += 1;
}
*lpdwCookieField = i;
}
//查询Cookie
BOOL CookieQuery(LPTSTR lpszUrl, LPCOOKIE_FIELD lpCookieFields, LPDWORD lpdwCookieField)
{
BOOL bRet;
HANDLE hFile;
LPVOID lpFileBase;
DWORD dwFileSize;
DWORD dwRetLen;
TCHAR szPath[MAX_PATH];
bRet = FALSE;
if(CookieGetPath(lpszUrl, szPath))
{
hFile = CreateFile(szPath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
dwFileSize = GetFileSize(hFile, NULL);
lpFileBase = LocalAlloc(LMEM_FIXED, dwFileSize);
if(ReadFile(hFile,
lpFileBase,
dwFileSize,
&dwRetLen,
NULL))
{
LPTSTR lpszCookieData;
DWORD dwCookieData;
dwCookieData = dwRetLen + 1;
lpszCookieData = (LPTSTR)LocalAlloc(LMEM_FIXED, dwCookieData);
memcpy(lpszCookieData, lpFileBase, dwRetLen);
memset(lpszCookieData + dwRetLen, 0, 1);
//解析Cookie数据
CookieResolveData(lpszCookieData, lpCookieFields, lpdwCookieField);
LocalFree(lpszCookieData);
bRet = TRUE;
}
LocalFree(lpFileBase);
CloseHandle(hFile);
}
}
return bRet;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(NULL);
LPCOOKIE_FIELD lpCookieFields;
DWORD dwCookieField;
DWORD i;
dwCookieField = 100;
lpCookieFields = new COOKIE_FIELD[dwCookieField];
if (lpCookieFields != NULL)
{
memset (lpCookieFields,0,100);
}
//查询Cookie
CookieQuery(_T("https://www.baidu.com/"), lpCookieFields, &dwCookieField);
for(i=0; i<dwCookieField; i++)
{
cout<<lpCookieFields[i].m_szKey<<endl;
cout<< lpCookieFields[i].m_szValue<<endl;
}
if (lpCookieFields != NULL)
{
delete []lpCookieFields;
lpCookieFields = NULL;
}
system("pause");
return nRetCode;
}
cookies
最新推荐文章于 2024-04-29 10:39:55 发布