[C++]Odczyt gwiazdek

[C++]Odczyt gwiazdek
PO
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 14 lat
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ć??


"Wiedzę możemy zdobywać od innych, ale mądrości musimy nauczyć się sami"
Ranides
  • Rejestracja:około 19 lat
  • Ostatnio:ponad 9 lat
  • Postów:892
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.

deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 12 lat
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.


I nie udawaj, że rozumiesz.
SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
0

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

Kopiuj
#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);
	}
}
PO
  • Rejestracja:prawie 18 lat
  • Ostatnio:ponad 14 lat
0

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


"Wiedzę możemy zdobywać od innych, ale mądrości musimy nauczyć się sami"
SA
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
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++

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)