[C++]Odczyt gwiazdek

0

Czy da się zrobić taki program który po wklejeniu gwiazdek np. z przeglądarki dekoduje je na normalne znaki?? Jeśli tak to jak to zrobić??

0

Tak się nie da, bo te gwiazdki faktycznie gwiazdkami są i niczym więcej ;) Kontrolki z hasłami tekst przechowują tylko gdzieś tam wewnętrznie.

Da się tekst wyciągnąć, pisząc program w Win32API.
Ustalasz uchwyt kontrolki z hasłem.
Wysyłasz komunikat WM_GETTEXT.
Można też na chama wysłać komunikat EM_SETPASSWORDCHAR
wtedy można po prostu edita "odgwiazdkować", żeby na bieżąco pokazywał tekst.

Chyba w Windowsach nowszych niż 9x nie działa to, jeśli użyć SendMessage. Ale PostMessage działa.

0

Inna sprawa, że 'kontrolki' w przeglądarkach internetowych to nie normalne kontrolki WINAPI, są tworzone, obsługiwane i renderowane przez silnik przeglądarki. To tak przy okazji.

0

Nic prostszego, kiedyś się pisało takie bajery :)

#include "stdafx.h"
// compile for console
#include <windows.h>
#include <mshtml.h>
#include <conio.h>
#include <Oleacc.h>
#pragma comment(lib, "oleacc.lib")
BOOL CALLBACK EnumWindowsProc(HWND, UINT);
void EnumPasswords(IHTMLDocument2*);
int g_pwsFound;


int main()
{
	UINT nMsg = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT"));

	CoInitialize(NULL);
	EnumChildWindows(GetDesktopWindow(), (WNDENUMPROC)EnumWindowsProc, nMsg);
	CoUninitialize();

	
	printf("\n\nfinished.\n");
	if (!g_pwsFound) printf("no passwords found\n");
	return _getch();
}



BOOL CALLBACK EnumWindowsProc(HWND hwnd, UINT nMsg)
{
	TCHAR classname[64];
	GetClassName(hwnd, classname, 64);
	classname[63] = 0;

	if (!lstrcmp(classname, TEXT("Internet Explorer_Server")))
	{
		DWORD dwResult;
		IHTMLDocument2 *spDoc;
		SendMessageTimeout(hwnd, nMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, &dwResult);

		if (!ObjectFromLresult(dwResult, IID_IHTMLDocument2, 0, (void**)&spDoc))
		{
			BSTR bstrUrl = NULL;
			if (!spDoc->get_URL(&bstrUrl) && (bstrUrl))
			{
				printf("---------------\nsite: %S\n", bstrUrl);
				SysFreeString(bstrUrl);
			}
			EnumPasswords(spDoc);
			spDoc->Release();
		}
	}
	return true;
}




void EnumPasswords(IHTMLDocument2 *spDoc)
{
	IHTMLElementCollection *pColl;
	if (!spDoc->get_all(&pColl))   // document.all
	{
		VARIANT vTag;
		vTag.vt = VT_BSTR;
		vTag.bstrVal = SysAllocString(L"INPUT");
		IDispatch *pdisp = NULL;
		if (!pColl->tags(vTag, &pdisp) && (pdisp))  // element = document.all.tags("INPUT")
		{
			IHTMLElementCollection *pInputCollection;
			if (!pdisp->QueryInterface(IID_IHTMLElementCollection, (void**)&pInputCollection))
			{
				VARIANT vName, vIndex;
				vName.vt = VT_I4; vIndex.vt = VT_EMPTY;
				LONG count = 0;
				pInputCollection->get_length(&count);
				for (vName.intVal=0; vName.intVal<count; vName.intVal++)
				{
					IDispatch *pInputdisp = NULL;
					if (!pInputCollection->item(vName, vIndex, &pInputdisp) && (pInputdisp))  // element[index]
					{
						IHTMLInputElement *input;
						if (!pInputdisp->QueryInterface(IID_IHTMLInputElement, (void**)&input))
						{
							BSTR bstrType = NULL;
							if (!input->get_type(&bstrType) && (bstrType))  // if element[index].type = "password"
							{
								if (!lstrcmpiW(bstrType, L"password"))
								{
									BSTR bstrPassword = NULL;
									if (!input->get_value(&bstrPassword) && (bstrPassword))
									{
										g_pwsFound++;
										SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
										printf(" - password: %S\n", bstrPassword);
										SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
										SysFreeString(bstrPassword);
									}
								}
								SysFreeString(bstrType);
							}
							input->Release();
						}
						pInputdisp->Release();
					}
				}
				pInputCollection->Release();
			}
		}
		SysFreeString(vTag.bstrVal);
	}
}
0

@sapero
mógłbyś wyjaśnić zasadę działania programu

0

Okno browsera raczej nigdy nie jest głównym oknem, zazwyczaj to child jakiegoś głównego okna, lub child childa childa [...]. Zeby nie paprać się w ręczne przeszukiwanie, użyjemy funkcji EnumChildWindows, która kolejno przekazuje do naszej funkcji uchwyty wszystkich okien otwartych na danych desktopie.
Dla każdego z nich sprawdzamy nazwę klasy, jeśli jest nią Internet Explorer_Server, to prawie na pewno jest to browser. Wysyłając do niego magiczną kombinację SendMessageTimeout + ObjectFromLresult otrzymujemy objekt dokumentu HTML, jeśli faktycznie był to browser.

Dla każdego dokumentu HTML pobieramy URL i zaczynamy szukać haseł (EnumPasswords). Hasło to zazwyczaj element typu INPUT o typie password, więc takowych szukamy.

spDoc->get_all - pobiera kolekcję wszystkich elementów HTML z dokumentu
pColl->tags - zwraca nową kolekcję zawierającą tylko elementy o podanym typie (INPUT) dla której otwieramy pętlę for dla wszystkich zwróconych elementów.
pInputCollection->item - zwraca objekt z kolekcji, spod danego indeksu.
pInputdisp->QueryInterface(IID_IHTMLInputElement - żądamy by element zwrócił objekt z metodami elementu typu INPUT. pInputdisp jest typu IDispatch więc nie wskazuje na żaden typ elementu, dlatego musimy "QueryInterface". Zmieniając IID na IID_IHTMLInputElement2, otrzymamy kompletnie inny objekt z dwoma metodami accept i useMap. Gdy podamy IID_IHTMLElement*, otrzymamy objekt z metodami dostępnymi dla każdego rodzaju elementu, nie tylko input.
input->get_type - zwraca string reprezentujący typ elementu (button, checkbox, file, hidden, image, password...) - jeśli to password, to input->get_value zwróci jego zawartość.

Powyższy kod to JavaScript zapisany w formacie c/c++

1 użytkowników online, w tym zalogowanych: 0, gości: 1