Основной раздел > Использование

Arduino Micro + clickermann. Обход любых защит. DLL для общения с контроллером!!

(1/4) > >>

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