日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

IE7自動完成口令獲取

IE7自動完成口令獲取
作者:grassgrass (kityest_at_163.com)
前一陣子自己郵箱的口令忘記了 , 為了找回郵箱口令到網(wǎng)上找了好多密碼找回的工具 , 發(fā)現(xiàn)在IE7下都不好使 , 迫于無奈 , 只好自己研究了 , 通過Google和 OllyDbg , 用了1整天時間終于弄清楚了IE7下的自動完成口令獲取方法 , 不敢獨享 , 特公布如下 , 希望能對大家有幫助 。
自Internet Explorer 7.0開始,微軟完全改變了密碼保存的方式 , 將網(wǎng)站的URL保存于歷史文件中 , 將自動完成的密碼保存于注冊表中的以下位置: HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2 。
【IE7自動完成口令獲取】
要獲取IE7的自動完成口令就需要同時獲取IE7環(huán)境下歷史文件夾中的URL記錄和注冊表HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2下的密碼信息 。
以下是IE7自動完成口令獲取的步驟:
1、用ShGetSpecialFolder獲取History文件夾路徑
2、枚舉History文件夾下的index.dat文件 , 并從index.dat文件中提取訪問過的網(wǎng)站URL 。
index.dat文件結(jié)構(gòu):
文件頭32字節(jié)
從文件的第0x5000地址處開始存放的是訪問過的網(wǎng)站信息 , 網(wǎng)站信息順序存放 , 每個網(wǎng)站數(shù)據(jù)塊結(jié)構(gòu)為:
struct Web{
const char Tag[4]; //4個字節(jié)的標(biāo)志 , 內(nèi)容為"URL ",可作為數(shù)據(jù)是否正確的判斷 。
int LenNumber//該數(shù)據(jù)塊的長度指數(shù) , 數(shù)據(jù)塊的長度為LenNumber*128
char unknown[44]; //44字節(jié)的未知數(shù)據(jù)
int DataPos//Visited:字段相對于該結(jié)構(gòu)塊頭的偏移值 , 即&Web DataPos就指向Visited了
char unknown[]//不定長度未知數(shù)據(jù) , 不過據(jù)觀察似乎上述DataPos都是一樣的 , 那這個也應(yīng)該定長了 , 算了 , 不管他 , 安全起見 , 就當(dāng)不定長了
const char Tag1[8];;;//"Visited:"
char Data[]//結(jié)構(gòu) XXX@????,其中XXX是用戶名 , ???就是URL,可以從Visited處搜索@來定位
char Unknown[]//長度不定
};
注意 , 上述結(jié)構(gòu)中的URL是ANSI形式的
3、打開注冊表HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2 , 枚舉其Values
注冊表該位置保存的是IE7自動完成的用戶名密碼之類 , 其中ValueName就是經(jīng)過Hash的網(wǎng)站的URL,ValueData就是加密的用戶名密碼之類了 。
4、對第2步獲取的URL依次進行Hash , 然后用其Hash值依次與第三步中獲取的ValueName進行比較 , 一致的就是該URL的信息
如果一致 , 就對ValueData進行解密 。
ValueData解密后數(shù)據(jù)結(jié)構(gòu)
struct ValueData{
int HeadLen;//4字節(jié) , 用來表示該數(shù)據(jù)結(jié)構(gòu)的頭部長度 。
int DataPos;//真正的數(shù)據(jù)相對于數(shù)據(jù)結(jié)構(gòu)頭部的偏移 , 即:&ValueData HeadLen DataPos就指向有效數(shù)據(jù)了
int DataLen;//有效數(shù)據(jù)的長度
char unknown[];
wchar UserName[];
wchar Password[];
};
HeadLen HeadLen DataPos=sizeof(ValueData);
注:
1、Hash算法:
//Algorithm=0x8004
//0x8004=ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1=CALG_SHA1,原來采用的是CALG_SHA1算法
//注意:此處這個DataLen是帶Unicode的結(jié)尾的0的
BOOL HashData(WCHAR *pData,int DataLen, char *pHashData,int *pHashLen,int Algorithm)
{
BOOL bResult = TRUE;
HCRYPTPROV hProv = NULL;
HCRYPTHASH hHash = NULL;
DWORD dwLength;
// Get handle to user default provider.
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))//0xF0000000)) //兩個都行,不知道最后一個參數(shù)是干什么的
{
// Create hash object.
if (CryptCreateHash(hProv, Algorithm, 0, 0, &hHash))
{
// Hash password string.
if (CryptHashData(hHash, (BYTE *)pData, DataLen, 0))
{
CryptGetHashParam(hHash,2,(BYTE*)pHashData,(DWORD*)pHashLen,0);
}
else
{
// Error during CryptHashData!
bResult = FALSE;
}
CryptDestroyHash(hHash); // Destroy session key.
}
else
{

推薦閱讀