Constant acceleration detector now blocks mouse movement well before

causing a full lockout
USG_1.0
Robert Fisk 6 years ago
parent f1bb58e8c2
commit 418bba1706

@ -41,30 +41,28 @@
//Configure mouse bot detection here: //Configure mouse bot detection here:
#ifdef CONFIG_MOUSE_BOT_DETECT_ENABLED #ifdef CONFIG_MOUSE_BOT_DETECT_ENABLED
//-----------------------------------------------------------
//Adjust these thresholds first to tune mouse bot detection. Lower values = more sensitive
#define MOUSE_BOTDETECT_JUMP_VELOCITY_THRESHOLD 20 //Varies by mouse. Most short jumps are <= 10 velocity
#define MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_LIMIT 30 //10 is ok for most mice. But some mice (or users!) generate longer sequences.
#define MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_CREDIT 80 //Non-constant-acceleration movements can build a credit that will be used before hitting the ACCEL_COUNT limit above. Handy for mice or users that exhibit constant velocity characteristics mid-movement.
#define MOUSE_BOTDETECT_LOCKOUT_JIGGLE_BIN_THRESHOLD 4
//-----------------------------------------------------------
#define MOUSE_BOTDETECT_VELOCITY_MULTIPLIER 10 #define MOUSE_BOTDETECT_VELOCITY_MULTIPLIER 10
#define MOUSE_BOTDETECT_MOVEMENT_STOP_PERIODS 5
//Jump detection stuff //Jump detection stuff
#define MOUSE_BOTDETECT_JUMP_MINIMUM_PERIODS 4 #define MOUSE_BOTDETECT_JUMP_VELOCITY_THRESHOLD 20 //Varies by mouse. Most short jumps are <= 10 velocity
#define MOUSE_BOTDETECT_JUMP_PERIODS 4
//Constant acceleration detection stuff //Constant acceleration detection stuff
#define MOUSE_BOTDETECT_VELOCITY_RESET_TIMEOUT_MS 4000 #define MOUSE_BOTDETECT_CONSTANT_ACCEL_LOCKOUT 100 //Lock when constant acceleration counter reaches this number
#define MOUSE_BOTDETECT_CONSTANT_ACCEL_STOP 10 //Block mouse movements when counter is above this value
#define MOUSE_BOTDETECT_CONSTANT_ACCEL_CREDIT 100 //Non-constant-acceleration movements can build a credit that will be used before hitting the limits above. Handy for mice or users that exhibit constant velocity characteristics mid-movement.
#define MOUSE_BOTDETECT_VELOCITY_RESET_TIMEOUT_MS 3000 //Reset constant acceleration counter when mouse stops for this time
#define MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE 12 #define MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE 12
#define MOUSE_BOTDETECT_VELOCITY_MATCH_BASE 256 #define MOUSE_BOTDETECT_VELOCITY_MATCH_BASE 256
#define MOUSE_BOTDETECT_VELOCITY_MATCH_ERROR 6 #define MOUSE_BOTDETECT_VELOCITY_MATCH_ERROR 6
//Jiggle detection stuff //Jiggle detection stuff
#define MOUSE_BOTDETECT_JIGGLE_STOP_PERIODS 10
#define MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS 20 //20ms per bin #define MOUSE_BOTDETECT_JIGGLE_BIN_WIDTH_MS 20 //20ms per bin
#define MOUSE_BOTDETECT_JIGGLE_BIN_COUNT 50 //50 bins at 20ms = 1 sec coverage, wrapped #define MOUSE_BOTDETECT_JIGGLE_BIN_COUNT 50 //50 bins at 20ms = 1 sec coverage, wrapped
#define MOUSE_BOTDETECT_JIGGLE_BIN_DIVIDER 4 #define MOUSE_BOTDETECT_JIGGLE_BIN_DIVIDER 4
#define MOUSE_BOTDETECT_LOCKOUT_JIGGLE_BIN_THRESHOLD 4
#endif #endif

@ -64,7 +64,7 @@ volatile LockoutStateTypeDef LockoutState = LOCKOUT_STATE_INACTIVE;
//Constant acceleration detection stuff //Constant acceleration detection stuff
uint16_t MouseVelocityHistory[MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE] = {0}; uint16_t MouseVelocityHistory[MOUSE_BOTDETECT_VELOCITY_HISTORY_SIZE] = {0};
int32_t PreviousSmoothedAcceleration = 0; int32_t PreviousSmoothedAcceleration = 0;
int8_t ConstantAccelerationCounter = 0; int32_t ConstantAccelerationCounter = 0;
//Jiggle detection stuff //Jiggle detection stuff
uint8_t MouseStopIntervalBinDrainDivideCount = 0; uint8_t MouseStopIntervalBinDrainDivideCount = 0;
@ -427,8 +427,8 @@ void Upstream_HID_BotDetectMouse(uint8_t* mouseInData)
} }
//Did the mouse stop moving briefly? //Jiggle detection: did the mouse stop moving?
if (moveDelay > ((MOUSE_BOTDETECT_MOVEMENT_STOP_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2))) if (moveDelay > ((MOUSE_BOTDETECT_JIGGLE_STOP_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2)))
{ {
//Is this the start of a new movement? //Is this the start of a new movement?
if (velocity != 0) if (velocity != 0)
@ -458,12 +458,17 @@ void Upstream_HID_BotDetectMouse(uint8_t* mouseInData)
} }
} }
} }
}
//Jump detection: was a movement in progress? //Jump detection: did the mouse stop moving briefly?
if (moveDelay > ((MOUSE_BOTDETECT_JUMP_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2)))
{
//Was a movement in progress?
if (JumpMouseIsMoving) if (JumpMouseIsMoving)
{ {
JumpMouseIsMoving = 0; JumpMouseIsMoving = 0;
if ((LastMouseMoveTime - JumpLastMouseMoveBeginTime) < ((MOUSE_BOTDETECT_JUMP_MINIMUM_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2))) if ((LastMouseMoveTime - JumpLastMouseMoveBeginTime) < ((MOUSE_BOTDETECT_JUMP_PERIODS * HID_FS_BINTERVAL) - (HID_FS_BINTERVAL / 2)))
{ {
if (ConstantAccelerationCounter >= 0) //Ignore jumps if ConstantAccelerationCounter is negative -> a human is using the mouse if (ConstantAccelerationCounter >= 0) //Ignore jumps if ConstantAccelerationCounter is negative -> a human is using the mouse
{ {
@ -513,14 +518,19 @@ void Upstream_HID_BotDetectMouse(uint8_t* mouseInData)
((PreviousSmoothedAcceleration - smoothedAccelerationMatchError) <= newSmoothedAcceleration)) ((PreviousSmoothedAcceleration - smoothedAccelerationMatchError) <= newSmoothedAcceleration))
{ {
ConstantAccelerationCounter++; ConstantAccelerationCounter++;
if (ConstantAccelerationCounter > MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_LIMIT) if (ConstantAccelerationCounter > MOUSE_BOTDETECT_CONSTANT_ACCEL_LOCKOUT)
{ {
Upstream_HID_BotDetectMouse_DoLockout(); Upstream_HID_BotDetectMouse_DoLockout();
} }
else if (ConstantAccelerationCounter >= MOUSE_BOTDETECT_CONSTANT_ACCEL_STOP) //Stop mouse movement if it looks suspiciously constant
{
mouseInData[1] = 0;
mouseInData[2] = 0;
}
} }
else else
{ {
if (ConstantAccelerationCounter > -MOUSE_BOTDETECT_LOCKOUT_CONSTANT_ACCEL_CREDIT) ConstantAccelerationCounter--; if (ConstantAccelerationCounter > -MOUSE_BOTDETECT_CONSTANT_ACCEL_CREDIT) ConstantAccelerationCounter--;
} }
PreviousSmoothedAcceleration = newSmoothedAcceleration; PreviousSmoothedAcceleration = newSmoothedAcceleration;

Loading…
Cancel
Save