Что нового

Эмуляция нажатий клавиш и мыши.

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
народ, киньте прогу или код, чтоб читать флаги - реальный ввод клав/мышки или эмуляция

А подумать лень? :scratch:
Если бы был такой код, то ботов не было бы.
:IL_AutoIt_1:
 

scanfail

Знающий
Сообщения
244
Репутация
17
Может стоит попробовать, открыть экранную клавиатуру, скрыть её, посылать ей контролсенды или это абсурд? :D
 

mashino

Новичок
Сообщения
21
Репутация
0
Может стоит попробовать, открыть экранную клавиатуру, скрыть её, посылать ей контролсенды или это абсурд? :D
этот вариант отпал и не стоит даже думать в его сторону.

нужно копать в сторону хуков.
http://autoit-script.ru/autoit3_docs/libfunctions/_winapi_setwindowshookex.htm
но ешё пока не разобрался что к чему там.
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
mashino [?]
киньте прогу или код, чтоб читать флаги - реальный ввод клав/мышки или эмуляция
Модифицировал пример из справки по функции _WinAPI_SetWindowsHookEx :
Код:
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Opt('MustDeclareVars', 1)

Global $hHook, $hStub_KeyProc, $buffer = ""

GUICreate("12345", 200, 150)
GUICtrlCreateEdit("", 0, 0)
GUISetState()

_Main()

Func _Main()
    OnAutoItExitRegister("Cleanup")

    Local $hmod

    $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    $hmod = _WinAPI_GetModuleHandle(0)
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

    While 1
        Sleep(10)
    WEnd
EndFunc   ;==>_Main

;===========================================================
; callback function
;===========================================================
Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If DllStructGetData($tKEYHOOKS, "vkCode") = 27 Then Exit
    Local $flags = DllStructGetData($tKEYHOOKS, "flags")
    Switch $flags
        Case $LLKHF_ALTDOWN
            ConsoleWrite("$LLKHF_ALTDOWN" & @CRLF)
        Case $LLKHF_EXTENDED
            ConsoleWrite("$LLKHF_EXTENDED" & @CRLF)
        Case $LLKHF_INJECTED
            ConsoleWrite("$LLKHF_INJECTED" & @CRLF)
        Case $LLKHF_UP
            ConsoleWrite("$LLKHF_UP: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & DllStructGetData($tKEYHOOKS, "vkCode") & @CRLF)
    EndSwitch
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
EndFunc   ;==>Cleanup

Сделал пультик управления:
Код:
#include <WinAPIEx.au3>
#include <APIConstants.au3>

GUICreate("", 150, 110)
$btn1 = GUICtrlCreateButton("Send", 10, 10)
$btn2 = GUICtrlCreateButton("ControlSend", 10, 40)
$btn3 = GUICtrlCreateButton("Keybd_Event", 10, 70)
GUISetState()

Do
  Switch GUIGetMsg()
    Case $btn1
      WinActivate("12345")
      Send("w")
    Case $btn2
      ControlSend("12345", "", "Edit1", "w")
    Case $btn3
      WinActivate("12345")
      _WinAPI_Keybd_Event($VK_W, 0, 0, 0)
    Case -3
      Exit
  EndSwitch
Until 0

Скомпилировал и запустил пультик, из SciTE запустил модифицированный пример.
При нажатии кнопок "Send" и "Keybd_Event" в консоли появляется надпись "$LLKHF_INJECTED", при нажатии кнопки "ControlSend" - не появляется.
Что бы это значило? :scratch:


Добавлено:
Сообщение автоматически объединено:

Вот ещё информация к размышлению.
Добавил в скрипт своего "пультика" опцию, которую ControlSend() использует всегда:
Код:
Opt("SendAttachMode", 1)

Запустил - никаких изменений. Но если запустить скрипт с правами администратора (на Windows 7), то при нажатии кнопки "Send" надпись "$LLKHF_INJECTED" не появляется ! :stars:
 

mashino

Новичок
Сообщения
21
Репутация
0
Код:
Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then

Подскажите что за параметр $nCode ? он проверяется в функции, но что он означает и как принимает значение непонятно.
----------------------
взял за пример код выше. пытался отследить видно ли эмуляцию мышки. так и не разобрался.

Код:
AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>


Opt('MustDeclareVars', 1)
HotKeySet("{F9}", "_Quit")

Global $hHook, $hStub_MouseProc, $buffer = ""
Global Const $MSLLHOOKSTRUCT = $tagPOINT

GUICreate("12345", 200, 150)
Global $_GUI_DATA_INPUT=GUICtrlCreateEdit("", 0, 0)
GUISetState()

_Main()

Func _Main()
    OnAutoItExitRegister("Cleanup")

    $hStub_MouseProc = DllCallbackRegister("_MouseProc", "int", "int;wparam;ptr")

	$hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL,DllCallbackGetPtr($hStub_MouseProc),_WinAPI_GetModuleHandle(0))

    While 1
        Sleep(100)
    WEnd
EndFunc   ;==>_Main


Func _MouseProc($nCode, $wParam, $lParam)
	local $info
    If $nCode < 0 Then
        Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf

	Local $mHOOKS = DllStructCreate($MSLLHOOKSTRUCT, $lParam)
	Local $mouseData = DllStructGetData($info,3)
	Local $time = DllStructGetData($info,5)

	Local $flags = DllStructGetData($mHOOKS, "flags")

GUICtrlSetData($_GUI_DATA_INPUT,DllStructGetData($info,1)&"    "  & $flags)

	Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc



Func Cleanup()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_MouseProc)
EndFunc   ;==>Cleanup

Func _Quit()
	Cleanup()
	exit
EndFunc

3 варианта:
1) я что-то не так делаю.
2) где-то мелкая ошибка (типа испольовать другое значение Global Const $MSLLHOOKSTRUCT = $tagPOINT)
3) эмуляция мышки не отлавливается.

прошу помощи.
--------------added------------------
разобрался :smile:
 

Mexanik

Новичок
Сообщения
10
Репутация
0
Вопрос решил. Обошелся без хуков вообще. Обходил именно саму защиту. Программу писал на Делфи. Если нужна помощь буду после выходных. Пишите четко игру под которую нужен обход защиты. Всем удачи.
 

mashino

Новичок
Сообщения
21
Репутация
0
можно вкратце название игры и способ обхода защиты? на словах 8)
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Mexanik [?]
Пишите четко игру под которую нужен обход защиты
Речь идет не об этом, нужно чтоб скрипт мог кликать/печатать когбудто на реальной мышки/клавиатуре.
 

amdnick

Новичок
Сообщения
1
Репутация
0
#RequireAdmin, у меня после добавления этой строки в скрипт чат в W.o.T. заработал, хотя функции те же самые SEND.
Винда 7-ка. Тоже голову сломал, но вот почитал ваши советы и помогло,но скрипт ещё нуждается в доработке, сырец. Может и придём к общему знаменателю, надо больше прогеров подключать.
 

deni_81

Новичок
Сообщения
1
Репутация
0
amdnick
можешь выложить код?
а то у меня с #RequireAdmin спам бот в W.o.T все равно не пашет :(
 

fgejtred

Новичок
Сообщения
3
Репутация
0
Подскажите пожалуйста как эмулировать нажатие клавиши "F5"? в списке Send её нет.
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Решал банальную задачу: по горячей клавише отправить в игру сочетание клавиш. Создалось впечатление, что игра защищена. Оказалось:
1. Send() игра воспринимает. Но реагирует только при наличии задержки между нажатием и отпусканием.
2. Горячая клавиша блокируется игрой. HotKeySet() и _WinAPI_RegisterHotKey() не помогают: нажатие горячей клавиши при активном окне игры просто не доходит до AutoIt.
Решение:
1. Увеличить задержку между нажатием и отпусканием клавиши.
2. Реализовать горячую клавишу через хук.
Выкладываю код, может кому поможет. В коде используется горячая клавиша "7".
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>

Opt("SendKeyDownDelay", 30) ; задержка между нажатием и отпусканием одной клавиши
Opt("SendKeyDelay", 100) ; задержка между отпусканием клавиши и нажатием следующей

OnAutoItExitRegister("Cleanup")

$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

While 1
  Sleep(1000)
WEnd

Func KeyProc($nCode, $wParam, $lParam)
  Local $tKEYHOOKS
  $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  If $wParam = $WM_KEYDOWN Then
    If DllStructGetData($tKEYHOOKS, "vkCode") = 0x37 Then ; код клавиши "7"
      SendKey()
      Return -1
    EndIf
  EndIf
  Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func Cleanup()
  _WinAPI_UnhookWindowsHookEx($hHook)
  DllCallbackFree($hStub_KeyProc)
EndFunc

Func SendKey()
  Send("{down}{down}{enter}")
EndFunc
 

DeLeTeSHift

Знающий
Сообщения
46
Репутация
9
в некоторых играх достаточно заменить "w" на "ц", "d" на "в", ну, вы поняли
 

MaxBorisov

Новичок
Сообщения
5
Репутация
0
В Diablo the hell мод не работает.
Если человек решивший вопрос с WoT посодействует - об оплате договоримся.
Autoit, C# - не принципиально.
 
Верх