Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно перевести исходник с C++ на Delphi, Как удалить данные заполнения форм в IE 
:(
    Опции темы
Marsianin
  Дата 27.1.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 48
Регистрация: 24.11.2004

Репутация: нет
Всего: нет



Народ, нужна помощь ! Давно искал решение, как удалить данные автозаполнения форм и паролей в IE не используя сервер. Нашёл, подсказали на другом форуме. Но есть проблема, он на C++. Кто-нить может на Delphi переделать ? А то с C++ я не слишком дружу smile

Вот исходник:
Код

switch m_dwClearSettings
 case CLEAR_AUTOCOMPLETE_FORMS
 {
   if (IsWindows2k() || IsWindowsNT())
   {
     CString sBaseKey;
     SECURITY_DESCRIPTOR NewSD;
     BYTE* pOldSD;
     PACL pDacl = NULL;
     PSID pSid = NULL;
     TCHAR szSid[256];
     if (GetUserSid(&pSid))
     {
       //get the hiden key name
       GetSidString(pSid, szSid);

       sKey = _T("Software\\Microsoft\\Protected Storage System Provider\\");
       sKey += szSid;

       //get old SD
       sBaseKey = sKey;
       GetOldSD(HKEY_CURRENT_USER, sBaseKey, &pOldSD);

       //set new SD and then clear
       if (CreateNewSD(pSid, &NewSD, &pDacl))
       {
         RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, FALSE);

         sKey += _T("\\Data");
         RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, FALSE);

         sKey += _T("\\e161255a-37c3-11d2-bcaa-00c04fd929db");
         RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, TRUE);

         dwRet = SHDeleteKey(HKEY_CURRENT_USER, sKey);
       }

       if (pDacl != NULL)
         HeapFree(GetProcessHeap(), 0, pDacl);

       //restore old SD
       if (pOldSD)
       {
         RegSetPrivilege(HKEY_CURRENT_USER, sBaseKey,
           (SECURITY_DESCRIPTOR*)pOldSD, FALSE);
         delete pOldSD;
       }
     }
     if (pSid)
       HeapFree(GetProcessHeap(), 0, pSid);
   }

   //win9x
   DWORD dwSize = MAX_PATH;
   TCHAR szUserName[MAX_PATH];
   GetUserName(szUserName, &dwSize);

   sKey = _T("Software\\Microsoft\\Protected Storage System Provider\\");
   sKey += szUserName;
   sKey += _T("\\Data\\e161255a-37c3-11d2-bcaa-00c04fd929db");
   dwRet = SHDeleteKey(HKEY_LOCAL_MACHINE, sKey);
 }

 case CLEAR_AUTOCOMPLETE_PWDS
 {
   SHDeleteKey(HKEY_CURRENT_USER,
     _T("Software\\Microsoft\\Internet Explorer\\IntelliForms"));
 }
}
// Helper functions for the above code...
BOOL GetUserSid(PSID* ppSid)
{
 HANDLE hToken;
 BOOL bRes;
 DWORD cbBuffer, cbRequired;
 PTOKEN_USER pUserInfo;

 // The User's SID can be obtained from the process token
 bRes = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);
 if (FALSE == bRes)
 {
   return FALSE;
 }

 // Set buffer size to 0 for first call to determine
 // the size of buffer we need.
 cbBuffer = 0;
 bRes = GetTokenInformation(hToken, TokenUser, NULL, cbBuffer, &cbRequired);
 if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
 {
   return FALSE;
 }

 // Allocate a buffer for our token user data
 cbBuffer = cbRequired;
 pUserInfo = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbBuffer);
 if (NULL == pUserInfo)
 {
   return FALSE;
 }

 // Make the "real" call
 bRes = GetTokenInformation(hToken, TokenUser, pUserInfo, cbBuffer, &cbRequired);
 if (FALSE == bRes)
 {
   return FALSE;
 }

 // Make another copy of the SID for the return value
 cbBuffer = GetLengthSid(pUserInfo->User.Sid);

 *ppSid = (PSID) HeapAlloc(GetProcessHeap(), 0, cbBuffer);
 if (NULL == *ppSid)
 {
   return FALSE;
 }

 bRes = CopySid(cbBuffer, *ppSid, pUserInfo->User.Sid);
 if (FALSE == bRes)
 {
     HeapFree(GetProcessHeap(), 0, *ppSid);
   return FALSE;
 }

 bRes = HeapFree(GetProcessHeap(), 0, pUserInfo);

 return TRUE;
}

void GetSidString(PSID pSid, LPTSTR szBuffer)
{
 //convert SID to string
 SID_IDENTIFIER_AUTHORITY *psia = ::GetSidIdentifierAuthority( pSid );
 DWORD dwTopAuthority = psia->Value[5];
 _stprintf(szBuffer, _T("S-1-%lu"), dwTopAuthority);

 TCHAR szTemp[32];
 int iSubAuthorityCount = *(GetSidSubAuthorityCount(pSid));
 for (int i = 0; i<iSubAuthorityCount; i++)
 {
   DWORD dwSubAuthority = *(GetSidSubAuthority(pSid, i));
   _stprintf(szTemp, _T("%lu"), dwSubAuthority);
   _tcscat(szBuffer, _T("-"));
   _tcscat(szBuffer, szTemp);
 }
}

BOOL IsWindowsNT()
{
 BOOL bRet = FALSE;
 BOOL bOsVersionInfoEx;
 OSVERSIONINFOEX osvi;

 // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
 // If that fails, try using the OSVERSIONINFO structure.
 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
 {
   // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
   osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
   if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
     return bRet;
 }

 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion <= 4)
 {
   bRet = TRUE;
 }

 return bRet;
}

BOOL IsWindows2k()
{
 BOOL bRet = FALSE;
 BOOL bOsVersionInfoEx;
 OSVERSIONINFOEX osvi;

 // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
 // If that fails, try using the OSVERSIONINFO structure.
 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
 {
   // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
   osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
   if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
     return bRet;
 }

 if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5)
 {
   bRet = TRUE;
 }

 return bRet;
}

BOOL CGlobal::GetOldSD(HKEY hKey, LPCTSTR pszSubKey, BYTE** pSD)
{
 BOOL bRet = FALSE;
 HKEY hNewKey = NULL;
 DWORD dwSize = 0;
   LONG lRetCode;
 *pSD = NULL;

 lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, READ_CONTROL, &hNewKey);
 if(lRetCode != ERROR_SUCCESS)
   goto cleanup;

 lRetCode = RegGetKeySecurity(hNewKey,
   (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, *pSD, &dwSize);
 if (lRetCode == ERROR_INSUFFICIENT_BUFFER)
 {
   *pSD = new BYTE[dwSize];
   lRetCode = RegGetKeySecurity(hNewKey,
     (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, *pSD, &dwSize);
   if(lRetCode != ERROR_SUCCESS)
   {
     delete *pSD;
     *pSD = NULL;
     goto cleanup;
   }
 }
 else if (lRetCode != ERROR_SUCCESS)
   goto cleanup;

 bRet = TRUE; // indicate success

cleanup:
 if (hNewKey)
 {
   RegCloseKey(hNewKey);
 }
   return bRet;
}

BOOL CGlobal::CreateNewSD(PSID pSid, SECURITY_DESCRIPTOR* pSD, PACL* ppDacl)
{
 BOOL bRet = FALSE;
   PSID pSystemSid = NULL;
   SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
 ACCESS_ALLOWED_ACE* pACE = NULL;
   DWORD dwAclSize;
 DWORD dwAceSize;

   // prepare a Sid representing local system account
   if(!AllocateAndInitializeSid(&sia, 1, SECURITY_LOCAL_SYSTEM_RID,
       0, 0, 0, 0, 0, 0, 0, &pSystemSid))
 {
       goto cleanup;
   }

   // compute size of new acl
   dwAclSize = sizeof(ACL) + 2 * (sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)) +
   GetLengthSid(pSid) + GetLengthSid(pSystemSid);

   // allocate storage for Acl
   *ppDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize);
   if(*ppDacl == NULL)
   goto cleanup;

   if(!InitializeAcl(*ppDacl, dwAclSize, ACL_REVISION))
       goto cleanup;

//    if(!AddAccessAllowedAce(pDacl, ACL_REVISION, KEY_WRITE, pSid))
//    goto cleanup;

   // add current user
 dwAceSize = sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pSid);
 pACE = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAceSize);

 pACE->Mask = KEY_READ | KEY_WRITE | KEY_ALL_ACCESS;
 pACE->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
 pACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
 pACE->Header.AceSize = dwAceSize;
 
 memcpy(&pACE->SidStart, pSid, GetLengthSid(pSid));
 if (!AddAce(*ppDacl, ACL_REVISION, MAXDWORD, pACE, dwAceSize))
   goto cleanup;
   
   // add local system account
 HeapFree(GetProcessHeap(), 0, pACE);
 pACE = NULL;
 dwAceSize = sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pSystemSid);
 pACE = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAceSize);

 pACE->Mask = KEY_READ | KEY_WRITE | KEY_ALL_ACCESS;
 pACE->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
 pACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
 pACE->Header.AceSize = dwAceSize;
 
 memcpy(&pACE->SidStart, pSystemSid, GetLengthSid(pSystemSid));
 if (!AddAce(*ppDacl, ACL_REVISION, MAXDWORD, pACE, dwAceSize))
   goto cleanup;

 if(!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
       goto cleanup;

   if(!SetSecurityDescriptorDacl(pSD, TRUE, *ppDacl, FALSE))
       goto cleanup;
 
 bRet = TRUE; // indicate success

cleanup:
 if(pACE != NULL)
   HeapFree(GetProcessHeap(), 0, pACE);
   if(pSystemSid != NULL)
       FreeSid(pSystemSid);

   return bRet;
}


BOOL CGlobal::RegSetPrivilege(HKEY hKey, LPCTSTR pszSubKey,
                             SECURITY_DESCRIPTOR* pSD, BOOL bRecursive)
{
 BOOL bRet = FALSE;
 HKEY hSubKey = NULL;
 LONG lRetCode;
 LPTSTR pszKeyName = NULL;;
 DWORD dwSubKeyCnt;
 DWORD dwMaxSubKey;
 DWORD dwValueCnt;
 DWORD dwMaxValueName;
 DWORD dwMaxValueData;
 DWORD i;

 if (!pszSubKey)
   goto cleanup;

 // open the key for WRITE_DAC access
 lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, WRITE_DAC, &hSubKey);
 if(lRetCode != ERROR_SUCCESS)
   goto cleanup;

 // apply the security descriptor to the registry key
 lRetCode = RegSetKeySecurity(hSubKey,
   (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, pSD);
 if( lRetCode != ERROR_SUCCESS )
   goto cleanup;

 if (bRecursive)
 {
   // reopen the key for KEY_READ access
   RegCloseKey(hSubKey);
   hSubKey = NULL;
   lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, KEY_READ, &hSubKey);
   if(lRetCode != ERROR_SUCCESS)
     goto cleanup;

   // first get an info about this subkey ...
   lRetCode = RegQueryInfoKey(hSubKey, 0, 0, 0, &dwSubKeyCnt, &dwMaxSubKey,
     0, &dwValueCnt, &dwMaxValueName, &dwMaxValueData, 0, 0);
   if( lRetCode != ERROR_SUCCESS )
     goto cleanup;

   // enumerate the subkeys and call RegTreeWalk() recursivly
   pszKeyName = new TCHAR [MAX_PATH + 1];
   for (i=0; i<dwSubKeyCnt; i++)
   {
     lRetCode = RegEnumKey(hSubKey, i, pszKeyName, MAX_PATH + 1);
     if(lRetCode == ERROR_SUCCESS)
     {
       RegSetPrivilege(hSubKey, pszKeyName, pSD, TRUE);
     }
     else if(lRetCode == ERROR_NO_MORE_ITEMS)
     {
       break;
     }
   }
   delete [] pszKeyName;
 }

 bRet = TRUE; // indicate success

cleanup:
 if (hSubKey)
 {
   RegCloseKey(hSubKey);
 }
   return bRet;
}


PM MAIL   Вверх
Marsianin
Дата 31.1.2005, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 48
Регистрация: 24.11.2004

Репутация: нет
Всего: нет



Мда...походу знающих и то и другое тут нет smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1114 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.