Üdv,
Az elmúlt két hét folyamán két dologra jöttem rá a samp_npc.exe nevû fájl kapcsán. Elõször is, hogy fel lehet küldeni az NPC-ket más szerverekre is (nem tudom hogy ez köztudott dolog-e, nekem újdonság volt :) ), a másik pedig, hogy a szerverekhez hasonlóan be tud tölteni pluginokat.
Egyenlõre viszont két problémám is akadt.Elõször is nem mûködik megfelelõen a teszthez írt plugint. Abban biztos vagyok hogy a program betölti viszont nem hívódik meg a belépési pont, sõt egyik funkció sem (ha csak rendes DLL-t írok akkor valószínüleg meghívódik az alapértelmezett belépési pont de azt még nem próbáltam). A másik problémám pedig, hogy egyenlõre fogalmam nincs hogy tudnám hasznosítani ezeket a dolgokat :)
Az oka hogy mindezt megosztom veletek nagyon egyszerû.Tudomásom szerint eddig még nem igazán próbálkozott ilyennel senki viszont ha mégis rájönne valaki azzal akár árthat is bizonyos szervereknek (nevet nem mondok mert félek kihasználnák de lecrasheltek az egyik tesztem során a játékosok többször is) így nem árt védekezni az ilyenek ellen (ha nem is crashelnek le a játékosok akkor is elég sok slotot le tudnak venni a botok)
Elõször is akkor a védekezéshez használható kód:
public OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid));
{
new ip[16];
GetPlayerIP(playerid,ip,16);
if(strcmp(ip,\"127.0.0.1\") != 0) Kick(playerid);
}
}
Az indításhoz használt paraméterek:
-h *ip* -p *port* -n *név* -m *npc miniszkript* -z *szerver jelszava*
Az indításhoz használt kódom:
// samp-npc.cpp : Defines the entry point for the console application.
//
#include \"stdafx.h\"
#include <Windows.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char * ip = new char[16];
int port = 0;
char * pw = new char[16];
int bots = 0;
cout << \"IP: \";
cin >> ip;
cout << \"\\nPORT: \";
cin >> port;
cout << \"\\nPW(\'changeme\' ha nincs): \";
cin >> pw;
if(strcmp(pw,\"changeme\") == 0) pw = \"\";
cout << \"BOTS: \";
cin >> bots;
cout << \"\\nSTART = F12\";
while(!GetAsyncKeyState(VK_F12)) {}
for(int i = 0; i < bots; i++)
{
char params[51];
sprintf(params,\"\\nBOT: -h %s -p %d -n bot_%d -m npc_bare -z %s\",ip,port,i+60,pw);
printf(params);
ShellExecute(NULL,\"open\",\"samp-npc.exe\",params,0,false);
}
cout << \"\\nSTOP = F12 (ha csak kilepsz akkor fenn maradnak a folyamatok)\";
Sleep(500);
while(!GetAsyncKeyState(VK_F12)) {}
system(\"taskkill /IM samp-npc.exe /F\");
return 0;
}
A tesztekhez használt NPC szkriptem:
#include <a_npc>
#pragma library test //amxtest.dll
main()
{
}
public OnRecordingPlaybackEnd() {}
public OnNPCConnect(myplayerid)
{
SetTimer(\"RandomMsg\",10000,true);
}
forward RandomMsg();
public RandomMsg()
{
if(random(100) < 50) return 1;
new msg[][128] =
{
\"Hello there!\",
\"I\'m a talking zombie. Yay!\",
\"Brainzzzz\",
\"Arrrrghh\",
\"Wait, am I a zombie?\",
\"Oh god, what a mess!\",
\"Nananananana, BATMAN!\"
};
SendChat(msg[random(sizeof(msg))]);
return 1;
}
Mûködésképtelen plugin:
#include \"..\\SDK\\amx\\amx.h\"
#include \"..\\SDK\\plugincommon.h\"
#include <fstream>
typedef void (*logprintf_t)(char* format, ...);
logprintf_t logprintf;
extern void *pAMXFunctions;
cell AMX_NATIVE_CALL amxtest(AMX* amx, cell* params)
{
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"amxtest()\");
fclose(fileptr);
logprintf(\"This was printed from the Test plugin! Yay!\");
return 1;
}
PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
{
return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
}
/*
Pawn Implemeter\'s Guide szerint így kéne de sajnos így sem mûködött
int amx_amxtestInit(AMX *amx)
{
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"amx_amxtestInit()\");
fclose(fileptr);
AMX_NATIVE_INFO amxtest_Natives[] =
{
{\"amxtest\", amxtest},
{0, 0}
};
return amx_Register(amx, amxtest_Natives, -1);
}
int amx_amxtestCleanup(AMX *amx)
{
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"amx_amxtestCleannup()\");
fclose(fileptr);
return AMX_ERR_NONE;
}
*/
PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
{
pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
logprintf = (logprintf_t) ppData[PLUGIN_DATA_LOGPRINTF];
logprintf(\" * Test plugin was loaded.\");
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"Load()\");
fclose(fileptr);
return true;
}
PLUGIN_EXPORT void PLUGIN_CALL Unload()
{
logprintf(\" * Test plugin was unloaded.\");
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"Unload()\");
fclose(fileptr);
}
AMX_NATIVE_INFO PluginNatives[] =
{
{\"amxtest\", amxtest},
{0, 0}
};
PLUGIN_EXPORT int PLUGIN_CALL AmxLoad( AMX *amx )
{
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"AmxLoad()\");
fclose(fileptr);
return amx_Register(amx, PluginNatives, -1);
}
PLUGIN_EXPORT int PLUGIN_CALL AmxUnload( AMX *amx )
{
FILE * fileptr;
fileptr = fopen(\"asd.txt\",\"a\");
fprintf(fileptr,\"AmxUnload()\");
fclose(fileptr);
return AMX_ERR_NONE;
}
Hogy megkönnyítsem a tesztelést kicsit belepiszkáltam a samp_npc.exe fájlba, így nem az npcmodes illetve npcmodes/recordings mappákból tölti be a fájlokat hanem közvetlenül a gyökérkönyvtárból. A módosított fájl itt megtalálható: http://solidfiles.com/d/ffff7ca505/
Tesztelve a következõ szervereken:
Fay RPG (egy sem csatlakozott)
See RPG reloaded (max 35 bot csatlakozott de nem spawnoltak (legalábbis nem találkoztam velük),hogy írtak-e a chatbe nem tudom de parancsot tudtak használni, admin/játékosok észre se vették, szerver nem dobálta le õket)
Rough Laugh (max 3 bot csatlakozott és le is spawnoltak, chatbe tudtak írni/parancsot tudtak használni,játékosok nem crasheltek viszont már idegesítette õket a chat floodolása :) )
Egy szerver aminek nem mondom el a nevét (kb 50 bot csatlakozott/le spawnolt,chatbe tudtak írni/parancsot tudtak használni, a szerver elkezdte õket szép sorban ledobálni és úgy az 5. kicknél lecrashelt mindenki)
[/quote]
U.I.: See RPG vezetõségét azóta már tudtommal értesítették a dologról és tettek ellene.
\" post=\"226459\" timestamp=\"1329573236\"]
Én a betámadáskor nem arra gondoltam mikor te kipróbáltad, hanem egy hacker küldött 2ször is npc-ket fel. Ez elleni védekezés könyü, mint mondtam ha valamelyik szerveren alapból nincs npc, akkor beírja ezt [pawn]if(IsPlayerNPC(playerid)){Ban(playerid);}[/pawn]
Az OnPlayerConnect alá.
Amelyik szerveren meg van npc, lekéri a nevét, és ha olyan npc jön fel, amelyneknem az a neve, akkor BAN.
És így fölösleges lenne ez a dolog, de megkell mongyam hasznos a te kódod is.
[/quote]
De a nevet könnyebb hamisítani.
Vagy mondjuk ip címét ellenõrzöd, és ha nem az az ipje ami 127.0.0.1 akkor bann:D
[/quote]
Ez le van írva a leírásban, legelsõ példakód. (Csak kick-el)
\" post=\"226459\" timestamp=\"1329573236\"]
Én a betámadáskor nem arra gondoltam mikor te kipróbáltad, hanem egy hacker küldött 2ször is npc-ket fel. Ez elleni védekezés könyü, mint mondtam ha valamelyik szerveren alapból nincs npc, akkor beírja ezt [pawn]if(IsPlayerNPC(playerid)){Ban(playerid);}[/pawn]
Az OnPlayerConnect alá.
Amelyik szerveren meg van npc, lekéri a nevét, és ha olyan npc jön fel, amelyneknem az a neve, akkor BAN.
És így fölösleges lenne ez a dolog, de megkell mongyam hasznos a te kódod is.
[/quote]
Tudom, hogy nem arra gondoltál viszont ha azután sem védekeztél ellene, hogy szóltam róla az nem az én hibám
Egyébként a név ellenõrzés macerás lehet egy olyan szerveren mondjuk ahol nem egy bizonyos sémát követnek a nevek ezért is egyszerûbb az IP cím ellenõrzése.
SA-MP Team helyébe sírnék, hogy ilyen röhejes módon kijátszották a \"védelmi\" vonalakat.(Ha egyáltalán van...(kv. RakNet ami köztudottan sz*r :D )
[/quote]
Kedves kalcornak írtam üzenetet még múlt héten de nem igazán izgatta...
link=topic=21311.msg226459#msg226459 date=1329573236]De a nevet könnyebb hamisítani.
Én a betámadáskor nem arra gondoltam mikor te kipróbáltad, hanem egy hacker küldött 2ször is npc-ket fel. Ez elleni védekezés könyü, mint mondtam ha valamelyik szerveren alapból nincs npc, akkor beírja ezt [pawn]if(IsPlayerNPC(playerid)){Ban(playerid);}[/pawn]
Az OnPlayerConnect alá.
Amelyik szerveren meg van npc, lekéri a nevét, és ha olyan npc jön fel, amelyneknem az a neve, akkor BAN.
És így fölösleges lenne ez a dolog, de megkell mongyam hasznos a te kódod is.
Vagy mondjuk ip címét ellenõrzöd, és ha nem az az ipje ami 127.0.0.1 akkor bann:D
[/quote]
Ez le van írva a leírásban, legelsõ példakód. (Csak kick-el)
[/quote]
Bocsi nemolvastam, azt elfelejtettem, kihagytam, sry:D
public OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid)) {
new ip_addr_npc[64+1];
new ip_addr_server[64+1];
GetServerVarAsString(\"bind\",ip_addr_server,64);
GetPlayerIp(playerid,ip_addr_npc,64);
if(!strlen(ip_addr_server)) {
ip_addr_server = \"127.0.0.1\";
}
if(strcmp(ip_addr_npc,ip_addr_server,true) != 0) {
// this bot is remote connecting
printf(\"NPC: Got a remote NPC connecting from %s and I\'m kicking it.\",ip_addr_npc);
Kick(playerid);
return 0;
}
printf(\"NPC: Connection from %s is allowed.\",ip_addr_npc);
}
return 1;
}
[/quote]
Ha már 0.3c-nél mellékeltek ilyen filterscriptet akkor õk már tudták hogy lehet csatlakoztatni NPC-ket külsõ IP-címrõl.
Ha választ nem kaptok az egy két hete elküldött levelekre, az azért van mert régebb óta tudnak róla mint ahogy ti észrevettétek.
Ha belegondoltok ez nem éppen hiba hanem egy lehetõség, ugyanis még azt is belehet állítani hogy a szerver melyik ip címekrõl engedélyezzen NPC kapcsolatokat.
Az hogy valakik rosszra használják, az már az õ rossz akarásukat takarja.
Hát röviden csak ennyi.
Nos igen, ha belepiszkálunk még egy kicsit a samp_npc fájlba és módosítjuk a szervernek küldött adatokat úgy, hogy az igazi játékosként érzékeljen akkor fel lehet küldeni botokat, viszont akkor már te sem tudsz igazán védekezni csak ha korlátozod az egy IP-rõl maximálisan csatlakozható játékosok számát, de akkor is feljut pár.A \"nagy\" Kalcor alkalmazása a gl_npcs függvény részlet rossz volt bele, az én egyszerû stock-om, amivel lebannolom az NPC-t ha nem azon a néven jön meg mûködik, és lebannolta :D. csak annyit kell hazsnálni FÖLÖSLEGES a plugin meg ezek.
\" post=\"232339\" timestamp=\"1330540451\"]
Nos igen, ha belepiszkálunk még egy kicsit a samp_npc fájlba és módosítjuk a szervernek küldött adatokat úgy, hogy az igazi játékosként érzékeljen akkor fel lehet küldeni botokat, viszont akkor már te sem tudsz igazán védekezni csak ha korlátozod az egy IP-rõl maximálisan csatlakozható játékosok számát, de akkor is feljut pár.
[/quote]
A \"nagy\" Kalcor alkalmazása a gl_npcs függvény részlet rossz volt bele, az én egyszerû stock-om, amivel lebannolom az NPC-t ha nem azon a néven jön meg mûködik, és lebannolta :D. csak annyit kell hazsnálni FÖLÖSLEGES a plugin meg ezek.
[/quote]
Milyen plugin? :o
link=topic=21311.msg232339#msg232339 date=1330540451]A \"nagy\" Kalcor alkalmazása a gl_npcs függvény részlet rossz volt bele, az én egyszerû stock-om, amivel lebannolom az NPC-t ha nem azon a néven jön meg mûködik, és lebannolta :D. csak annyit kell hazsnálni FÖLÖSLEGES a plugin meg ezek.
Nos igen, ha belepiszkálunk még egy kicsit a samp_npc fájlba és módosítjuk a szervernek küldött adatokat úgy, hogy az igazi játékosként érzékeljen akkor fel lehet küldeni botokat, viszont akkor már te sem tudsz igazán védekezni csak ha korlátozod az egy IP-rõl maximálisan csatlakozható játékosok számát, de akkor is feljut pár.
[/quote]
Milyen plugin? :o
[/quote]
Vagy az a c++-os megoldásod.
\" post=\"232343\" timestamp=\"1330540592\"]
link=topic=21311.msg232339#msg232339 date=1330540451]
Nos igen, ha belepiszkálunk még egy kicsit a samp_npc fájlba és módosítjuk a szervernek küldött adatokat úgy, hogy az igazi játékosként érzékeljen akkor fel lehet küldeni botokat, viszont akkor már te sem tudsz igazán védekezni csak ha korlátozod az egy IP-rõl maximálisan csatlakozható játékosok számát, de akkor is feljut pár.
[/quote]
A \"nagy\" Kalcor alkalmazása a gl_npcs függvény részlet rossz volt bele, az én egyszerû stock-om, amivel lebannolom az NPC-t ha nem azon a néven jön meg mûködik, és lebannolta :D. csak annyit kell hazsnálni FÖLÖSLEGES a plugin meg ezek.
[/quote]
Milyen plugin? :o
[/quote]
Vagy az a c++-os megoldásod.
[/quote]
Szerintem nem írtunk c++-os megoldást védekezéshez
\" post=\"232348\" timestamp=\"1330540781\"]
Jó m1, az a lényeg ,hogy a Kalcor általi gl_npcs függvény sorozat SEMMIT SEM ér. Mindenki úgy csinálja ahogy mondtam: ha az npc nem azon a néven jön fel amit te megadsz egy NPC-dnek akkor BAN. Nálam mûködött.
Dupla hozzászólás automatikusan összefûzve. ( 2012. február 29. - 19:47:13 )
Jah, megtaláltam a hibát miért nem mûködött Kalcor megoldása, de inkább az enyémet használjátok!
[/quote]
Sztem úgy is meglehetne csinni, hogy van 8 npc a szeródon péld.Számolod, hogy hány npc jut fel, és ha a feljutott npc-k értéke nagyobb mint 8 akk kick az npct..Meg a maxips filterscriptet használod úgy, hogy 1 iprõl 1 játékost engedjen fel.
link=topic=21311.msg232348#msg232348 date=1330540781]Sztem úgy is meglehetne csinni, hogy van 8 npc a szeródon péld.Számolod, hogy hány npc jut fel, és ha a feljutott npc-k értéke nagyobb mint 8 akk kick az npct..Meg a maxips filterscriptet használod úgy, hogy 1 iprõl 1 játékost engedjen fel.
Jó m1, az a lényeg ,hogy a Kalcor általi gl_npcs függvény sorozat SEMMIT SEM ér. Mindenki úgy csinálja ahogy mondtam: ha az npc nem azon a néven jön fel amit te megadsz egy NPC-dnek akkor BAN. Nálam mûködött.
Dupla hozzászólás automatikusan összefûzve. ( 2012. február 29. - 19:47:13 )
Jah, megtaláltam a hibát miért nem mûködött Kalcor megoldása, de inkább az enyémet használjátok!
[/quote]
De akkor pl. 2/3 testvér nem tud együtt játszani.
De a nevet hamisíthatják,nem?Ha mondjuk a szervereden alapból nincs npc akkor megcsinálod ,hogyha 1 npc is megy Ban.
Ezt simán ki lehet találni egy kis logikával és felküldik Pistike néven.Ha strcmp-el kérdezed alapból már nincs esély, és ugyebár a samp 2 ugyanolyan nevû játékost nem enged.
Mikor kipróbáltam a szervereden elõször akkor elõbb direkt megnéztem milyen néven játszanak az NPC-k és átírtam mert azt hittem te eleve csak ilyen nevûeket engedsz fel pl Zombie_*sorszam*Akkor még nem is tudtam ,hogy létezik ilyen, azután lett a védelmi rendszer.
Ha valakinek nincsenek npci annak nem bannolni kell õket csak a maxnpc-t 0-ra állítani a szerver konfigjában
\" post=\"232902\" timestamp=\"1330630831\"]
Mikor kipróbáltam a szervereden elõször akkor elõbb direkt megnéztem milyen néven játszanak az NPC-k és átírtam mert azt hittem te eleve csak ilyen nevûeket engedsz fel pl Zombie_*sorszam*
Ha valakinek nincsenek npci annak nem bannolni kell õket csak a maxnpc-t 0-ra állítani a szerver konfigjában
[/quote]
Akkor még nem is tudtam ,hogy létezik ilyen, azután lett a védelmi rendszer.
Én tettem már fel npc-t olyan szerverre ahol 0 volt a maxnpc :D (házi teszt)
[/quote]
Az általam leírt módszerrel nem lehet, azt már másik programmal csináltad nem? :)
link=topic=21311.msg232902#msg232902 date=1330630831]Akkor még nem is tudtam ,hogy létezik ilyen, azután lett a védelmi rendszer.
Mikor kipróbáltam a szervereden elõször akkor elõbb direkt megnéztem milyen néven játszanak az NPC-k és átírtam mert azt hittem te eleve csak ilyen nevûeket engedsz fel pl Zombie_*sorszam*
Ha valakinek nincsenek npci annak nem bannolni kell õket csak a maxnpc-t 0-ra állítani a szerver konfigjában
Én tettem már fel npc-t olyan szerverre ahol 0 volt a maxnpc :D (házi teszt)
[/quote]
Az általam leírt módszerrel nem lehet, azt már másik programmal csináltad nem? :)
[/quote]
Igen az egy program, méghozzá az, amivel támadják a szerverem. Azzal megadhatod az npc-k nevét, pingjét, stb. ha nem adsz meg pinget automatikusan 65 ezer lesz xD