aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKittenPopo <Pokeberry123@gmail.com>2022-06-22 04:33:22 -0700
committerGitHub <noreply@github.com>2022-06-22 12:33:22 +0100
commitd9328a186e686e15f11e947ef9fa76d113d79db5 (patch)
treea1d4a2dba002e9fc1bc91d4a14bc92f693b53e62
parentc64a0d148f5fcfe7fee50dcc6414348143898ab6 (diff)
downloadNorthstarLauncher-d9328a186e686e15f11e947ef9fa76d113d79db5.tar.gz
NorthstarLauncher-d9328a186e686e15f11e947ef9fa76d113d79db5.zip
Fix rejection of legitimately-invalid UserCmds (#203)v1.8.2-rc1
-rw-r--r--NorthstarDedicatedTest/ExploitFixes.cpp95
1 files changed, 25 insertions, 70 deletions
diff --git a/NorthstarDedicatedTest/ExploitFixes.cpp b/NorthstarDedicatedTest/ExploitFixes.cpp
index 19b323c8..9abc6b66 100644
--- a/NorthstarDedicatedTest/ExploitFixes.cpp
+++ b/NorthstarDedicatedTest/ExploitFixes.cpp
@@ -20,36 +20,15 @@ ConVar* ns_exploitfixes_log;
return false; \
}())
-// Make sure 3 or less floats are valid
-bool ValidateFloats(float a, float b = 0, float c = 0)
+struct Float3
{
- return !isnan(a) && !isnan(b) && !isnan(c);
-}
-
-struct Vector
-{
- float x, y, z;
-
- Vector(float x = 0, float y = 0, float z = 0) : x(x), y(y), z(z) {}
+ float vals[3];
- bool IsValid()
+ void MakeValid()
{
- return ValidateFloats(x, y, z);
- }
-};
-
-struct Angle
-{
- float pitch, yaw, roll;
-
- Angle(float pitch = 0, float yaw = 0, float roll = 0) : pitch(pitch), yaw(yaw), roll(roll) {}
-
- bool IsInvalid()
- {
- if (!ValidateFloats(pitch, yaw, roll))
- return false;
-
- return (pitch > 90 || pitch < -90) || (yaw > 180 || yaw < -180) || (roll > 180 || roll < -180);
+ for (auto& val : vals)
+ if (isnan(val))
+ val = 0;
}
};
@@ -229,11 +208,11 @@ KHOOK(ReadUsercmd, ("server.dll", "4C 89 44 24 ? 53 55 56 57"), void, __fastcall
DWORD command_number;
DWORD tick_count;
float command_time;
- Angle worldViewAngles;
+ Float3 worldViewAngles;
BYTE gap18[4];
- Angle localViewAngles;
- Angle attackangles;
- Vector move;
+ Float3 localViewAngles;
+ Float3 attackangles;
+ Float3 move;
DWORD buttons;
BYTE impulse;
short weaponselect;
@@ -241,8 +220,8 @@ KHOOK(ReadUsercmd, ("server.dll", "4C 89 44 24 ? 53 55 56 57"), void, __fastcall
BYTE gap4C[24];
char headoffset;
BYTE gap65[11];
- Vector cameraPos;
- Angle cameraAngles;
+ Float3 cameraPos;
+ Float3 cameraAngles;
BYTE gap88[4];
int tickSomething;
DWORD dword90;
@@ -257,31 +236,19 @@ KHOOK(ReadUsercmd, ("server.dll", "4C 89 44 24 ? 53 55 56 57"), void, __fastcall
std::string BLOCK_PREFIX =
"ReadUsercmd (command_number delta: " + std::to_string(cmd->command_number - fromCmd->command_number) + "): ";
- if (cmd->worldViewAngles.IsInvalid())
- {
- BLOCKED_INFO("CMD has invalid worldViewAngles");
- goto INVALID_CMD;
- }
-
- if (cmd->attackangles.IsInvalid())
- {
- BLOCKED_INFO("CMD has invalid attackangles");
- goto INVALID_CMD;
- }
+ // Fix invalid player angles
+ cmd->worldViewAngles.MakeValid();
+ cmd->attackangles.MakeValid();
+ cmd->localViewAngles.MakeValid();
- if (cmd->localViewAngles.IsInvalid())
- {
- BLOCKED_INFO("CMD has invalid localViewAngles");
- goto INVALID_CMD;
- }
+ // Fix invalid camera angles
+ cmd->cameraPos.MakeValid();
+ cmd->cameraAngles.MakeValid();
- if (cmd->cameraAngles.IsInvalid())
- {
- BLOCKED_INFO("CMD has invalid cameraAngles");
- goto INVALID_CMD;
- }
+ // Fix invaid movement vector
+ cmd->move.MakeValid();
- if (cmd->frameTime <= 0 || cmd->tick_count == 0 || cmd->command_time <= 0)
+ if (cmd->tick_count == 0 || cmd->command_time <= 0)
{
BLOCKED_INFO(
"Bogus cmd timing (tick_count: " << cmd->tick_count << ", frameTime: " << cmd->frameTime
@@ -289,26 +256,14 @@ KHOOK(ReadUsercmd, ("server.dll", "4C 89 44 24 ? 53 55 56 57"), void, __fastcall
goto INVALID_CMD; // No simulation of bogus-timed cmds
}
- if (!cmd->move.IsValid())
- {
- BLOCKED_INFO("Invalid move vector");
- goto INVALID_CMD;
- }
-
- if (!cmd->cameraPos.IsValid())
- {
- BLOCKED_INFO("Invalid cameraPos"); // IIRC this can crash spectating clients or anyone watching replays
- goto INVALID_CMD;
- }
-
return;
-INVALID_CMD:
+INVALID_CMD:
// Fix any gameplay-affecting cmd properties
// NOTE: Currently tickcount/frametime is set to 0, this ~shouldn't~ cause any problems
- cmd->worldViewAngles = cmd->localViewAngles = cmd->attackangles = cmd->cameraAngles = Angle(0, 0, 0);
+ cmd->worldViewAngles = cmd->localViewAngles = cmd->attackangles = cmd->cameraAngles = {0, 0, 0};
cmd->tick_count = cmd->frameTime = 0;
- cmd->move = cmd->cameraPos = Vector(0, 0, 0);
+ cmd->move = cmd->cameraPos = {0, 0, 0};
cmd->buttons = 0;
cmd->meleetarget = 0;
}