一、服务端核心代码修改
1. 修改登录验证流程 (/adm/daemons/logind.c)
logon函数改造
void logon(object ob)
{
string str;
if (BAN_D->is_banned(query_ip_name(ob)) == 1) {
write(ZJTMPSAY"你的地址在本 MUD 不受欢迎。\n");
destruct(ob);
return;
}
write("\n");
str = crypt(ZJKEY,0); // 在zjmud.h中修改ZJKEY为自定义密钥
write("ver1.0,"+str+"\n");
input_to("jiance",ob,str);
}
jiance函数增强验证
void jiance(string arg, object ob, string str)
{
if(!arg) {
input_to("jiance",ob,str);
return;
}
// 注意:需与check.php保持相同加密逻辑
if(arg!=(sha1(crypt(ZJKEY,str)+"客户端密钥"+sha1("二次密钥"))) {
write("客户端非法\n");
destruct(ob);
return;
} else {
write("版本验证成功\n");
ob->set_temp("web_log",1);
input_to("get_user", ob);
}
}
2. 新增IP频率限制 (/adm/single/master.c)
新增全局变量
nosave mapping ip_list=([
"time":0,
"num":0,
]);
IP封禁函数
int ip_kill(string ip) {
if (BAN_D->is_banned(ip) == 1) return 0;
if(ip_list[ip]) {
if(time()-ip_list[ip]["time"]<=1) {
ip_list[ip]["num"]+=1;
if(ip_list[ip]["num"]>3) {
BAN_D->add_site(ip);
write(ZJTMPSAY+"封禁IP\n");
return 0;
}
}
} else {
ip_list[ip]=(["time":0,"num":0]);
}
ip_list[ip]["time"]=time();
return 1;
}
连接控制改造
object connect()
{
object login_ob;
mixed err;
/* 可选:全局登录频率限制
if(time()-ip_list["time"]<=1){
ip_list["num"]+=1;
if(ip_list["num"]>=20) return 0;
}else{
ip_list["num"]=1;
}
ip_list["time"]=time(); */
if(!ip_kill(query_ip_number(this_object()))) return 0;
// 原有代码...
}
二、客户端配套改造方案
1. 后端验证接口 (www/check.php)
<?php
if(!isset($_GET['key'])){ die('参数错误'); }
$key = sha1($_GET['key'].sha1('二次密钥')); // 需与游戏内保持一致
echo $key.PHP_EOL;
?>
2. 客户端APP修改
- 使用MT管理器或安卓修改大师
- 搜索替换字段:
AP4s3dF5→ 自定义客户端密钥 - 重新打包签名
三、安全机制原理解析
验证流程示意图
- 服务端发送:
ver1.0,[crypt加密字符串] - 客户端截取加密字符串
- 提交到check.php进行二次加密
- 返回复合加密结果到游戏服务端
- 服务端验证加密逻辑链
增强建议方案
- 动态密钥:结合当前小时数生成动态密钥
- HTTPS加密:
- 注册专属域名
- 配置SSL证书
- 改造所有连接为
https://域名/check.php
- 多层验证:增加设备指纹验证
四、注意事项
- 确保
jiance函数与check.php加密逻辑完全一致 - 客户端密钥与二次密钥建议采用不同值
- 重要密钥建议定期更换
- 封禁阈值可根据实际攻击情况调整
技术交流QQ:279631638
最后更新:2025年5月21日