[原创]获取IE浏览器cookie
闲来无事,对IE浏览器的cookie进行了分析,发现IE浏览器的cookie是存放在固定的几个文件夹中,需要对这次文件进行遍历解析。
步骤:
1.获取IE浏览器Profile文件的路径;
2.开始遍历Profile所在文件夹;
3.开始解析文件夹所有文件。
下面看看主要代码:
1.获取IE浏览器Profile文件的路径
//获取 IE profile 文件路径
WCHAR *GetIEProfilePath(WCHAR *cookie_path)
{
static WCHAR FullPath[MAX_PATH];
WCHAR appPath[MAX_PATH];
memset(appPath, 0, sizeof(appPath));
GetEnvironmentVariableW(L"APPDATA", appPath, MAX_PATH);
_snwprintf_s(FullPath, MAX_PATH, L"%s\\%s", appPath, cookie_path);
return FullPath;
}
2.开始遍历Profile所在文件夹
int DumpIECookies(WCHAR *cookie_path)
{
WCHAR *ie_dir;
WIN32_FIND_DATAW find_data;
WCHAR cookie_search[MAX_PATH];
HANDLE hFind;
//获取IP Profile 路径
ie_dir = GetIEProfilePath(cookie_path);
_snwprintf_s(cookie_search, MAX_PATH, L"%s\\*", ie_dir);
printf("\ncookie_path:\n%S\n",cookie_search);
//开始cookie文件夹遍历
hFind = FindFirstFileW(cookie_search, &find_data);
if (hFind == INVALID_HANDLE_VALUE)
return 0;
do {
if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
continue;
_snwprintf_s(cookie_search, MAX_PATH, _TRUNCATE, L"%s\\%s", ie_dir, find_data.cFileName);
//解析Cookie
ParseIECookieFile(cookie_search);
} while (FindNextFileW(hFind, &find_data));
FindClose(hFind);
return 1;
}3.开始解析文件夹所有文件
void ParseIECookieFile(WCHAR *file)
{
char *session_memory = NULL;
DWORD session_size;
HANDLE h_session_file;
DWORD n_read = 0;
char *ptr, *name, *value, *host;
//创建文件
h_session_file = CreateFileW(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (h_session_file == INVALID_HANDLE_VALUE)
return;
//获取文件大小
session_size = GetFileSize(h_session_file, NULL);
if (session_size == INVALID_FILE_SIZE || session_size == 0) {
CloseHandle(h_session_file);
return;
}
session_memory = (char *)malloc(session_size + sizeof(WCHAR));
if (!session_memory) {
CloseHandle(h_session_file);
return;
}
//读取
memset(session_memory, 0, session_size + sizeof(WCHAR));
if (!ReadFile(h_session_file, session_memory, session_size, &n_read, NULL)) {
CloseHandle(h_session_file);
SAFE_FREE(session_memory);
return;
}
CloseHandle(h_session_file);
if (n_read != session_size) {
SAFE_FREE(session_memory);
return;
}
ptr = session_memory;
for(;;) {
name = ptr;
if (!(ptr = strchr(ptr, '\n')))
break;
*ptr = 0;
ptr++;
value = ptr;
if (!(ptr = strchr(ptr, '\n')))
break;
*ptr = 0;
ptr++;
host = ptr;
if (!(ptr = strchr(ptr, '\n')))
break;
*ptr = 0;
ptr++;
if (!(ptr = strstr(ptr, "*\n")))
break;
ptr+=2;
NormalizeDomainA(host);
if (host && name && value && IsInterestingDomainA(host))
printf("host=%s,\tname=%s,\tvalue=%s\n",host,name,value);
}
SAFE_FREE(session_memory);
}主要用到C++,编译器是VS2010。
在这里我留下一个问题:
这套代码已经支持win XP、win7(x86_64)环境下的IE8、IE9、IE10、IE11,但是不支持win8.1(x86_64)的IE11,需要怎么改进代码?
完整代码见附件---解压密码是pediy.com
