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);

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

相关推荐
笨小孩@GF 知行合一1 小时前
易语言-高级应用
数据库·编程·易语言·中文编程
KaiwuDB2 小时前
KaiwuDB 运维实战04:DRBD + KaiwuDB——物联网场景下的低成本数据库高可用方案
运维·数据库·物联网·时序数据库·kaiwudb·aiot·多模数据库
夜雪一千3 小时前
MySQL外键彻底入门:是什么、怎么用、什么时候不该用
数据库·mysql
qq_334466864 小时前
删除SSMS的历史登录记录
数据库·sql
zl_dfq4 小时前
Redis 之 【常见面试题总结】(从数据类型到高可用、缓存一致性全解析)
数据库·redis
龙亘川4 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
kv1105 小时前
Android studio国内开发有关
java·数据库·android studio
哭泣方源炼蛊5 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
余槐i5 小时前
EXPLAIN 显示走了索引查询仍慢:回表与选择性在 500 万行表上拉开 10 倍耗时
数据库·postgresql·性能优化·vacuum·explain