Üdv.
Hétvégén rám írt Ystee, hogy tudok-e valami jó kis védelmet RakSAMP ellen, mert amiket eddig talált, egyik sem mûködött. Nos, engem érdekelt a téma, ezért hát beszereztem a RakSAMP-ot(forrással...), és elkezdtem tanulmányozni(a forrást). A program nagy részét már értem, mi mit is csinál, így hát nekiálltam elkészíteni egy \"anti-bot\" rendszert hozzá. Elõször gpci-vel próbálkoztam, de hamar kiderült, hogy minden indításnál egy random sztringet generál, amit átad a samp-nak, mint kliens azonosító, ebbõl az irányból tehát nem jártam sikerrel. Ezután elkezdtem nézni, mi alapján lehetne még detektálni, hogy most botról van-e szó. Sajnos arra jutottam, hogy csatlakozáskor még semmibõl, ugyan is ugyanúgy Raknet alapú a program mint a SA:MP, és nagyon jól van összerakva(baromi jól tudja szimulálni, egy rendes kliens csatlakozását), de...
Néztem Network Stat-ot, pozíciókat, ezt-azt.. majd miután ismét a forrásban nézelõdtem, találtam egy \"hibapontot\". Mikor ezt leellenõriztem, a sejtésem helyesnek bizonyult, kedves botunk spawnolásakor nem hívódik meg az OnPlayerSpawn callback. Így már nem is volt nehéz, egy \"anti-RakSAMP\" scriptet írni. Amit még menet közben találtam hozzá, azt még beleírtam, így többféle megoldás is van benne, ezek idõ közben születtek, de ameddig a spawnos dologra nem jöttem rá, addig sajnos ezek nem mûködtek.
A végeredmény ez a script lett
// -------------------------------------------------------------------------- //
// File: antiraksamp.pwn
// Desc: A sscript célja a RakSAMP botok kirugása
// Author: Anthony
// Lic: GNU Public License (http://www.gnu.org)
// -------------------------------------------------------------------------- //
//SA:MP függvénykönyvtár beágyazása
#include <a_samp>
//Forward a timerünknek
forward BotCheck(playerid);
//Változó a timer id-nek
new timer;
// -------------------------------------------------------------------------- //
public OnFilterScriptInit()
{
//Timer elindítása, azonosítójának eltárolása a \'timer\' változóban
timer = SetTimer(\"BotCheck\", 1000, true);
//Tájékozatjuk a szerver tulajt, hogy a script betöltõdött, elindult
printf(\"-------------------------------------\");
printf(\"| Anti-RakSAMP by Anthony - Loaded! |\");
printf(\"-------------------------------------\");
return 1;
}
// -------------------------------------------------------------------------- //
public OnFilterScriptExit()
{
//Timer megsemmisítése
KillTimer(timer);
//Tájékoztatjuk a szerver tulajt, hogy a script leállt
printf(\"---------------------------------------\");
printf(\"| Anti-RakSAMP by Anthony - Unloaded! |\");
printf(\"---------------------------------------\");
return 1;
}
// -------------------------------------------------------------------------- //
public OnPlayerConnect(playerid)
{
//Csatlakozáskor 0-ra állítjuk a PVar-t
SetPVarInt(playerid, \"Spawned\", 0);
return 1;
}
// -------------------------------------------------------------------------- //
public OnPlayerDisconnect(playerid)
{
//Lecsatlakozáskor töröljük a PVar-t
DeletePVar(playerid, \"Spawned\");
return 1;
}
// -------------------------------------------------------------------------- //
public OnPlayerSpawn(playerid)
{
//Beállítjuk a PVar-t
SetPVarInt(playerid, \"Spawned\", 1);
return 1;
}
// -------------------------------------------------------------------------- //
//Timerünk fõ része
public BotCheck()
{
new pname[MAX_PLAYER_NAME];
//For ciklussal végigmegyünk minden lehetséges játékos ID-n
for(new i=0; i < MAX_PLAYERS; i++)
{
//Ellenõrizzük, hogy van-e ilyen játékos
if(IsPlayerConnected(i))
{
//Lekérjük a játékos nevét
GetPlayerName(i, pname, MAX_PLAYER_NAME);
//A STATE csak akkor nem PLAYER_STATE_NONE, ha már lespawnolt a játékos,
//tehát ellenõrizzük, hogy tényleg spawnolt-e
if(GetPlayerState(i) != PLAYER_STATE_NONE && GetPVarInt(i, \"Spawned\") == 0)
{
//Ha ide jutottunk, akkor már 100% hogy bottal van dolgunk, mert
//nem hívódott meg rá az OnPlayerSpawn callback, ezért hát kickeljük
Kick(i);
//Tájékoztatjuk a tulajt, hogy a játékos egy bot volt
printf(\"%s egy BOT... volt.(State)\", pname);
//A ciklust a következõ játékos id-re \"ugrasztjuk\"
continue;
}
//A STATE csak akkor nem PLAYER_STATE_NONE, ha már lespawnolt a játékos,
//ellenõrizzük a CameraMode-t
if(GetPlayerState(i) != PLAYER_STATE_NONE && GetPlayerCameraMode(i) > 100)
{
//Ha ide jutottunk, 99,9% a valószínûsége, hogy bottal van dolgunk
//ezért hát kickeljük
Kick(i);
//Tájékoztatjuk a tulajt, hogy a játékos egy bot volt
printf(\"%s egy BOT... volt.(CameraMode)\", pname);
//A ciklust a következõ játékos id-re \"ugrasztjuk\"
continue;
}
//Létrehozunk 3 float változót
new Float:x, Float:y, Float:z;
//Lekérjük a kamera pozíciót
GetPlayerCameraPos(i, x, y, z);
//A STATE csak akkor nem PLAYER_STATE_NONE, ha már lespawnolt a játékos,
//ellenõrizzük a kamera pozíciót
if(GetPlayerState(i) != PLAYER_STATE_NONE && x == 0.0 && y == 0.0 && z == 0.0)
{
//Ha ide jutottunk, 100% a valószínûsége, hogy bottal van dolgunk,
//mert egy játékosnak sosem lesz 0,0,0 a kamera pozícója (kivéve
// ha mi magunk helyeztük oda), ezért hát kickeljük
Kick(i);
//Tájékoztatjuk a tulajt, hogy a játékos egy bot volt
printf(\"%s egy BOT... volt.(CameraPos)\", pname);
//A ciklust a következõ játékos id-re \"ugrasztjuk\"
continue;
}
//Lekérjük a kamera vektorokat
GetPlayerCameraFrontVector(i, x, y, z);
if(GetPlayerState(i) != PLAYER_STATE_NONE && (x > 1000.0 || y > 1000.0 || z > 1000.0))
{
//Ha ide jutottunk, 100% a valószínûsége, hogy bottal van dolgunk,
//mert egy játékosnak sosem kapunk 1000-nél nagyobb FrontVector
//értéket, ezért hát kickeljük
Kick(i);
//Tájékoztatjuk a tulajt, hogy a játékos egy bot volt
printf(\"%s egy BOT... volt.(CameraFrontVector)\", pname);
//A ciklust a következõ játékos id-re \"ugrasztjuk\"
continue;
}
}
}
}
// -------------------------------------------------------------------------- //
Bizonyíték a mûködésre:
[14:36:57] Loading filterscript \'antiraksamp.amx\'...
[14:36:57] -------------------------------------
[14:36:57] | Anti-RakSAMP by Anthony - Loaded! |
[14:36:57] -------------------------------------
[14:36:57] Loaded 2 filterscripts.
[14:36:57]
----------------------------------
[14:36:57] Running LVDM ~MoneyGrub
[14:36:57] Coded By
[14:36:57] Jax
[14:36:57] ----------------------------------
[14:36:57] Number of vehicle models: 48
[14:37:04] Incoming connection: 127.0.0.1:64259
[14:37:04] [join] Bot1 has joined the server (0:127.0.0.1)
[14:37:07] [part] Bot1 has left the server (0:2)
[14:37:07] Bot1 egy BOT... volt.(State)
[14:37:09] Incoming connection: 127.0.0.1:64260
[14:37:09] [join] Bot1 has joined the server (0:127.0.0.1)
[14:37:10] [part] Bot1 has left the server (0:2)
[14:37:10] Bot1 egy BOT... volt.(State)
[14:37:25] Incoming connection: 127.0.0.1:64261
[14:37:25] [join] Bot1 has joined the server (0:127.0.0.1)
[14:37:26] [part] Bot1 has left the server (0:2)
[14:37:26] Bot1 egy BOT... volt.(State)
[14:37:40] Incoming connection: 127.0.0.1:64262
[14:37:40] [join] Bot1 has joined the server (0:127.0.0.1)
[14:37:40] [part] Bot1 has left the server (0:2)
[14:37:40] Bot1 egy BOT... volt.(State)
[14:37:41] Incoming connection: 127.0.0.1:64263
[14:37:42] [join] Mason_Lovell has joined the server (0:127.0.0.1)
[14:37:55] Incoming connection: 127.0.0.1:62477
[14:37:55] [join] Bot1 has joined the server (1:127.0.0.1)
[14:37:56] [part] Bot1 has left the server (1:2)
[14:37:56] Bot1 egy BOT... volt.(State)
[14:38:10] Incoming connection: 127.0.0.1:62478
[14:38:10] [join] Bot1 has joined the server (1:127.0.0.1)
[14:38:11] [part] Bot1 has left the server (1:2)
[14:38:11] Bot1 egy BOT... volt.(State)
[14:38:25] Incoming connection: 127.0.0.1:62479
[14:38:25] [join] Bot1 has joined the server (1:127.0.0.1)
[14:38:26] [part] Bot1 has left the server (1:2)
[14:38:26] Bot1 egy BOT... volt.(State)
[14:38:40] Incoming connection: 127.0.0.1:62480
[14:38:40] [join] Bot1 has joined the server (1:127.0.0.1)
[14:38:41] [part] Bot1 has left the server (1:2)
[14:38:41] Bot1 egy BOT... volt.(State)
[14:38:55] Incoming connection: 127.0.0.1:62481
[14:38:55] [join] Bot1 has joined the server (1:127.0.0.1)
[14:38:56] [part] Bot1 has left the server (1:2)
[14:38:56] Bot1 egy BOT... volt.(State)
[14:39:10] Incoming connection: 127.0.0.1:53072
[14:39:11] [join] Bot1 has joined the server (1:127.0.0.1)
[14:39:11] [part] Bot1 has left the server (1:2)
[14:39:11] Bot1 egy BOT... volt.(State)
[14:39:25] Incoming connection: 127.0.0.1:53073
[14:39:26] [join] Bot1 has joined the server (1:127.0.0.1)
[14:39:26] [part] Bot1 has left the server (1:2)
[14:39:26] Bot1 egy BOT... volt.(State)
[14:39:41] Incoming connection: 127.0.0.1:53074
[14:39:41] [join] Bot1 has joined the server (1:127.0.0.1)
[14:39:42] [part] Bot1 has left the server (1:2)
[14:39:42] Bot1 egy BOT... volt.(State)
[14:39:56] Incoming connection: 127.0.0.1:51681
[14:39:56] [join] Bot1 has joined the server (1:127.0.0.1)
[14:39:56] [part] Bot1 has left the server (1:2)
[14:39:56] Bot1 egy BOT... volt.(State)
[14:40:09] [part] Mason_Lovell has left the server (0:1)
[14:40:11] Incoming connection: 127.0.0.1:62120
Mason_Lovell az én vagyok, vígan szaladgáltam, miközben a botokat kickelgette a rendszer.
Szerintem ez egyszerûbb:
#define TILTOTT_SERIAL \"DA0E5085558CCACC88ECCA40C4CEC49A9408EEE8\"
native gpci(playerid, const serial[ ], maxlen);
public OnPlayerConnect(playerid)
{
new
gpciserial[128];
gpci(playerid, gpciserial, sizeof(gpciserial));
if(!strcmp(gpciserial, TILTOTT_SERIAL))
{
SetSpawnInfo(playerid, 0, 1, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
GameTextForPlayer(playerid, \"Jajj de kedves vagy, amiert botokat kuldesz fel! :3\", 1000, 3);
BanEx(playerid, \"BOT HASZNÁLAT\");
}
return true;
}
Magyarázat: mivel a bot, nem a hagyományos GTASA.exe-t használja, ezért a serialja más (tehát ha crackelt, ha eredeti, más a serialja).
Szerintem ez egyszerûbb:
#define TILTOTT_SERIAL \"DA0E5085558CCACC88ECCA40C4CEC49A9408EEE8\"
native gpci(playerid, const serial[ ], maxlen);
public OnPlayerConnect(playerid)
{
new
gpciserial[128];
gpci(playerid, gpciserial, sizeof(gpciserial));
if(!strcmp(gpciserial, TILTOTT_SERIAL))
{
SetSpawnInfo(playerid, 0, 1, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
GameTextForPlayer(playerid, \"Jajj de kedves vagy, amiert botokat kuldesz fel! :3\", 1000, 3);
BanEx(playerid, \"BOT HASZNÁLAT\");
}
return true;
}
Magyarázat: mivel a bot, nem a hagyományos GTASA.exe-t használja, ezért a serialja más (tehát ha crackelt, ha eredeti, más a serialja).
Nem mûködik. 0.3e-s RakSAMP-ba folyton változik minden egyes csatlakozáskor a szervernek küldött gpci.
Egyébként Anthony verziója véleményem szerint nagyobb szervereken meglehetõsen nagy laggot okozhat a rengeteg pozíció lekéréssel, végigfutva az összes playeren minden másodpercben...
[/quote]
Lényegében azok csak példák. Külön-külön is mûködnek(kivéve a camera pos, ahhoz el kell telnie kb. 3 mp-nek, mert elsõre nem 0.00 az Y értéke, hanem valami lehetetlen karakter).
Am az én szerveremen pl. OnPlayerUpdate-nél van egy rakat pozíció lekérdezés, távolság lekérdezés, megtett táv lekérdezése, szal ennél sokkal durvább és semmi lagg :)
Drake, most hirtelen lefuttattam párszor:
[16:34:36]
----------------------------------
[16:34:36] Running LVDM ~MoneyGrub
[16:34:36] Coded By
[16:34:36] Jax
[16:34:36] ----------------------------------
[16:34:36] Number of vehicle models: 48
[16:34:54] Incoming connection: 127.0.0.1:62547
[16:34:54] [join] Bot1 has joined the server (0:127.0.0.1)
[16:34:54] GPCI: 88085CD058C59C9CDD8E9DE50C0CCF9EE49A8C4D
[16:34:57] [part] Bot1 has left the server (0:1)
[16:35:00] Incoming connection: 127.0.0.1:61194
[16:35:00] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:00] GPCI: FF9FE5CE0C5CC940D5FA0CE9A98FCE4489C95DD8
[16:35:03] [part] Bot1 has left the server (0:1)
[16:35:06] Incoming connection: 127.0.0.1:61195
[16:35:06] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:06] GPCI: FCCA55EDD995994C8D4454D0EFFE8CC804DFCDD9
[16:35:08] [part] Bot1 has left the server (0:1)
[16:35:10] Incoming connection: 127.0.0.1:61196
[16:35:10] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:10] GPCI: AEE9CC04D04848E4845E9DCEAC4E5EF94D4C8099
[16:35:13] [part] Bot1 has left the server (0:1)
[16:35:21] Incoming connection: 127.0.0.1:61197
[16:35:21] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:21] GPCI: AD9E4E9E5584E4C4E99C8DD9988E4C488CDAAC4
[16:35:25] [part] Bot1 has left the server (0:1)
[16:35:26] Incoming connection: 127.0.0.1:61198
[16:35:26] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:26] GPCI: C4CCE9D9094F5A4C8CA45949DF994EAFEFCCEC94
[16:35:30] [part] Bot1 has left the server (0:1)
[16:35:32] Incoming connection: 127.0.0.1:61199
[16:35:32] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:32] GPCI: ECA9DE994D485A0FD4FDF899C8EC48AC9AC44D5D
[16:35:35] [part] Bot1 has left the server (0:1)
[16:35:37] Incoming connection: 127.0.0.1:61200
[16:35:37] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:37] GPCI: A899EE5FECEE8A5F95C40CCC9458F0CEE50449CD
[16:35:40] [part] Bot1 has left the server (0:1)
[16:35:42] Incoming connection: 127.0.0.1:61201
[16:35:42] [join] Bot1 has joined the server (0:127.0.0.1)
[16:35:42] GPCI: D9A9C9CA04A94AEFA85E9FC08D5DA90EFEDFDE8D
[16:35:45] [part] Bot1 has left the server (0:1)
Remélem, nem haragszol Anthony :3
public OnPlayerConnect(playerid)
{
new
gpciserial[128],
valami[512];
gpci(playerid, gpciserial, sizeof(gpciserial));
new
DB:SERIALS = db_open(\"botserials.db\");
if(SERIALS)
{
new
DBResult:EREDMENY;
format(valami, sizeof(valami), \"SELECT * FROM serialok WHERE serialok = \'%s\'\", gpciserial);
EREDMENY = db_query(SERIALS, valami);
if(db_num_rows(EREDMENY) != 0)
{
SetSpawnInfo(playerid, 0, 1, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
GameTextForPlayer(playerid, \"Jajj de kedves vagy, amiert botokat kuldesz fel! :3\", 1000, 3);
BanEx(playerid, \"BOT HASZNÁLAT\");
}
}
return true;
}
http://www.solidfiles.com/d/4ea45257fe/
Az adatbázis 512db (maximális) bot serial-t tartalmaz, amely alapján kiszûri, hogy bot-e :D