Навигация
Usb2kbd (видео)
    04.06.2023 Начаты разработки для применимости девайса для разблокировки PIN-кода для владельцев MacBook.
    04.06.2023 Вышло глобальное обновление прошивки и ПО Usb2kbd_LAN 6.5. Внедрён альтернативный режим работы мыши - в абсолютной системе координат. Т.е. в этом режиме можно отправлять абсолютные координаты перемещения курсора мыши, например, сразу в координаты экрана X=100 Y=100.
    04.06.2023 Зафиксирован и подтвержден мной первый в истории девайса Usb2kbd_DLL факт блокировки игровой защитой одной из MMORPG самой управляющей DLL. Напрямую команды в Usb2kbd_DLL проходят без проблем. В связи с этим рекомендуется всем, у кого наблюдается данная проблема, переходить на продукт Usb2kbd_LAN/COM с управлением через UDP или COM порт.
Usb2kbd_LAN/COM
Уважаемые друзья!
Многие из Вас пишут о том, что неплохо было бы подключить к девайсу LAN-модуль (аналог сетевой карты), чтоб получить возможность управлять девайсом через сеть. Представляю Вашему вниманию мою очередную разработку - Usb2kbd_LAN/COM.
В основе этого девайса лежит знаменитая платформа Arduino Leonardo, а для управления девайсом через LAN предусмотрен сетевой модуль Arduino Ethernet shield W5100, работающий по UDP-протоколу (модуль может отсоединяться).
Важно помнить, что Usb2kbd_LAN/COM управляется по сети или через собственный COM-порт, функции управления через Dll (как было в usb2kbd) в нем нет!
В версии Usb2kbd_LAN/COM 6.0 реализована возможность управлять девайсом и через COM-порт. Эта функция подойдет для случая, если у Вас нет задачи управлять дистанционным компьютером и Вы захотите управлять девайсом локально через собственный COM-порт устройства. Для активации режима COM-порта в девайсе достаточно перед включением девайса в USB замкнуть перемычкой выводы 12 и GND девайса, затем включить девайс в USB и убедиться, что у Вас в диспетчере устройств Windows появился новый COM-порт девайса (см. фото ниже).
Важно! Такая возможность управления девайсом через COM-порт доступна как для пользователей Win10 и Win11 (установка дополнительных драйверов не требуется), так и для пользователей Win7 (скачать драйвер .inf с инструкцией можно здесь. После подготовки Вами и правки прилагаемого файла .inf согласно инструкции нажмите "Обновить драйвер" неизвестного устройства в диспетчере устройств Windows и выберите отрадактированный Вами .inf файл).
При подключении в USB-порт компьютера, Usb2kbd_LAN/COM автоматически определится системой как стандартная USB-HID клавиатура и мышь (комбо-девайс. 2-в-одном), никаких дополнительных драйверов для клавиатуры и мыши устанавливать не нужно!
Принцип работы Usb2kbd_LAN/COM заключается в том, что девайс умеет принимать управляющие команды (пакеты) из LAN-сети (UDP) или же через собственный COM-порт, причём неважно, откуда пришел пакет, главное, чтобы он прошел проверку на подлинность девайсом. Далее, получив такой пакет, Usb2kbd_LAN/COM через USB-протокол нажимает клавишу клавиатуры или управляет мышью согласно пакету. Как Вы видите, теперь девайсу не нужны никакие DLL, Вам достаточно знать, как из Вашей программы, написанной на любом известном Вам языке программирования, составить и отправить простой управляющий пакет девайсу по сети (протокол UDP, локальная сеть или интернет) или через COM-порт (примеры отсылки управляющих пакетов приведены ниже в разделе примеров).
Важно помнить, что управляющий пакет для COM-порта девайса Usb2kbd_LAN/COM по структуре полностью аналогичен управляющему пакету пакету UDP, только в конце пакета обязательно должен быть добавлен специальный символ конца строки ($0A, он же LF).
Итак, для чего нужен девайс Usb2kbd_LAN/COM, в чем его главное отличие от Usb2kbd_DLL, какая основная функция, возможности, и какое применение на практике?
- Самая важная и основная функция Usb2kbd_LAN/COM состоит в том, что, благодаря девайсу, можно управлять любым дистанционным компьютером или даже планшетом (на базе Android с поддержкой OTG) в локальной сети (включая самим собой) или через интернет, причем безо всяких DLL.
Плюсы Usb2kbd_LAN/COM:
- Доступно управление девайсом как через LAN-интерфейс, так и через внутренний COM-порт;
- Через Usb2kbd_LAN/COM можно без труда управлять мышкой и клавиатурой в системах DOS, BIOS, Linux (т.е. вне системы Windows);
- Управление Usb2kbd_LAN/COM через UDP работает на 10% быстрее, чем Usb2kbd_DLL (так как не тратится время на работу с DLL).
- Управление Usb2kbd_LAN/COM через COM-порт работает в 8 раз быстрее, чем Usb2kbd_LAN/COM через UDP-протокол. Это 2 мс на одну команду против 15,6 мс!
- Usb2kbd_LAN/COM выполнен на всемирно известной платформе Arduino, что обеспечивает стабильность работы и помехоустойчивость.
- NEW! Мышь в Usb2kbd_LAN/COM может иметь относительную или абсолютную систему координат по Вашему выбору.
- Usb2kbd_LAN/COM в относительной системе координат может смещать курсор мыши за 1 команду на + - 32767 пикселей, в абсолютной - в пределах текущего разрешения экрана.
По умолчанию девайс имеет относительную систему координат мыши. Для перевода устройства в абсолютную систему координат достаточно будет отключить его, затем замкнуть перемычкой ПИН11 и GRD, как показано на фото, затем включить девайс.
Минусы Usb2kbd_LAN/COM:
- ТОЛЬКО ДЛЯ ОТНОСИТЕЛЬНОЙ СИСТЕМЫ КООРДИНАТ! Для корректной работы мыши Usb2kbd_LAN/COM в относительной системе координат необходимо будет ОБЯЗАТЕЛЬНО отключать "ускорение мыши" в Windows на управляемом и управляющем компьютерах. Что такое "отключение ускорения Widnows" и зачем его отключать? Дело в том, что по умолчанию такое ускорение включено в Windows и если, например, Вы отправите девайсу Usb2kbd_LAN/COM через управляющий пакет команду "сместить курсор на 100 пикселей по оси X", то девайс, конечно, выполнит команду и отправит в Windows точное смещение на те же 100 пикселей по оси X. Но вот Windows, получив такое смещение, самостоятельно "ускорит" мышь - и курсор мыши сместиться не на 100 пикселей, а на большую величину (например, 159 пикселей). Так вот чтоб такого не произошло, Вам необходимо будет самостоятельно отключить ускорение мыши в настройках мыши Windows (смотрите рисунок ниже) на обоих компьютерах (управляющем и управляемом посредством Usb2kbd_LAN/COM). Для этого войдите в раздел панели управления "Мышь" и выставите настройки как на картинке ниже (В примере - для Windows 7, для Windows 10 - внешний вид настройки чуть другой, но принцип тот же).
Ниже рассмотрим более детально основную функцию Usb2kbd_LAN/COM - функцию управления по сети.
Как управлять дистанционным компьютером/планшетом в локальной сети:
б) Подключите USB-разъем девайса Usb2kbd_LAN/COM через ДАТА-кабель MicroUSB (минимальной длины) в управляемый компьютер или планшет (через OTG-кабель), которым хотите дистанционно управлять.
в) Убедитесь, что девайс Usb2kbd_LAN/COM корректно виден в локальной сети, т.е. пропингуйте его с компьютера, с которого Вы хотите управлять (управляющий компьютер) - по умолчанию IP-адрес девайса - (клавиатура+мышь) - 192.168.0.222, порт - 12345. (IP-адрес и порт девайса могут быть заданы любыми при покупке).
Важно помнить, что Usb2kbd_LAN/COM умеет при включении считывать и задавать себе IP-адрес с конфигурационного txt-файла с флеш памяти MicroSD. Для этого найдите флеш-карту MicroSD желательно размером 4 Гб или меньше, отформатируйте ее в файловой системе FAT32, затем подготовьте и поместите на карту строго 1 файл ip.txt (скачать образец в RAR-архиве можно здесь), в котором пропишите желаемый IP-адрес. Вставьте MicroSD карту в Usb2kbd_LAN/COM, после чего включите его в USB-разъем комьютера. При загрузке Usb2kbd_LAN/COM считает файл IP.txt с флеш-карты MicroSD и автоматически присвоит себе заданные Вами в файле IP-адрес.
г) Попробуйте в своей программе (скрипте) на управляющем компьютере составить и отправить первый управляющий UDP-пакет девайсу (мыши+клавиатуре) в локальной сети. Можно также использовать штатную программу дистанционного управления и отсылки пакетов в Usb2kbd_LAN/COM (программа высылается при покупке девайса). Программа не только проверит работоспособность девайса, но и поможет Вам научиться правильно составлять управляющие пакеты для отправки в девайс (описание программы читайте в конце этого раздела).
ОЧЕНЬ ВАЖНО! ВНИМАНИЕ! При ручном управлении мышью с использованием штатного ПО очень важно использовать НЕ ИГРОВУЮ самую обычную мышь! Т.к. игровые мыши посылают намного больше событий в девайс, чем обычные мышки, тем самым могут вызвать зависание устройства!
Структура же самого отправляемого управляющего пакета также будет рассмотрена ниже.
д) Если Вы все сделали правильно, то LAN-модуль девайса получит Ваш управляющий пакет и исполнит его (нажмет клавишу клавиатуры или переместит мышь) на управляемом компьютере/планшете.
Так как UDP пакет не подразумевает контроль доставляемости, в девайсе реализована возможность контроля доставляемости UDP пакета. Так, получив управляющий UDP-пакет, девайс ответит на IP-адрес отправителя и порт 22222 информационным UDP пакетом, который будет содержать полученный им управляющий пакет. Так можно будет контролировать 100% доставляемость UDP управляющих пакетов в девайс.
Для управления удаленным компьютером/планшетом через сеть интернет - Вам также нужно будет сделать настройку маршрутизатора удаленной сети - осуществить "проброс порта" 12345 из вне на девайс в сети - IP-адрес девайса Usb2kbd_LAN/COM по умолчанию, как мы уже говорили, 192.168.0.222, порт 12345.
Ниже - пример проброса портов для роутера TPLINK-WR841N:
После осуществления проброса портов Вы сможете управлять клавитурой и мышью дистанционного компьютера (не своим) через Usb2kbd_LAN/COM по UDP-протоколу безо всяких скриптов через вышеупомянутую специальную штатную программу управления и отсылки пакетов в Usb2kbd_LAN (высылается при покупке), вот такую:
и в ней прописываете настройки соединения (вкладка "Настройки"), соединяетесь с удаленным компьютером через любую программу дистанционного управления (AnyDesk, AmmyAdmin, Radmin, и т.д) в режиме просмотра (чтоб видеть, чем же Вы там управляете) и жмете "Старт" в программе. И вот Вы управляете удаленным компьютером как будто Вы возле него! Причем все нажатия клавиатуры и мыши будут настоящими, а не эмулированными! Кроме того, и это важно, если запущена эта программа, теперь на компьютере, откуда идет управление, можно запустить любой скрипт с любыми эмулированными (!!!!) нажатиями клавиатуры и мыши, и программа Usb2kbd_LAN/COM с управляющего компьютера автоматически будет передавать эти "показания" в сеть девайсу на удаленном компьютере, которые станут для него "настоящими" нажатиями, благодаря девайсу Usb2kbd_LAN/COM. Т.е. автоматизация скриптами никуда не пропадет.
Кстати, в Usb2kbd_LAN/COM есть возможность отсылать дублированные нажатия клавиатуры и мыши одновременно сразу на несколько пар IP:PORT. Для этого допишите необходимые параметры в файл settings.ini программы. Вот пример settings.ini с двумя дополнительными парами IP и PORT (т.е. в примере одна пара SendToIPAddress:SendToPort - основная, а SendToIPAddress1:SendToPort1 и SendToIPAddress2:SendToPort2 - дополнительные. Итого - пакеты будет отсылаться одновременно на 3 пары.
Пример файла settings.ini:
[global]
serial=1247
systempass=0
IPAddress=192.168.0.50
SendToIPAddress=192.168.0.223
SendToPort=12345
SendToIPAddress1=192.168.0.224
SendToPort1=12345
SendToIPAddress2=192.168.0.225
SendToPort2=12345
При запуске штатной программы с такими установками во вкладке "Настройки" Вы увидите надпись о том, сколько дополнительных пар IP:PORT было найдено в settings.ini
Кроме того, напомню, что при помощи этой программы Вы также сможете научиться правильно составлять управляющие пакеты для отправки в девайс (вкладка программы Составитель пакетов). Там же можно и сразу отправить составленный пакет в девайс (работает только для пакетов смещения курсора мыши без нажатий кнопок, чтоб не было эффекта "залипания" нажатой клавиши без отжатия).
Управляющий пакет Usb2kbd_LAN/COM
Итак, что такое управляющий пакет Usb2kbd_LAN/COM? Управляющий пакет - это 18-значный цифровой код определенного формата, который Вы отправляете в Usb2kbd_LAN/COM (через LAN-интерфейс или COM-порт), который получается девайсом, проверяется и, если пакет прошел проверку на корректность, выполняется (происходит нажатие клавиши клавиатуры, движение мыши и т.д.). Рассмотрим структуру управляющего пакета для отправки в Usb2kbd_LAN/COM:
где ID - ID девайса (написан маркером на девайсе, у каждого девайса уникален);
b1, b2, b3, b4 - параметры управляющего пакета, где мы описываем что мы хотим нажимать, куда смещать мышь и на сколько.
Давайте сначала рассмотрим детальнее параметры b1, b2, b3, b4 управляющего пакета, необходимые для работы Usb2kbd_LAN:
b1 - Управляющий символ (целое число) - определяет действие, которое необходимо выполнить устройством Usb2kbd_Lan. Его возможные значения Вы сможете увидеть в таблице ниже
b2 - Вспомогательный символ, который дополняет символ b1. Может означать:
а) Код клавиши (целое число, значения от 4 до 231) - определяет код нажатой или отжатой клавиши клавиатуры для случаев, когда b1 = 1 или 2 (коды клавиш Вы сможете скачать в разделе сайта "Загрузки");
ИЛИ
б) Код нажатия кнопок мыши (целое число, значения от 0 до 7) - определяет код нажатой или отжатой кнопки мыши для случаев, когда b1 = 4.
... т.д. Подробнее - в таблице параметров управляющего пакета ниже.
Хватит теории, пошла практика:
ВНИМАНИЕ! ВАЖНО! Для стабильной и бесперебойной работы Usb2kbd_LAN/COM по протоколу UDP (LAN) ОБЯЗАТЕЛЬНО используйте минимальные паузы в 1 мс между событиями, иначе возможны потери UDP-пакетов! Для работы через COM-порт паузы между событиями не обязательны.
Отправка UDP управляющего пакета в локальную сеть:
Перед началом написания программы отправки управляющего UDP-пакета в устройство помните, что сначала в Вашей программе Вам нужно будет задать следующие исходные параметры сети:
- IP адрес локального компьютера (откуда будет посылаться UDP-пакеты), в примерах - 192.168.0.50, проставьте свой;
- IP-адрес подключенного устройства Usb2kbd_LAN/COM (по умолчанию один IP - 192.168.0.222 для клавиатуры и для мыши), проставьте свой, если отличен от 192.168.0.222;
- Порт назначения (12345 для клавиатуры и для мыши), проставьте свой, если отличен от 12345;
- вызвать функцию формирования и отправки управляющего UDP-пакета на указанный IP-адрес и порт).
Отправка COM управляющего пакета в COM-порт девайса:
Если же Вы решите вместо UDP отправлять управляющие пакеты через COM-порт в устройство Usb2kbd_LAN/COM, помните, что сначала в Вашей программе Вам нужно будет задать следующие исходные параметры:
- COM-порт, который отобразится при подключении девайса к USB компьютера с замкнутыми выводами 12 и GRN платы (см. информацию выше в этом разделе);
- вызвать функцию формирования и отправки управляющего COM-пакета на указанный COM-порт. Напомню, управляющий пакет для COM-порта девайса аналогичен пакету UDP, только в конце пакета (18 цифр) обязательно должен быть добавлен специальный символ конца строки ($0A, он же LF).
Для всех примеров ниже за эталон ID девайса будет принято число 1206.
Убедительная просьба - копируйте тексты кодов с сайта в блокнот, чтоб код был более читабельный.
Пример на Autohotkey (UDP):
Sleep, 2000
IPAddress:="192.168.0.50" ; локальный ip
SendToIPAddress:="192.168.0.222" ; ip девайса
Port:= "12345" ; порт локальной тачки, откуда пойдут UDP-пакеты в сеть
SendToPort:= "12345" ; порт удаленной тачки, куда пойдет UDP-пакет для девайса
; инициализируем UDP один раз вначале
VarSetCapacity(wsaData, 32)
DllCall("Ws2_32\WSAStartup", "UShort", 2, "UInt", &wsaData)
socket := DllCall("Ws2_32\socket", "Int", 2, "Int", 2, "Int", 17)
VarSetCapacity(sockaddr, 32)
NumPut(2, sockaddr, 0, "Short")
NumPut(DllCall("Ws2_32\htons", "UShort", Port), sockaddr, 2, "UShort")
NumPut(DllCall("Ws2_32\inet_addr", "Str", IPAddress), sockaddr, 4)
DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket, "UInt", WinExist("A"), "UInt", 0x5555, "Int", 1)
OnMessage(0x5555, "WinsockMessage")
SendText := "120640000010000100"
; отправим сформированный UDP-пакет в девайс
VarSetCapacity(sendaddr, 32)
NumPut(2, sendaddr, 0, "Short")
NumPut(DllCall("Ws2_32\htons", "UShort", SendToPort), sendaddr, 2, "UShort")
NumPut(DllCall("Ws2_32\inet_addr", "Str", SendToIPAddress), sendaddr, 4)
DllCall("Ws2_32\sendto", "UInt", socket, "Str", SendText, "Int", StrLen(SendText), "Int", 0 , "UInt", &sendaddr, "Int", 32)
Пример на Autoit (UDP):
Ниже приведу пример формирования и отсылки управляющего UDP-пакета в Usb2kbd_LAN/COM посредством Autoit:
UDPStartup()
$LocalIP = "192.168.0.50"
$LocalPort = "12345"
$RemoteIP = "192.168.0.222"
$RemotePort = "12345"
$sock = UDPBind($LocalIP, $LocalPort)
$sock[2] = $RemoteIP
$sock[3] = $RemotePort
Sleep(3000)
UDPSend($sock, "120610040000000000")
UDPSend($sock, "120680000000000000")
UDPShutdown()
Пример нажимает клавишу А на клавиатуре и затем отжимает ВСЕ клавиши клавиатуры.
Пример на С++ (UDP, спасибо за пример Александру):
void SendInputClass::SendInput(){
SendInputClass::SendUDP("1", "030", "00000", "00000"); // нажатие 1
Sleep(30);
SendInputClass::SendUDP("2", "030", "00000", "00000"); // отжатие 1
}
void SendInputClass::SendUDP(string b1, string b2, string b3, string b4) {
// 1206 - ID
// 192.168.0.222 - IP
// 12345 - Port
CHAR pak[300];
sprintf_s(pak, "1206%s%s%s%s", b1.c_str(), b2.c_str(), b3.c_str(), b4.c_str());
struct sockaddr_in si_other;
int s, slen = sizeof(si_other);
WSADATA wsa;
//Initialise winsock
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
DebugBreak();
//create socket
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
DebugBreak();
//setup address structure
memset((char *)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(12345);
si_other.sin_addr.S_un.S_addr = inet_addr("192.168.0.222");
sendto(s, pak, strlen(pak), 0, (struct sockaddr *) &si_other, slen);
closesocket(s);
WSACleanup();
}
Пример на Delphi7 (UDP):
Пример на Java (UDP, спасибо за код Матвею):
DatagramSocket socket = new DatagramSocket();
InetAddress inetAddress = InetAddress.getByName("192.168.1.222");
byte[] msg;
msg = "120610040000000000".getBytes(); // press button "a"
DatagramPacket packet = new DatagramPacket(msg, msg.length, inetAddress, 12345);
socket.send(packet);
Thread.sleep(1); //delay 1ms
msg = "120620040000000000".getBytes(); //release button "a"
packet = new DatagramPacket(msg, msg.length, inetAddress, 12345);
socket.send(packet);
socket.close();
Пример на C# (UDP, спасибо за код Александру):
using System;
using System.Threading;
using System.Net.Sockets;
class Program
{
static string server = "192.168.0.222";
static int port = 12345;
static string serial = "1206";
static void Main(string[] args)
{
Sendkeyb("1", "030", "00000", "00000"); // отошлем клавиатуре нажатие 1
Sendkeyb("2", "030", "00000", "00000"); // отошлем клавиатуре отжатие 1
}
static void Sendkeyb(string b1, string b2, string b3, string b4)
{
string message = serial + b1 + b2 + b3 + b4;
UdpClient client = new UdpClient(server, port);
byte[] data = Encoding.UTF8.GetBytes(message);
int numberOfSentBytes = client.Send(data, data.Length);
client.Close();
Thread.Sleep(1);
}
}
Пример на Autohotkey (COM-порт):
; инициализируем COM
port := FileOpen("\\.\COM72", "w") ; Open for writing only, not reading/appending. Тут проставьте COM-порт своего девайса.
port.Write("120640000000100000") ; 1 px mouse X move
port.WriteChar(10) ; Write конец строки ($0A).
port.Close() ; close the Port
Пример на AutoIt (COM-порт):
Пример на Питоне (COM-порт, Спасибо за пример Александру):
#pip install pyserial - Уставливаем библиотеку
import serial # Импортируем библиотеку
#----------------#
def main():
port = serial.Serial("COM3", timeout=1) # Открываем порт для записи.
port.write(b"120640000000100000") # Двигаем мышкой как пример.
port.write(b"\n") # Не забываем про конец строки.
port.close() # Закрываем порт.
if name == "main":
main()
Пример на C++ (COM-порт, Спасибо за пример Александру):
void SendDataToComPort(const std::wstring& port, const std::string& data) {
HANDLE comHandle = CreateFileW(port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);
if (comHandle == INVALID_HANDLE_VALUE) {
std::cout << "Проблемы с COM-портом." << std::endl;
return;
}
DWORD bytesWritten = 0;
WriteFile(comHandle, data.c_str(), static_cast<DWORD>(data.length()), &bytesWritten, nullptr);
std::cout << "Отправлено байт " << bytesWritten << " в USB2KBD" << std::endl;
CloseHandle(comHandle);
}
int main() {
// Отправляем данные на COM-порт Arduino
std::wstring comPort = L"\\\\.\\COM3"; // Укажите соответствующий порт
std::string dataToSend = "120640000050000500\n"; // Данные для отправки
SendDataToComPort(comPort, dataToSend);
return 0;
}