一、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);
最后由配置、日志、数据库、封禁接口收尾。