防注册机教程

主要用于解决最近频发注册机攻击问题

首先打开源码 /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); //ZJKEY可以在zjmud.h文件中修改一下,改为自己想要的密匙
    write("ver1.0,"+str+"\n");
    input_to("jiance",ob,str);
}

将jiance函数更改为以下内容 其中加密密匙需要自己更改,也可以直接写ZJKEY

void jiance(string arg,object ob,string str)
{
    if(!arg)
    {
        input_to("jiance",ob,str);
        return;
    }
        if(arg!=(sha1(crypt(ZJKEY,str)+"客户端密匙"+sha1("二次密匙")))){ //将客户端密匙与二次密匙更改为自己的密匙内容,最好加密密匙与二次密匙不同  此加密方式可自行更改。但是要保证与check.php中加密方式相同。
    write("客户端非法\n");
    destruct(ob);
    return;
  }else{
    write("版本验证成功\n");
    ob->set_temp("web_log",1);
    input_to("get_user", ob);
  }

}

游戏源码更改完毕,以下是客户端和客户端后台更改方法。

第一步:打开客户端APP后端代码 www/check.php文件

将此文件内容更改为以下内容

if(!isset($_GET['key'])){ die('参数错误'); }
$key =sha1($_GET['key'].sha1('二次密匙')); //此密匙同样设置为自己的密匙,最好不要与客户端密匙相同
echo $key.PHP_EOL;
 ?>

第二步:使用安卓修改大师或MT文件管理器打开客户端APP,搜索字段:'AP4s3dF5' 并将所有此字段替换为自己的客户端密匙。 保存APP。

服务器 /adm/single/master.c更改:

//文件顶部新建变量
nosave mapping ip_list=([
  "time":0,
  "num":0,
]);
//新建函数
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;
}

//connect中新增
object connect()
{
    object login_ob;
    mixed err;
//需要限制每秒登录N次就将此代码注释去掉

 // 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;
  }
  //一定要写在err = catch(login_ob = new(LOGIN_OB));之前
  //剩余原本代码。
  }

好了,从现在开始就不用担心注册机了

原理就是游戏和客户端第一次通信,会先发送一次数据,发送的数据就是 logind.c中 logon函数里 write("ver1.0,"+str+"\n"); 这个数据。 客户端会截取str的字符串,也就是使用crypt加密后的ZJKEY。
此字符串为ver1.0,$6$bsPUvbXH65sj/L6s$ne9qajPzfsBki0uoAqElucsODeXitdN8j0DWWU0o1W/6KhNW0dnVydDartYuCMuN03lgeh/xANgQRUFsZbL35/ 之类。 ver1.0以后的字符串会随机变化。 客户端截取到此字符串后会将此字符串+客户端密匙 一并上传到check.php中,并发送到游戏内。 check.php收到key后进行二次加密,并返回给客户端加密后的key,客户端发送check加密后的key到游戏内,游戏jiance函数通过对比收到的key是否与自己加密后得到的key相同,来判断是不是自己的客户端,从而防止注册机。

最后: 也有简单一些的方法,可以防止一些技术不达标的初级注册攻击。不过不推荐,既然改那就改到底。 其中 jiance函数内的验证方式和check加密方式必须相同。可以根据需要自己自行更改。比如可以根据当前时间 具体到小时来加密。 千人千面,我只是提供一个思路。 还有最终解决方案,自己注册域名,并使用证书。创建HTTPS连接,将客户端内的IP连接方式全部改为https://域名/check.php? 等此类连接方式,此方式可一劳永逸同时保护自己游戏端口。 希望所有巫师可以共同进步,让mud环境更好。 有需要可联系我:279631638

京ICP备13031296号-4