欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]仿InternetGetCookie自己解析Cookie文件

[原创]仿InternetGetCookie自己解析Cookie文件

主要参考http://blog.csdn.net/whatday/article/details/7566310


#include <Windows.h>

#include <Stdio.h>

#include <Tchar.h>

#include <Wininet.h>

#pragma comment(lib, "Wininet.lib")

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);

				//给Cookie结尾加个0

				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[])

{

	LPCOOKIE_FIELD		lpCookieFields;

	DWORD				dwCookieField;

	DWORD				i;

	dwCookieField = 100;

	lpCookieFields = new COOKIE_FIELD[dwCookieField];

	//查询Cookie

	CookieQuery(_T("http://bbs.pediy.com/"), lpCookieFields, &dwCookieField);

	for(i=0; i<dwCookieField; i++)

	{

		printf("键: %s\n", lpCookieFields[i].m_szKey);

		printf("值: %s\n\n", lpCookieFields[i].m_szValue);

	}

	return 0;

}

上传的附件 QQ截图20130426135008.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功