You last visited: Today at 23:01
Advertisement
[Hack]MobPuller (Tapferkeitsumhang-Hack) + Source
Discussion on [Hack]MobPuller (Tapferkeitsumhang-Hack) + Source within the Metin2 Hacks, Bots, Cheats, Exploits & Macros forum part of the Metin2 category.
04/30/2011, 13:05
#1
elite*gold: 190
Join Date: Nov 2008
Posts: 1,670
Received Thanks: 3,365
[Hack]MobPuller (Tapferkeitsumhang-Hack) + Source
Hi,
ich möchte euch meinen MobPuller geben. Er funktioniert wie ein Tapferkeitsumhang, aber er kann bis zu 113 Monster pullen (Tapferkeitsumhang max. 20). Man kann dabei auch laufen und bleibt nicht wie bei Moblock auf einem Punkt.
Der Hack funktioniert auf vielen P-Servern und mit einem Bypass auch auf den offiziellen Servern.
Danken möchte ich noch tim66613 für die Magic-CRC-Pieces.
HowToUse:
1.) In Metin2 in das Charakterauswahlmenü gehen
2.) m2MobPuller.exe starten
3.) In das Metin2-Fenster wechseln und F9 drücken
4.) Mit P die Monster pullen
Die Dateien dürft ihr nicht umbenennen!
Video:
Source-Code (Kompiliert mit Microsoft Visual C++):
Code:
#include "windows.h"
#include <Python.h>
#include "detours.h"
DWORD Offset1 = 0; //mainstream
DWORD Offset2 = 0; //AddPacketData Function
DWORD Offset3 = 0; //AddSignatureByte Function
DWORD Offset4 = 0; //Update Function (MainFunc)
DWORD Offset5 = 0; //RegisterVid Function
void (__stdcall* MainFunc)();
void (__stdcall* RegisterVid)();
bool Key1IsPressed = false;
bool pullmobs = true;
DWORD *vids = new DWORD[1000];
DWORD *nVID = new DWORD[1000];
int nVIDcount = 0;
int VIDcount = 0;
DWORD nhVID = 0;
bool ScanForOffsets();
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
void* GetCallDest(void* addr);
void CatchKeystrokes();
void Hook_MainFunc();
void Hook_RegisterVid();
void SendPullPackets();
int GetInstanceType(long vid);
double GetCharacterDistance(long vid);
void AppendChat(const char *msg);
bool appIsPressed(long Key);
void RefreshVids();
void AddVID();
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
ScanForOffsets();
MainFunc = (void (__stdcall*)())DetourFunction((PBYTE)Offset4, (PBYTE)Hook_MainFunc); //0x00471F50
RegisterVid = (void (__stdcall*)())DetourFunction((PBYTE)Offset5, (PBYTE)Hook_RegisterVid); //0x004A0154
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
bool ScanForOffsets()
{
DWORD Base = 0x00400000;
DWORD SizeOfCode;
DWORD i = Base;
while ((memcmp((void *)i, "PE\0\0", 4)) && (i <= Base + 0x1000))
i++;
if (i <= Base + 0x1000)
SizeOfCode = *(DWORD *)(i + 0x1C);
BYTE Signature1[] = { 0x8B, 0x0D, 0xF4, 0x1C, 0x5F, 0x00, 0x52, 0x50, 0xE8, 0x67,
0x60, 0x00, 0x00, 0xE8, 0x12, 0x7B, 0x12, 0x00, 0x5E};
BYTE Signature2[] = { 0x8B, 0xC1, 0x8B, 0x50, 0x38, 0x8B, 0x48, 0x34, 0x53, 0x8B,
0x5C, 0x24, 0x08, 0x2B, 0xCA, 0x3B, 0xD9};
BYTE Signature3[] = { 0xC2, 0x04, 0x00, 0x8B, 0xCE, 0xE8, 0xB2, 0xCE, 0x0D, 0x00,
0x5E};
BYTE Signature4[] = { 0x83, 0xEC, 0x08, 0x56, 0x8B, 0xF1, 0x8D, 0x44, 0x24, 0x04,
0x50, 0x8D, 0x4C, 0x24, 0x0C, 0x51};
BYTE Signature5[] = { 0x8B, 0x44, 0x24, 0x04, 0x89, 0x81, 0x9C, 0x04, 0x00, 0x00,
0xC2, 0x04, 0x00};
Offset1 = *(DWORD *)(dwFindPattern(Base + 0x1000, SizeOfCode, Signature1, "xx????xxx????x????x") + 2);
Offset2 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature2, "xxxxxxxxxxxxxxxxx");
DWORD Offset3_Address = (dwFindPattern(Base + 0x1000, SizeOfCode, Signature3, "xxxxxx????x") + 6);
Offset3 = reinterpret_cast<DWORD>(GetCallDest((DWORD *)(Offset3_Address - 1)));
Offset4 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature4, "xxxxxxxxxxxxxxxx");
Offset5 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature5, "xxxxxxxxxxxxx") + 4;
if ((Offset1))
return true;
else
return false;
}
void* GetCallDest(void* addr) //by tim66613
{
unsigned char* callDestAddr = reinterpret_cast<unsigned char*>(addr) + 1;
uintptr_t relativeDest = *reinterpret_cast<uintptr_t *>(callDestAddr);
return reinterpret_cast<void*>(uintptr_t(addr) + relativeDest + 5);
}
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(;*szMask;++szMask,++pData,++bMask)
if(*szMask=='x' && *pData!=*bMask )
return false;
return (*szMask) == NULL;
}
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i < dwLen; i++)
if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
return (DWORD)(dwAddress+i);
return 0;
}
void SendPacket(const unsigned char* packetdata, unsigned long len)
{
DWORD dwSendFunc = Offset2;
DWORD dwAddSignatureByte = Offset3;
__asm
{
PUSH packetdata
PUSH len
MOV EAX, Offset1
MOV ECX, DWORD PTR DS:[EAX]
CALL dwSendFunc
MOV EAX, Offset1
MOV ECX, DWORD PTR DS:[EAX]
CALL dwAddSignatureByte
}
}
void Hook_MainFunc()
{
_asm pushad
CatchKeystrokes();
SendPullPackets();
RefreshVids();
__asm popad
return (*MainFunc)();
}
void SendPullPackets()
{
if (pullmobs == false) {return;}
pullmobs = false;
int pulledmobs = 0;
for(int i=0; i <= VIDcount && pulledmobs < 113; i++)
{
if (GetInstanceType(vids[i]) == 0)
{
if (GetCharacterDistance(vids[i]) < 4000)
{
unsigned char buf[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF};
*(DWORD *)(buf + 2) = DWORD(vids[i]);
int size = 8;
SendPacket(buf, size);
delete [] buf;
pulledmobs++;
}
}
}
}
int GetInstanceType(long vid)
{
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyInt_FromLong(vid));
PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("chr"), "GetInstanceType"), args, NULL);
int result = PyInt_AsLong(ret);
Py_DECREF(ret);
Py_XDECREF(args);
return result;
}
double GetCharacterDistance(long vid)
{
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyInt_FromLong(vid));
PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("player"), "GetCharacterDistance"), args, NULL);
double result = PyFloat_AsDouble(ret);
Py_DECREF(ret);
Py_XDECREF(args);
return result;
}
void AppendChat(const char *msg)
{
PyObject* args = PyTuple_New(2);
PyTuple_SetItem(args, 0, PyInt_FromLong(1L));
PyTuple_SetItem(args, 1, PyString_FromString(msg));
PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("chat"), "AppendChat"), args, NULL);
Py_XDECREF(ret);
Py_XDECREF(args);
}
bool appIsPressed(long Key)
{
PyObject* args = PyTuple_New(1);
PyTuple_SetItem(args, 0, PyInt_FromLong(Key));
PyObject* ret = PyObject_Call(PyObject_GetAttrString(PyImport_ImportModule("app"), "IsPressed"), args, NULL);
bool result = PyInt_AsLong(ret);
Py_DECREF(ret);
Py_XDECREF(args);
return result;
}
void CatchKeystrokes()
{
if (appIsPressed(25) == true) //25 == P
{
if ((Key1IsPressed == false) && (pullmobs == false))
{
pullmobs = true;
}
Key1IsPressed = true;
}
else
{
Key1IsPressed = false;
}
}
void Hook_RegisterVid()
{
__asm pushad
__asm MOV nhVID, EAX
AddVID();
__asm popad
return (*RegisterVid)();
}
void RefreshVids()
{
for(int nvi = 0; nvi < nVIDcount; nvi++)
{
if (GetInstanceType(nVID[nvi]) == 0) //Check if vid is monster
{
DWORD *new_vids = new DWORD[1000];
int ni = 0;
for(int i=0; i < 1000; i++)
{
if (GetInstanceType(vids[i]) == 0) //Check if vid is still there
{
new_vids[ni] = vids[i];
ni++;
}
}
new_vids[ni] = nVID[nvi];
VIDcount = ni;
delete [] vids; //delete the old array
vids = &*new_vids; //make vids pointing to the new generated array
}
}
nVIDcount = 0; //reset Vid Count
}
void AddVID()
{
nVID[nVIDcount] = nhVID;
nVIDcount++;
}
Interessant auch für eure eigenen Projekte:
void SendPacket(const unsigned char* packetdata, unsigned long len)
Der Hook in der Main-Func
Die Patterns
Bitte gebt Credits an, wenn ihr was davon benutzt.
Für Schäden (z.B. Bann) übernehme ich keine Haftung.
Wenn bei euch irgendwas mit DETECT_MEMORY_MODIFY kommt, liegt es daran, dass ihr keinen Hackshield-Bypass habt.
Funktioniert momentan nur auf P-Servern!
Auf den offiziellen Servern funktioniert er nur mit einem Hackshield-Bypass, der es euch erlaubt, andere Opcodes in das Hauptmodul zu schreiben, ohne dass ihr gekickt werdet oder der Prozess terminiert wird.
Attached Files
m2MobPuller.rar
(89.4 KB, 5174 views)
04/30/2011, 13:08
#2
elite*gold: 0
Join Date: Aug 2009
Posts: 537
Received Thanks: 144
Hört sich ja ganz gut an =)
Ma schaun ob er auch hält was er verspricht
04/30/2011, 13:09
#3
elite*gold: 0
Join Date: Mar 2011
Posts: 63
Received Thanks: 1
sieht vielversprechend aus :P
wer testet? :>
04/30/2011, 13:17
#4
elite*gold: 0
Join Date: Aug 2009
Posts: 537
Received Thanks: 144
Sobald man Injectet hat Kommt ien geräusch.
Wenn man dann P drückt passiert nix.
04/30/2011, 13:19
#5
elite*gold: 0
Join Date: Feb 2008
Posts: 2,754
Received Thanks: 1,748
Aaaaah. Der Patternhook der Packetfunktion den ich schon ewig gesucht habe aber der irgendwo in den Tiefen meiner Festplatte verschwunden ist
Vieeeeeelen Dank.
€dit:
Warum eigentlich nur 113 Mobs? Gibts da im Clienten eine Begrenzung? Oder wofür?
€dit2:
Achso. Das erklärt natürlich alles. Danke
04/30/2011, 13:20
#6
elite*gold: 0
Join Date: Aug 2009
Posts: 537
Received Thanks: 144
Es funktioniert nicht und wird vom Hackshield erkannt.
04/30/2011, 13:22
#7
elite*gold: 190
Join Date: Nov 2008
Posts: 1,670
Received Thanks: 3,365
Quote:
Originally Posted by
Spearfist
Sobald man Injectet hat Kommt ien geräusch.
Wenn man dann P drückt passiert nix.
drückst du p auch wirklich ingame? der hack ist so programmiert, dass er die tastendrücke nur registriert, wenn du gerade im metinfenster bist (also so, wie wenn man außerhalb des fensters z.B. I für Inventar drückt, nichts passiert).
Und steht im Injector auch Injection Successful?
Quote:
Originally Posted by
Spearfist
Es funktioniert nicht und wird vom Hackshield erkannt.
ohne bypass wird er natürlich erkannt, hatte ich ja geschrieben.
@Coputerfreek:
113 Mobs, weil sonst das Packet zu lang ist und man nen Kick bekommt.
04/30/2011, 13:28
#8
elite*gold: 725
Join Date: Sep 2009
Posts: 1,432
Received Thanks: 1,911
Also mit dem Bypass von v4a wird der trotzdem erkannt.
04/30/2011, 13:31
#9
elite*gold: 190
Join Date: Nov 2008
Posts: 1,670
Received Thanks: 3,365
Quote:
Originally Posted by
Unpublished
Also mit dem Bypass von v4a wird der trotzdem erkannt.
poste mal den link dazu, wahrscheinlich ist das wieder gar kein richtiger bypass.^^
04/30/2011, 13:33
#10
elite*gold: 725
Join Date: Sep 2009
Posts: 1,432
Received Thanks: 1,911
^ ist mit AutoIt geschrieben und führt einfach die bin aus kurz nachdem das Fenster existiert, werden manche Dateien im hshield Ordner gelöscht.
Hab mal .bin in .exe umbenannt klappt auch nicht.
Mit Batch funzt es auch nicht.
04/30/2011, 13:40
#11
elite*gold: 190
Join Date: Nov 2008
Posts: 1,670
Received Thanks: 3,365
Quote:
Originally Posted by
Unpublished
Hab mal .bin in .exe umbenannt klappt auch nicht.
Mit Batch funzt es auch nicht.
Dieser v4a-Mod ist höchstens ein Bypass, der es erlaubt, die pack-files zu modifizieren, aber kein HackShield-Bypass, der es erlaubt, die Binary zu modifizieren.
Die Endung ändern bringt auch garnichts. Sie wird dem Server zwar jede Minute oder so übermittelt, aber ist nicht von Bedeutung für irgendwas.
Und die Batch-Datei ist einfach nur ein Bypass für den Patcher.
Eventuell mache ich demnächst mal einen richtigen Bypass, sodass ihr den Hack auf DE benutzen könnt.
04/30/2011, 13:43
#12
elite*gold: 0
Join Date: Aug 2009
Posts: 537
Received Thanks: 144
Ok danke ich werds nochmal probieren
Edit: Hab mit nem Bypass gestartet.
Injection successful
Drauf geachtet das ich wirklich ingame P drücke
Nichts passiert
04/30/2011, 14:01
#13
elite*gold: 190
Join Date: Nov 2008
Posts: 1,670
Received Thanks: 3,365
Quote:
Originally Posted by
Spearfist
Ok danke ich werds nochmal probieren
Edit: Hab mit nem Bypass gestartet.
Injection successful
Drauf geachtet das ich wirklich ingame P drücke
Nichts passiert
hm komisch mal sehen, ob das problem noch bei anderen auftritt.
vllt. gibt es da irgendwelche probleme mit der python c-api.
04/30/2011, 14:10
#14
elite*gold: 0
Join Date: Mar 2008
Posts: 234
Received Thanks: 26
wenn du den zum laufen bringst bist du ein gott.. <3
04/30/2011, 14:12
#15
elite*gold: 0
Join Date: Mar 2011
Posts: 63
Received Thanks: 1
Quote:
Originally Posted by
Spearfist
Ok danke ich werds nochmal probieren
Edit: Hab mit nem Bypass gestartet.
Injection successful
Drauf geachtet das ich wirklich ingame P drücke
Nichts passiert
genau wie bei mir :P
All times are GMT +1. The time now is 23:02 .