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ć??

- Rejestracja:około 19 lat
- Ostatnio:ponad 9 lat
- Postów:892
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.
- Rejestracja:prawie 21 lat
- Ostatnio:ponad 9 lat
- Postów:513
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);
}
}
- Rejestracja:prawie 18 lat
- Ostatnio:ponad 14 lat
@sapero
mógłbyś wyjaśnić zasadę działania programu
- Rejestracja:prawie 21 lat
- Ostatnio:ponad 9 lat
- Postów:513
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++