1
Использование / Arduino Micro + clickermann. Обход любых защит. DLL для общения с контроллером!!
« : Февраль 12, 2021, 01:11:04 am »
Не прошло и года, как у меня все-же получилось написать длл для общения с ком портом, а именно с ардуиномикро. По сравнению с командной строкой, работает шустро и незаметно.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:
Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
Библиотека с подпрограммами для кликермана тут:
Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной
.
Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.
Во вложении dll для х32 систем.
При написании никаких дополнительных компонентов для работы с ком не использовал. С ними оказалось намного все сложнее.
Вобщем, пару вечеров, куча статей и форумов, вот первый, и вполне рабочий вариант.
Кто в теме, или вдруг загорится этой темой, код длл делфи10:
Код: 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.
Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
Код: Clickermann
CALL ("micro_com.dll", $com, $val)
Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
Код: 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; }
Библиотека с подпрограммами для кликермана тут:
Код: 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) else END_IF IF($y_dist < 0) else 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
Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной

Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.
Во вложении dll для х32 систем.