Основной раздел > Использование
Arduino Micro + clickermann. Обход любых защит. DLL для общения с контроллером!!
dramster:
Не прошло и года, как у меня все-же получилось написать длл для общения с ком портом, а именно с ардуиномикро. По сравнению с командной строкой, работает шустро и незаметно.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:
--- Code: (clickermann) ---library micro_com;
uses Windows, SysUtils;
//------------------------------------------------------------------------------
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
pIntArr = array[0..0] of Integer;
var
DCB : TDCB;
hPort : THandle;
port_num : integer;
param : integer;
byete_res: Cardinal;
str : string;
len : integer;
begin
port_num := pIntArr(_mas^)[0];
param := pIntArr(_mas^)[_size-1];
// 1. Открываем файл
hPort := CreateFile(PChar('COM'+IntToStr(port_num)), GENERIC_READ + GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// 2. Контроль ошибок
if hPort = INVALID_HANDLE_VALUE then begin
// Обнаружена ошибка, порт открыть не удалось
result := 1;
exit;
end;
// 3. Чтение текущих настроек порта
if GetCommState(hPort, DCB) then ;
// 4. Настройки:
// Скорость обмена
DCB.BaudRate := 9600;
// Число бит на символ
DCB.ByteSize := 8;
// Стоп-биты
DCB.StopBits := 1;
// Четность
DCB.Parity := 0;
// Какая-то херь непонятная
DCB.Flags := 20625;
// 5. Передача настроек
if not SetCommState(hPort, DCB) then begin{ошибка настройки порта}
result := 2;
exit;
end;
// 6. Настройка буферов порта (очередей ввода и вывода)
if not SetupComm(hPort, 16, 16) then begin{ошибка настройки буферов}
result := 3;
exit;
end;
// 7. Сброс буферов и очередей
if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then
// 8. Запись в порт
str := intToStr(param);
len := Length(str);
WriteFile(hPort, PChar(str)^, len*2, byete_res, nil);
// 9. Закрытие порта
CloseHandle(hPort);
result := 5;
end;
//------------------------------------------------------------------------------
// список экспорта
exports execute;
begin
end.
--- End code ---
Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
--- Code: (clickermann) ---CALL ("micro_com.dll", $com, $val)
--- End code ---
Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
--- Code: (clickermann) ---#include <Mouse.h>
#include <Keyboard.h>
unsigned long par = 0;
String instring = "";
int kmfunct = 0;
int x_cor = 0;
int y_cor = 0;
int mult = 0;
int inchar = 0;
void setup() {
Serial.begin(9600);
Mouse.begin();
Keyboard.begin();
}
void loop() {
while(Serial.available() > 0){
inchar = Serial.read();
if (isDigit(inchar)) {
instring += (char)inchar;
}
}
par = instring.toInt();
instring = "";
if (par > 0) {
kmfunct = par/16777216 ;
switch (kmfunct) {
case 1: //Mouse.click
Mouse.click(par - kmfunct*16777216);
break;
case 2: // Mouse.move
x_cor = (par - kmfunct*16777216)/256;
y_cor = par - x_cor*256 - kmfunct*16777216;
if (x_cor > 127) x_cor = 127 - x_cor;
if (y_cor > 127) y_cor = 127 - y_cor;
Mouse.move(x_cor, y_cor, 0);
break;
case 3: //Mouse.press
Mouse.press(par - kmfunct*16777216);
break;
case 4: //Mouse.release
Mouse.release(par - kmfunct*16777216);
break;
case 5: //Mouse.dblclick
Mouse.click(par - kmfunct*16777216);
delay(50);
Mouse.click(par - kmfunct*16777216);
break;
case 6: //wheel.down.up
mult = par - kmfunct*16777216;
if (mult > 127) mult = 127 - mult;
Mouse.move(0, 0, mult);
case 7: // Keyboard.keydown
Keyboard.press(par - kmfunct*16777216);
break;
case 8: // Keyboard.keyup
Keyboard.release(par - kmfunct*16777216);
break;
case 9: // Keyboard.keypress
Keyboard.write(par - kmfunct*16777216);
break;
}
}
par = 0;
}
--- End code ---
Библиотека с подпрограммами для кликермана тут:
--- Code: (clickermann) ---$com = 5 //свой порт
//#name "Arduino_mouse&keyboard"
////////////////////////////////////////////////
// Все процедуры с мышью и клавиатурой через ардуино
//micro_move ($x_cor, $y_cor)
//micro_lclick ($x_cor, $y_cor)
//micro_rclick ($x_cor, $y_cor)
//micro_mclick ($x_cor, $y_cor)
//micro_ldown ($x_cor, $y_cor)
//micro_rdown ($x_cor, $y_cor)
//micro_mdown ($x_cor, $y_cor)
//micro_lup ($x_cor, $y_cor)
//micro_rup ($x_cor, $y_cor)
//micro_mup ($x_cor, $y_cor)
//micro_dblclick ($x_cor, $y_cor)
//micro_wheeldown ($mult)
//micro_wheelup ($mult)
// вместо $char_ASCII писать не код клавиши, а символ ASCII.
// в ардуино как-то тупо сделали клавиатурные нажатия :/
//micro_keydown ($char_ASCII)
//micro_keyup ($char_ASCII)
//micro_keypress ($char_ASCII)
//move
SUB(micro_move, $x_cor, $y_cor)
WHILE(DIST($x_cor, $y_cor, $_xmouse, $_ymouse) > 3)
$x_temp = $_xmouse
$y_temp = $_ymouse
$x_dist = $x_cor - $_xmouse
$y_dist = $y_cor - $_ymouse
IF($x_dist < 0)
$x_dist = 127 + int(SQRT(abs($x_dist*4)))
else
$x_dist = int(SQRT(abs($x_dist*4)))
END_IF
IF($y_dist < 0)
$y_dist = 127 + int(SQRT(abs($y_dist*4)))
else
$y_dist = int(SQRT(abs($y_dist*4)))
END_IF
CALL ("micro_com.dll", $com, 33554432 + $x_dist*256 + $y_dist)
END_CYC
END_SUB
//lclick
SUB(micro_lclick, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 16777217)
END_SUB
//rclick
SUB(micro_rclick, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 16777218)
END_SUB
//mclick
SUB(micro_mclick, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 16777219)
END_SUB
//ldown
SUB(micro_ldown, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 50331649)
END_SUB
//rdown
SUB(micro_rdown, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 50331650)
END_SUB
//mdown
SUB(micro_mdown, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 50331651)
END_SUB
//lup
SUB(micro_lup, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 67108865)
END_SUB
//rup
SUB(micro_rup, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 67108866)
END_SUB
//mup
SUB(micro_mup, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 67108867)
END_SUB
//dblclick
SUB(micro_dblclick, $x_cor, $y_cor)
micro_move($x_cor, $y_cor)
CALL ("micro_com.dll", $com, 83886081)
END_SUB
//wheeldown
SUB(micro_wheeldown, $mult)
CALL ("micro_com.dll", $com, 100663423 + $mult)
END_SUB
//wheelup
SUB(micro_wheelup, $mult)
CALL ("micro_com.dll", $com, 100663296 + $mult)
END_SUB
//keydown
SUB(micro_keydown, $char_ASCII)
CALL ("micro_com.dll", $com, 117440512 + code($char_ASCII))
END_SUB
//keyup
SUB(micro_keyup, $char_ASCII)
CALL ("micro_com.dll", $com, 134217728 + code($char_ASCII))
END_SUB
//keypress
SUB(micro_keypress, $char_ASCII)
CALL ("micro_com.dll", $com, 150994944 + code($char_ASCII))
END_SUB
--- End code ---
Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной ;).
Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.
Во вложении dll для х32 систем.
dramster:
А теперь поподробнее, с чего начинать, что купить, как прошить, как запустить...
1. Нам нужен сам контроллер ардуино. Подойдут только те, которые определяются на ПК как мышь и клавиатура. Те, о которых я в курсе - Arduino Micro, Arduino Pro Micro, Arduino Leonardo.
2. Подключаем наш девайс к ПК в любой USB. Смотрим в диспетчер устройств. Должно появиться три новых устройства - клавиатура HID, HID совместимая мышь, устройство с последовательным интерфейсом USB (COM). Номер COM порта запоминаем.
3. Далее нужно прошить наш контроллер. Для этого нужен софт. Качаем с оффсайта ардуино последнюю версию Arduino IDE https://www.arduino.cc/en/software . Я использую портативную версию для windows - "Windows ZIP file" . Она не требует установки, просто распаковать из архива, и готово, можно пользоваться.
4. Настраиваем IDE под наш контроллер. Меню - инструменты - плата: - Arduino Micro, либо Leonardo в зависимости от того что там у вас. Меню - инструменты - порт: - выбираем порт к которому подключен контроллер.
5. Все, можно загружать скетч. Берем тот что я написал, либо пишите свой. Мой:
--- Code: (clickermann) ---#include <Mouse.h>
#include <Keyboard.h>
unsigned long par = 0;
String instring = "";
int kmfunct = 0;
int x_cor = 0;
int y_cor = 0;
int mult = 0;
int inchar = 0;
void setup() {
Serial.begin(9600);
Mouse.begin();
Keyboard.begin();
}
void loop() {
while(Serial.available() > 0){
inchar = Serial.read();
if (isDigit(inchar)) {
instring += (char)inchar;
}
}
par = instring.toInt();
instring = "";
if (par > 0) {
kmfunct = par/16777216 ;
switch (kmfunct) {
case 1: //Mouse.click
Mouse.click(par - kmfunct*16777216);
break;
case 2: // Mouse.move
x_cor = (par - kmfunct*16777216)/256;
y_cor = par - x_cor*256 - kmfunct*16777216;
if (x_cor > 127) x_cor = 127 - x_cor;
if (y_cor > 127) y_cor = 127 - y_cor;
Mouse.move(x_cor, y_cor, 0);
break;
case 3: //Mouse.press
Mouse.press(par - kmfunct*16777216);
break;
case 4: //Mouse.release
Mouse.release(par - kmfunct*16777216);
break;
case 5: //Mouse.dblclick
Mouse.click(par - kmfunct*16777216);
delay(50);
Mouse.click(par - kmfunct*16777216);
break;
case 6: //wheel.down.up
mult = par - kmfunct*16777216;
if (mult > 127) mult = 127 - mult;
Mouse.move(0, 0, mult);
case 7: // Keyboard.keydown
Keyboard.press(par - kmfunct*16777216);
break;
case 8: // Keyboard.keyup
Keyboard.release(par - kmfunct*16777216);
break;
case 9: // Keyboard.keypress
Keyboard.write(par - kmfunct*16777216);
break;
}
}
par = 0;
}
--- End code ---
Копируете и вставляете в редактор arduino. Жмете кнопку "проверить", пойдет компиляция скетча. После завершения в логе будет что-то типа
--- Quote ---Скетч использует 7426 байт (25%) памяти устройства. Всего доступно 28672 байт.
Глобальные переменные используют 265 байт (10%) динамической памяти, оставляя 2295 байт для локальных переменных. Максимум: 2560 байт.
--- End quote ---
Значит все отлично, жмем кнопку "загрузка" и ждем пока скетч загрузится в контроллер. Если все в норме, то по итогу в логе будет: загрузка завершена, и тоже самое что и после проверки.
6. Контроллер готов и ждет команды из COM порта. Для отправки сообщения в наш порт я написал DLL библиотеку "micro_com.dll". Берем во вложении первого поста, либо вот с ядиска https://disk.yandex.ru/d/YuMXDEFLhWiD6A . Качаем (либо копируем) библиотеку с процедурами мыши и клавиатуры для Clickermann "Arduino_mouse_keyboard.cms" , во вложении, либо код из поста выше, либо с ядиска https://disk.yandex.ru/d/kmqlsabjb4RJvg . Кидаем эти два файла в одну папку. Открываем "Arduino_mouse_keyboard.cms" и прописываем в переменную $com номер порта, к которому подключена ардуина.
7. Создаем наш основной скрипт, либо редактируем уже существующий. Подключаем в него "Arduino_mouse_keyboard.cms".
--- Code: (clickermann) ---#include "Arduino_mouse_keyboard.cms"
--- End code ---
Все процедуры, которые я пока написал:
Клавиатурные действия пока будут работать только на бета версии v4.14.003 beta x32 http://crapware.aidf.org/forum/index.php?topic=356.0 . В будущем напишу чтоб работали на старших версиях.
Будущее:
Обновленная библиотека для всех версий (кроме х64) в этом посте http://crapware.aidf.org/forum/index.php?topic=5529.msg36250#msg36250 , берем оттуда и пользуемся клавиатурой полноценно!!!
--- Code: (текст) ---//micro_move ($x_cor, $y_cor)
//micro_lclick ($x_cor, $y_cor)
//micro_rclick ($x_cor, $y_cor)
//micro_mclick ($x_cor, $y_cor)
//micro_ldown ($x_cor, $y_cor)
//micro_rdown ($x_cor, $y_cor)
//micro_mdown ($x_cor, $y_cor)
//micro_lup ($x_cor, $y_cor)
//micro_rup ($x_cor, $y_cor)
//micro_mup ($x_cor, $y_cor)
//micro_dblclick ($x_cor, $y_cor)
//micro_wheeldown ($mult)
//micro_wheelup ($mult)
// вместо $char_ASCII писать не код клавиши, а символ ASCII.
// в ардуино как-то тупо сделали клавиатурные нажатия :/
// пока поддерживают только печатные символы, в будущем добавлю подпрограмму для клавиш-модификаторов.
//micro_keydown ($char_ASCII)
//micro_keyup ($char_ASCII)
//micro_keypress ($char_ASCII)
--- End code ---
Ну и для проверки можно подергать курсором. Пишем к примеру такой код:
--- Code: (clickermann) ---#include "Arduino_mouse_keyboard.cms"
wait(2)
micro_move (100, 100)
wait(2)
micro_move (500, 500)
wait(2)
micro_move (500, 100)
wait(2)
micro_move (100, 100)
halt
--- End code ---
Жмем "применить" и сохраняем скрипт в папку с "micro_com.dll" и "Arduino_mouse_keyboard.cms". Запускаем и смотрим как курсор двигается по прописанным координатам.
8. Радуемся.
Если курсор не двигается, то ищем где мы накосячили. DLL может помочь в этом. Функция из библиотеки возвращает код, сообщая, на каком моменте остановилась работа по общению с COM портом. Если все в норме, функция должна возвратить "5"
--- Code: (clickermann) ---#include "Arduino_mouse_keyboard.cms"
wait(2)
micro_move (100, 100)
print($_return1) //должно быть "5", иначе - пишите в этой теме, и подумаем в чем ошибка.
halt
--- End code ---
Подробно о библиотеках Mouse и Keyboard для ардуино тут - https://doc.arduino.ua/ru/prog/MouseKeyboard либо на оффсайте на английском.
Коды клавиш-модификаторов тут - https://doc.arduino.ua/ru/prog/KeyboardModifiers . Для них нужно будет писать отдельную подпрограмму, либо вызывать индивидуально.
DLL написана для х32 систем, соответственно версия кликермана должна быть х32!!!
Если у вас есть деньги на контроллер, то и пару копеек на развитие проекта не пожалейте. Вон, смотрю место на хостинге походу закончилось :(, вложения не работают. Реквизиты тут http://crapware.aidf.org/page/clickermann .
JacsoN:
так пробывал версию кликера последнюю и к томуже она х64...то уввы не работает потом уже дочитал что только х32......... дополните ваш гайд какой именно версии у вас кликер чтобы вопросов было меньше чтобы можно было повторить
скачал х32 тото я по вашим примерам не то делаю или вы чтото не договорили
возможно система х64 не пускает win10x64
JacsoN:
Так Давайте чтото делать ....... я незнаю с чего начать в моем случает цель научится дружить кликер и ардуино игра пох любая
dramster:
По идее должно работать во всех версиях начиная с v4.0.002, там появился CALL, кроме v4.13 x64 .
Насчет клавиатурных действий я немного не уточнил, да и призабыл, что функция CODE() появилась только в версии v4.14.ххх ::). Так-что для клавиатуры пока можно скачать бету отсюда http://crapware.aidf.org/forum/index.php?topic=356.msg2896#msg2896 . Но мышка должна работать на всех остальных версиях.
Я даже видео записал https://www.youtube.com/watch?v=0n83fGce7nU :
1. качаю кликерман последнюю х32 версию с оффсайта
2. качаю свою длл и библиотеку с подпрограммами в одну папку
3. втыкаю прошитый контроллер и смотрю какой ком порт он использует
4. вписываю в "Arduino_mouse_keyboard.cms" номер порта и сохраняю
5. создаю и сохраняю тестовый скрипт, дописываю проверку ответа функции из длл print($_return1)
6. смотрю как двигается курсор, смотрю в логе ответ функции, он равен пяти, значит запись в ком прошла успешно
Насчет клавы конечно это я лохонулся, не подумал, что мало кто бету использует. Это поправимо, сейчас обдумаю как лучше это сделать (чтоб клава работала на старых версиях).
Готово http://crapware.aidf.org/forum/index.php?topic=5529.msg36250#msg36250 .
Navigation
[0] Message Index
[#] Next page
Go to full version