Hallo heute hat wieder ein Idioten ein Müll released, der FATALE Folgen für alle 0815 Server hat.
Erstmal sag ich kurz wie das ganze Funktioniert.
Es ist eine Dll(c++ builder) die injected wird in euren Metin2 Prozess.
Diese Dll sucht sich per Findpattern eine stelle nennen wir sie mal SendPacket und mit dieser Funktion kann er Packete an den Server senden wie im Beispiel von ihm: "Schiebeeinenspieler(Spieler, X, Y)" dieses Packet wird von Metin2 in jeglicher art von Kämpfen verwendet wo der Spieler einen anderen schlägt(Combo ende) versendet, damit der Gegner wegfliegt... Serverside.
Der Hack schiebt den Spieler einfach immer weiter bis er in X-Richtung im Minus ist und somit einen kick bekommt vom Server und beim neueinloggen in der Stadt neu startet.
Natürlich kennen wir "alle" das ganze schon lang, aber niemand hat es veröffentlicht, denn jeder wusste wozu das führt.
Jetzt hab ich euch auch noch vorschläge wie ihr den Hack untauglich machen könnt.
1. Anhang downloaden und diese .dll Datei in eure .exe/.bin einbinden(oder in .mix umbennen und in m2 ordner legen), damit sie automatisch geladen wird.(Die Dll prüft einfach ob der Hack läuft und wenn ja dann beendet sich der Client). Ist sehr simpel und sehr leicht zu bypassen)
2. Pattern verändern damit der Hack garnicht erst diese "SendPacket" findet.
3. Cronjob der die sys_err durchsucht nach Namen die sehr oft in so einem String vorkommen: "CInputMain::SyncPosition : invalid packet length %d (name: %s)" und diese dann einfach Permanent bannen. Ich habe keinen Pserver und kann es auch nicht testen deshalb sag ich mal wenn ein Spieler innerhalb 10minuten 100x ivalid packet bekommt bei dieser Funktion ist es ein Benutzer dieses Hacks.
//----- (080FF8A0) --------------------------------------------------------
signed int __cdecl CInputMain__SyncPosition(int a1, int a2, int a3, int a4)
{
signed int result; // eax@1
int v5; // edx@1
int v6; // eax@1
int v7; // eax@3
int v8; // esi@6
int v9; // edx@7
int v10; // eax@8
int v11; // edi@8
int v12; // eax@9
int v13; // ebx@11
int v14; // eax@11
int v15; // ebx@13
int v16; // eax@14
signed int i; // [sp+2Ch] [bp-3Ch]@6
int v18; // [sp+30h] [bp-38h]@6
int v19; // [sp+34h] [bp-34h]@6
unsigned int v20; // [sp+38h] [bp-30h]@2
unsigned int v21; // [sp+3Ch] [bp-2Ch]@2
int v22; // [sp+40h] [bp-28h]@6
v6 = CHARACTER__GetName(a2);
sys_log(1, "SyncPosition %s wSize %d iBytes %d", v6, *(_WORD *)(a3 + 1), a4);
v5 = *(_WORD *)(a3 + 1);
result = -1;
if ( a4 >= v5 )
{
v21 = v5 - 3;
v20 = (v5 - 3) / 0xCu;
if ( v21 == 12 * v21 / 0xC )
{
v8 = a3 + 3;
TEMP_BUFFER__TEMP_BUFFER((int)&v22);
v19 = v22;
v18 = buffer_write_peek(v22);
buffer_write_proceed(v19, 3);
for ( i = 0; i < (signed int)v20; v8 += 12 )
{
v9 = singleton_CHARACTER_MANAGER___ms_singleton;
if ( !singleton_CHARACTER_MANAGER___ms_singleton )
{
__assert("instance", "../../common/singleton.h", 26);
v9 = singleton_CHARACTER_MANAGER___ms_singleton;
}
v10 = CHARACTER_MANAGER__Find(v9, *(_DWORD *)v8);
v11 = v10;
if ( v10 )
{
v12 = (unsigned __int8)CHARACTER__GetCharType(v10);
if ( (unsigned __int8)v12 != 1 )
{
if ( v12 != 3 )
{
v13 = CHARACTER__GetName(v11);
v14 = CHARACTER__GetName(a2);
sys_log(1, "%s: SYNC: %s %d %d cnt %d", v14, v13, *(_DWORD *)(v8 + 4), *(_DWORD *)(v8 + 8), i);
if ( CHARACTER__SetSyncOwner(v11, a2, 1) )
{
CHARACTER__Sync(v11, *(_DWORD *)(v8 + 4), *(_DWORD *)(v8 + 8));
buffer_write(v19, v8, 12);
}
}
}
}
++i;
}
v15 = buffer_size(v19);
if ( v15 != 3 )
{
*(_BYTE *)v18 = 5;
*(_WORD *)(v18 + 1) = v15;
v16 = buffer_read_peek(v19);
CEntity__PacketAround(a2, v16, v15, a2);
}
TEMP_BUFFER___TEMP_BUFFER(&v22);
}
else
{
v7 = CHARACTER__GetName(a2);
sys_err(
(int)"SyncPosition",
1020,
"CInputMain::SyncPosition : invalid packet length %d (name: %s)",
*(_WORD *)(a3 + 1),
v7);
}
result = v21;
}
return result;
}
Ich persöhnlich würde 2. bevorzugen .
Viel Spaß beim Problemlösen und ihr könnt auch gerne eine Statistik machen wieviele Spieler ihr weniger habt, wenn sie sich permanent gegenseitig kicken .
Kann man auch anders beheben aber ich schaue mir mal diese Variante an. Vielleicht ist es mir ja zu nutzen. Danke für den Code werde es mir mal anschauen und den Pseudocode mal Analysieren ob fehler drinne sind.
natürlich , sofern dein server nicht auf pvp oder pvm basiert.
?! Du kannst einfach einen Check einbauen, ob der X oder Y Wert nach dem Bewegen des Charakters im negativen Bereich ist. Wenn dies so ist, soll er einfach nichts tun.
?! Du kannst einfach einen Check einbauen, ob der X oder Y Wert nach dem Bewegen des Charakters im negativen Bereich ist. Wenn dies so ist, soll er einfach nichts tun.
Super, dann steht der char eben auf X: 3 und y: 200
Was bringt das, dann hängt er und kommt nicht mehr raus.
Du verstehst die ganze Funktion nicht also hör bloß auf hier den oberklugen zu spielen, ein Spieler kann nur +-2499 in einem Packet sich bewegen.
Darauf ist das ganze Spiel aufgebaut o.O
Super, dann steht der char eben auf X: 3 und y: 200
Was bringt das, dann hängt er und kommt nicht mehr raus.
Du verstehst die ganze Funktion nicht also hör bloß auf hier den oberklugen zu spielen, ein Spieler kann nur +-2499 in einem Packet sich bewegen.
Darauf ist das ganze Spiel aufgebaut o.O
Wie du es schon beschreibst mit einem Packet ...
Ein Packet 16 Elemente mit jedem Element 25 Koordinaten.
if ( v23 < 25.0 )
Ein Spieler kann sich wesentlich mehr als 2499 koordinaten bewegen denk doch nur an die CHARACTER::Warp Funktion ... in einem Packet joa, aber in mehreren ist das eine ganz andere Sache.
Die Lösung von Profizocker ist gut ... aber man könnte auch einfach SECTREE::GetAttribute nehmen und das mit dem richtigen Flag testen.
Und je nach dem entscheiden ob es gültig ist oder nicht.
Genauso könnte man simpel und einfach SECTREE_MANAGER::GetMovablePosition
benutzen und falls es 0 aus gibt einfach abbrechen.
Du verstehst die ganze Funktion nicht also hör bloß auf hier den oberklugen zu spielen
Ich lachte.
Quote:
Originally Posted by .Nova.
Wie du es schon beschreibst mit einem Packet ...
Ein Packet 16 Elemente mit jedem Element 25 Koordinaten.
if ( v23 < 25.0 )
Ein Spieler kann sich wesentlich mehr als 2499 koordinaten bewegen denk doch nur an die CHARACTER::Warp Funktion ... in einem Packet joa, aber in mehreren ist das eine ganz andere Sache.
Die Lösung von Profizocker ist gut ... aber man könnte auch einfach SECTREE::GetAttribute nehmen und das mit dem richtigen Flag testen.
Und je nach dem entscheiden ob es gültig ist oder nicht.
Genauso könnte man simpel und einfach SECTREE_MANAGER::GetMovablePosition
benutzen und falls es 0 aus gibt einfach abbrechen.
So wie Nova es geschrieben hat, ist es natürlich noch besser.
[Gamersfirst] Admin Kündigt " Anti-Kick " an,stolz weil es nicht geht! 04/30/2011 - WarRock - 25 Replies Hallo,
Ich habe vor kurzem eine Aussage von einem Admin gelesen und damit mir eine Frage gestellt.
WIE Findet ihr Diese Aussage von ihm:
http://s1.directupload.net/images/110430/ow2bkpvy .png"]http://s1.directupload.net/images/11043 0/ow2bkpvy.png
Ich bitte euch die wirkliche Antwort anzuklicken und vil. nochmal hier zu Kommentieren =)
Viel Spass euch allen ^^
Und guckt euch den Schlussatz an: