1
Использование / Arduino Micro + clickermann. Обход любых защит. DLL для общения с контроллером!!
« on: February 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:
Code: (clickermann) [Select]
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.
Скомпилированная библиотека уверенно отправляет в нужный порт любой текст. Примерно так:
Code: (clickermann) [Select]
CALL ("micro_com.dll", $com, $val)
Нам же, для управления микрой, нужны только числа. Скетч для контроллера взял старый отсюда http://crapware.aidf.org/forum/index.php?topic=5215.msg34294#msg34294 . Немного доработал его:
Code: (clickermann) [Select]
#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;
}
Библиотека с подпрограммами для кликермана тут:
Code: (clickermann) [Select]
$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
Даже и не уверен, придумают ли защиту от такого аппаратного управления машиной .
Подключайтесь, проверяйте. Я проверил и использовал лишь в одной защищенной древнючей игре MTA_SA. Не смотря на ее древнючесть, они уже давно впилили защиту от кликеров. Сам контроллер не сильно и дорогой, глянул - от 350р. Я вроде еще за 280 когда-то купил.
Во вложении dll для х32 систем.