Excellzone

Forum and disscussions since 2010


You are not connected. Please login or register

View previous topic View next topic Go down Message [Page 1 of 1]

#1


Dieser Skillhack erlaubt es euch, Skills zu benutzen, die der Charakter eigentlich nicht benutzen kann.

Kleine Anleitung:
1. Skillhack.rar im Anhang downloaden und entpacken.
2. Metin2 starten.
3. skillhack.dll (bitte nicht umbenennen!) in den Metin2-Prozess injizieren. Dazu könnt ihr Tools wie Winject benutzen.
4. Wenn ihr nun im Spiel die F5 bzw. F6-Taste drückt, benutzt der Charakter den Skill "Aura des Schwerts" bzw. "Starker Körper", sofern dieser auch erlernt wurde.



Wie kann mein Charakter einen Skill einer anderen Lehre erlernen?

Das ist ganz einfach und dazu sind auch keine Hacks notwendig. Ihr müsst im Chat einfach "/skillup [SkillID]" eingeben. Das [SkillID] müsst ihr natürlich durch die ID des Skills ersetzen, den euer Charakter lernen soll.
Aura des Schwerts SkillID = 4
Starker Körper SkillID = 19
Beispiel:
Code:
/skillup 4
Ihr müsst selbstverständlich Skillpunkte frei haben, damit ihr auch Punkte auf einen Skill setzen könnt. Der Skillpunkt wird dann auch gesetzt, wie als ob man einen Skill auf gewöhnliche Weise erhöht.



Wie kann ich dem Hack einen anderen Skill oder eine andere Taste zuweisen?

Dazu müsst ihr einfach die "config.ini" im Skillhack-Ordner öffnen. "SkillID" bzw. "Key" könnt ihr dann einen anderen Wert zuweisen (z. B. 19 bei SkillID, damit "Starker Körper" anstatt "Aura des Schwerts" benutzt wird).




Kompletter Source-Code:
Spoiler:

Code:
// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
#include "stdafx.h"

void CatchKeystrokes(HWND hWnd);
void LoadConfig();
bool ScanForOffsets();

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
LoadConfig();
ScanForOffsets();
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CatchKeystrokes, NULL, 0, NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Code:
// Metin2 Skillhack.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

void UseSkill(DWORD SkillNumber);

DWORD Offset1 = 0;
DWORD Offset2 = 0;
DWORD SkillID1 = 0;
DWORD SkillID2 = 0;
DWORD SkillID3 = 0;
DWORD SkillID4 = 0;
DWORD SkillID5 = 0;
DWORD Key1 = 0;
DWORD Key2 = 0;
DWORD Key3 = 0;
DWORD Key4 = 0;
DWORD Key5 = 0;

void UseSkill(DWORD SkillNumber)
{
void (__stdcall *InternalSkillCall) (DWORD, DWORD) = (void (__stdcall *)(DWORD,DWORD))Offset1;
__asm
{
mov eax, Offset2
mov ecx, dword ptr ds:[eax]
}
(*InternalSkillCall) (SkillNumber, 0);
}

void CatchKeystrokes(HWND hWnd)
{
bool Key1IsPressed = false;
bool Key2IsPressed = false;
bool Key3IsPressed = false;
bool Key4IsPressed = false;
bool Key5IsPressed = false;
while (true)
{
if (GetAsyncKeyState(Key1) < 0)
{
if ((!Key1IsPressed) && (SkillID1))
{
UseSkill(SkillID1);
}
Key1IsPressed = true;
}
else
Key1IsPressed = false;

if (GetAsyncKeyState(Key2) < 0)
{
if ((!Key2IsPressed) && (SkillID2))
{
UseSkill(SkillID2);
}
Key2IsPressed = true;
}
else
Key2IsPressed = false;

if (GetAsyncKeyState(Key3) < 0)
{
if ((!Key3IsPressed) && (SkillID3))
{
UseSkill(SkillID3);
}
Key3IsPressed = true;
}
else
Key3IsPressed = false;

if (GetAsyncKeyState(Key4) < 0)
{
if ((!Key4IsPressed) && (SkillID4))
{
UseSkill(SkillID4);
}
Key4IsPressed = true;
}
else
Key4IsPressed = false;

if (GetAsyncKeyState(Key5) < 0)
{
if ((!Key5IsPressed) && (SkillID5))
{
UseSkill(SkillID5);
}
Key5IsPressed = true;
}
else
Key5IsPressed = false;

Sleep(1);
}
}

void LoadConfig()
{
char Directory[MAX_PATH];
GetModuleFileName(GetModuleHandle("skillhack.dll"), Directory, MAX_PATH);
DWORD i;
for (i = strlen(Directory); Directory[i] != '\'; i--);
strcpy_s(&Directory[i], MAX_PATH, "\\config.ini");

SkillID1 = GetPrivateProfileInt("Skill1", "SkillID", 0, Directory);
Key1 = GetPrivateProfileInt("Skill1", "Key", 0, Directory);
SkillID2 = GetPrivateProfileInt("Skill2", "SkillID", 0, Directory);
Key2 = GetPrivateProfileInt("Skill2", "Key", 0, Directory);
SkillID3 = GetPrivateProfileInt("Skill3", "SkillID", 0, Directory);
Key3 = GetPrivateProfileInt("Skill3", "Key", 0, Directory);
SkillID4 = GetPrivateProfileInt("Skill4", "SkillID", 0, Directory);
Key4 = GetPrivateProfileInt("Skill4", "Key", 0, Directory);
SkillID5 = GetPrivateProfileInt("Skill5", "SkillID", 0, Directory);
Key5 = GetPrivateProfileInt("Skill5", "Key", 0, Directory);
}

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;
}

bool ScanForOffsets()
{
DWORD Base = 0x00400000;
DWORD SizeOfCode;

DWORD i = Base;
while ((memcmp((void *)i, "PE", 4)) && (i <= Base + 0x1000))
i++;

if (i <= Base + 0x1000)
SizeOfCode = *(DWORD *)(i + 0x1C);

BYTE Signature1[] = {0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C, 0x8B, 0x45, 0x08, 0x56,
0x8B, 0xF1, 0x8B, 0x4D, 0x0C, 0x8D, 0x55, 0xF4, 0x52, 0x89,
0x4D, 0xF9, 0x6A, 0x09, 0x8B, 0xCE, 0xC6, 0x45, 0xF4, 0x34};

BYTE Signature2[] = {0x55, 0x8B, 0xEC, 0x8B, 0x45, 0x0C, 0x56, 0x57, 0x8B, 0x7D,
0x08, 0x8B, 0xF1, 0x8D, 0x0C, 0xBF, 0x8B, 0x94, 0xCE, 0x00,
0x00, 0x00, 0x00, 0x8B, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x50,
0x52, 0xE8};

Offset1 = dwFindPattern(Base + 0x1000, SizeOfCode, Signature1, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
Offset2 = *(DWORD *)(dwFindPattern(Base + 0x1000, SizeOfCode, Signature2, "xxxxxxxxxxxxxxxxxxx????xx????xxx") + 25);

if ((Offset1))
return true;
else
return false;
}



Attached Files
Skillhack.rar

View user profile

View previous topic View next topic Back to top Message [Page 1 of 1]


Permissions in this forum:
You cannot reply to topics in this forum