Отправка нажатий клавиш в приложение, SendKeys.Send () против SendMessage ()

Я создал простого бота для автоматизации некоторых вещей в игре. В настоящее время я посылаю команды в игру, выводя игровое окно на передний план и отправляя ключи, используя SendKeys , например:

SendKeys.Send("{ENTER}")

Что я хотел бы знать, так это то, что с точки зрения обнаружения, если античит-системам и т. д. легче обнаружить что-то подобное (используя SendMessage ):

public static void SendKeystroke(ushort k)
{
    const uint WM_KEYDOWN = 0x100;
    const uint WM_SYSCOMMAND = 0x018;
    const uint SC_CLOSE = 0x053;

    IntPtr WindowToFind = FindWindow(null, "Untitled1 - Notepad++");

    IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN, 
                                    ((IntPtr)k), (IntPtr)0);
}

SendKeystroke(Keys.Enter);

В конце концов, игра получит событие нажатия клавиши для клавиши ввода, верно?

7 голосов | спросил Johan 6 FriEurope/Moscow2013-12-06T16:41:03+04:00Europe/Moscow12bEurope/MoscowFri, 06 Dec 2013 16:41:03 +0400 2013, 16:41:03

2 ответа


0
  • SendKeys.Send обычно использует SendInput. Альтернативный метод, основанный на перехватах журналов, недопустим в UAC, поэтому давайте предположим, что SendKeys.Send преобразуется в SendInput литий>
  • SendMessage доставляет сообщения прямо в оконный процесс синхронно.

Итак, что легче обнаружить. Ну, конечно, ответ SendMessage. Это входные сообщения, которые поступают в оконную процедуру, даже не будучи вытащенными из очереди с вызовом GetMessage. Это легко обнаружить. Вы просто регистрируете некоторую информацию о последнем сообщении, извлеченном из очереди, и в оконной процедуре сверяете сообщение с последним сообщением в очереди.

Теперь провести различие между SendInput и реальным человеческим вкладом, вероятно, сложнее. Я уверен, что это возможно. Один из способов - установить низкоуровневый хук для клавиатуры и найти флаг LLKHF_INJECTED. Сложнее, но не намного сложнее.

ответил David Heffernan 12 ThuEurope/Moscow2013-12-12T21:34:59+04:00Europe/Moscow12bEurope/MoscowThu, 12 Dec 2013 21:34:59 +0400 2013, 21:34:59
0

Это как концептуальный, так и технический вопрос.

  • SendKeys.Send () - это оболочка Windows Forms для WinAPI SendInput () . Эта функция работает непосредственно с потоком ввода мыши и клавиатуры. Хотя есть некоторые ограничения (пожалуйста, прочитайте документацию для этого).

  • SendMessage () - это функция WinAPI. Он используется для отправки определенного сообщения в окно (а). Он может использоваться для отправки других сообщений помимо ввода с клавиатуры или мыши. Это своего рода очередь сообщений более высокого уровня, где многие другие сообщения объединяются для отправки в окно (а). Существуют также ограничения на маршалинг сообщений между процессами.

  • Обнаруживаемость : это будет зависеть от того, насколько хорошо вы сможете имитировать процесс нажатия кнопки и насколько хорош античит-движок, с которым вы столкнулись. Когда человек нажимает кнопку, в окно отправляется немного других сообщений. Помимо WM_KEYDOWN, есть WM_KEYUP и некоторые другие. Ваша задача - воссоздать эту последовательность как можно ближе. Вам придется провести собственное исследование по этой теме. Вы уже можете видеть, что человек, нажав кнопку, не может создать ситуацию, когда только WM_KEYDOWN отправлено в окно, WM_KEYUP должны быть выполнены. Также задержка между ними должна быть по-человечески возможной и так далее ...

Я также считаю, что SendMessage () может не работать должным образом с играми, потому что многие из них используют DirectX DirectInput, и в этом случае функция WinAPI SendInput (), я думаю, может работать лучше, так как это более низкий уровень API и работает напрямую с потоком ввода.

ответил Andrei 12 ThuEurope/Moscow2013-12-12T21:09:15+04:00Europe/Moscow12bEurope/MoscowThu, 12 Dec 2013 21:09:15 +0400 2013, 21:09:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132