Little-Anti-Cheat源码分析(1)——Little-Anti-Cheat插件简介

一、Little-Anti-Cheat简介

Little Anti-Cheat(Lilac) 是一个基于 SourceMod / SourcePawn 的服务端反作弊插件,面向 Source系(起源引擎系列)游戏。其github地址为:https://github.com/J-Tanzanite/Little-Anti-Cheat

它的特点不是"扫客户端程序",而是通过事件、玩家每 tick 输入、角度历史、ConVar、网络参数来做检测和补丁。程序主入口为scripting/lilac.sp的OnPluginStart函数:

cpp 复制代码
public void OnPluginStart()
{
//...
}

二、Little-Anti-Cheat代码的整体架构

可以把它理解成 4 层:

1.主控层。该层负责识别当前游戏,注册事件Hook,启动定时器,分发到各功能模块。见scripting/lilac.sp的OnPluginStart函数。

2.数据采集层。该层负责在 OnPlayerRunCmd 里记录玩家每tick的:视角、按键、时间、开火行为。见 scripting/lilac.sp的OnPlayerRunCmd函数。

3.检测/补丁层。在该层,aimbot、aimlock、bhop、macro、convar、lerp等模块各自做判断。

4.配置/日志/处罚层。该层负责ConVar 配置、日志输出、数据库记录、调用BaseBans / SourceBans / MaterialAdmin 处罚见scripting/lilac/lilac_config.sp的lilac_config_setup函数。

三、模块

1)核心与基础设施模块

scripting/lilac.sp:主入口。用来识别游戏、注册事件、启动定时器、在 OnPlayerRunCmd 里采集输入并分发检测。

scripting/lilac/lilac_globals.sp:定义了全局常量和共享状态,比如检测阈值、玩家历史缓存、日志缓冲。关键全局数据见scripting/lilac/lilac_globals.sp:145-195:

cpp 复制代码
/* Convars. */
Convar hcvar[CVAR_MAX]; /* ConVar = built in SourceMod  |  Convar = kidfearless's convar_class */
int icvar[CVAR_MAX];
int sv_cheats = 0;
int time_sv_cheats = 0;
int force_disable_bhop = 0;

/* Banlength overwrite. */
int ban_length_overwrite[CHEAT_MAX];

/* Database. */
Database lil_db;
char sql_buffer[1500]; /* It's probably bigger than what you need, but better be safe than sorry I guess. */
char db_name[64]; /* Database config name from hcvar[CVAR_DATABASE]. */

/* Misc. */
int ggame;
int tick_rate;
int macro_max;
int bhop_settings[BHOP_MAX];
int bhop_settings_min[BHOP_MAX];

char line_buffer[2048];
char dateformat[512] = "%Y/%m/%d %H:%M:%S";
char log_file[PLATFORM_MAX_PATH];
float max_angles[3] = {89.01, 0.0, 50.01};
Handle forwardhandle = INVALID_HANDLE;
Handle forwardhandleban = INVALID_HANDLE;
Handle forwardhandleallow = INVALID_HANDLE;

/* External plugins. */
bool sourcebans_exist = false;
bool sourcebanspp_exist = false;
bool materialadmin_exist = false;

/* Logging.
 * Todo: Might wanna move a lot of this variables to
 * their own files if they are only used there.
 * Just so the code gets a lot cleaner. */
int playerinfo_index[MAXPLAYERS + 1];
int playerinfo_buttons[MAXPLAYERS + 1][CMD_LENGTH];
int playerinfo_actions[MAXPLAYERS + 1][CMD_LENGTH];
int playerinfo_aimlock_sus[MAXPLAYERS + 1];
int playerinfo_aimlock[MAXPLAYERS + 1];
float playerinfo_time_bumpercart[MAXPLAYERS + 1];
float playerinfo_time_teleported[MAXPLAYERS + 1];
float playerinfo_time_aimlock[MAXPLAYERS + 1];
float playerinfo_time_process_aimlock[MAXPLAYERS + 1];
float playerinfo_angles[MAXPLAYERS + 1][CMD_LENGTH][3];
float playerinfo_time_usercmd[MAXPLAYERS + 1][CMD_LENGTH];
float playerinfo_time_forward[MAXPLAYERS + 1][CHEAT_MAX];

scripting/lilac/lilac_stock.sp:通用工具函数,比如有效玩家判断、日志辅助、开火判定、客户端重置等。

scripting/lilac/lilac_config.sp:ConVar 配置中心,定义所有 lilac_* 配置项、命令和变更回调。

scripting/lilac/lilac_database.sp:数据库记录模块,把检测结果写入 MySQL / SQLite。

2)战斗行为检测模块

scripting/lilac/lilac_aimbot.sp:普通自瞄检测。在击杀后回溯那一枪前后的视角/开火历史,判断是否存在 snap、autoshoot、repeat、total delta 等特征。

scripting/lilac/lilac_aimlock.sp:锁定型自瞄检测。定时轮询玩家是否突然吸附到敌人身上并持续锁住。

scripting/lilac/lilac_angles.sp:角度作弊检测/修补。主要处理异常 pitch/roll 角度、反背刺类角度问题、基础 anti-aim。

scripting/lilac/lilac_bhop.sp:Bhop 检测。根据连续完美跳、空中时间等规则判定。

scripting/lilac/lilac_macro.sp:宏检测。主要是 auto-jump / auto-shoot 这类脚本输入特征。

scripting/lilac/lilac_anti_duck_delay.sp:Anti-Duck-Delay / FastDuck 检测,这是 CS:GO 专用。

3)客户端状态 / 网络参数检测模块

scripting/lilac/lilac_convar.sp:客户端 ConVar 检查,比如一些不正常/不该开启的客户端变量。README里也把它叫 invalid ConVar detector。

scripting/lilac/lilac_lerp.sp:NoLerp / Max Interp 相关检测和限制。

scripting/lilac/lilac_ping.sp:高 ping / fakelatency 处理,包括高 ping 踢出/短封这种功能。

4)补丁 / 过滤 / 游戏专项模块

scripting/lilac/lilac_backtrack.sp:Backtrack 补丁,修正 tickcount 相关的回溯利用。

scripting/lilac/lilac_string.sp:字符串相关安全过滤。源码里注释写得很明确:String takes care of

chat and names:见scripting/lilac.sp:61。包括 chat clear、非法字符聊天、名字异常/newline 等。

scripting/lilac/lilac_noisemaker.sp:TF2 专用 noisemaker spam 检测。

四、功能类别

如果按"功能类别"看,这个项目大致可以分成:

A. 瞄准/战斗类:Aimbot、Aimlock、Angle cheats、Bhop、Macro、Anti-Duck-Delay

B. 客户端/网络类:Invalid ConVar、NoLerp / Max Interp、Max Ping

C. 文本/字符串安全类:Chat-Clear、Invalid chat characters、Invalid names / names with newlines

D. 补丁类:Angle patch、Backtrack patch

五、运行原理

Little-Anti-Cheat主流程很简单。该插件启动时通过OnPluginStart函数注册事件和定时器,每个 tick 在 OnPlayerRunCmd 通过OnPlayerRunCmd函数采集玩家输入,击杀类检测走 player_death,周期类检测走 timer,比如:ping、lerp、aimlock。定时器注册见 scripting/lilac.sp:165-169:

cpp 复制代码
	CreateTimer(QUERY_TIMER, timer_query, _, TIMER_REPEAT);
	CreateTimer(5.0, timer_check_ping, _, TIMER_REPEAT);
	CreateTimer(5.0, timer_check_lerp, _, TIMER_REPEAT);
	CreateTimer(0.5, timer_check_aimlock, _, TIMER_REPEAT);

最后由配置、日志、数据库、封禁接口收尾。

相关推荐
土狗TuGou1 小时前
SQL内功笔记 · 第5篇:SQL逻辑执行顺序
数据库·笔记·后端·sql·mysql
草莓熊Lotso1 小时前
【LangChain】聊天模型实战:结构化输出完全指南(从原理到落地)
数据库·python·langchain·软件工程
草莓熊Lotso1 小时前
【CMake】静态库的编译、链接与引用全解析
linux·c语言·数据库·c++·软件工程·cmake
程序猿乐锅1 小时前
【MySQL | 第六篇】 SQL 优化
数据库·sql·mysql
j7~1 小时前
【MYSQL】索引特性--详解
数据库·mysql·索引操作·索引的理解·mysql与磁盘·b+树与mysql
ccddsdsdfsdf10 小时前
DBeaver怎么链接mongoDB
数据库·mongodb
丷丩11 小时前
Postgresql基础实践教程(十一)各种Join
数据库·postgresql·join
星夜夏空9911 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
TheRouter12 小时前
AI Agent 记忆体系建设实战:短期、长期与工作记忆的工程实现
数据库·人工智能·oracle