Salut tout le monde :)
Je vous partage un petit logiciel bien sympa qui permet
de contourner la vérification des ressources ce qui vous permet
de les modifier sans prendre de déconnexion du serveur :3
Un merci au développeur FazeDaFapper, le créateur de ce tool :)
main.cpp
misc.h
GameServerC2S.h
VMTH.h
VMTH.cpp
Code:
#include "misc.h"
#include <process.h> // _beginthread | _endthread
void Init(void*)
{
uintptr_t dwBaseAddress = (DWORD) GetModuleHandle(0);
while (!(*reinterpret_cast<uint32_t*>(dwBaseAddress + 0x16B6140)))
Sleep(10);
GameServerC2S * m_GameServerC2S = *reinterpret_cast<GameServerC2S**>(dwBaseAddress + 0x16B6140);
VT_RMI_MessageSend = (p_VT_RMI_MessageSend)(*(PDWORD**)(&m_GameServerC2S))[3];
VMTH::HookVMTFunction(reinterpret_cast<PDWORD*>(&m_GameServerC2S), reinterpret_cast<DWORD>(&hk_RMI_MessageSend), 3);
_endthread();
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hinstDLL);
_beginthread(&Init, 0, 0);
return TRUE;
}
return FALSE;
}
Code:
#pragma once
#include <Windows.h>
#include "VMTH.h"
#include "GameServerC2S.h"
#define Check_Hash_Key_Value_Req 3122
typedef BOOL(__thiscall* p_VT_RMI_MessageSend)(uintptr_t*, int8_t*, int32_t, int32_t, int32_t, void* , int32_t);
p_VT_RMI_MessageSend VT_RMI_MessageSend;
BOOL __fastcall hk_RMI_MessageSend(uintptr_t * ecx, void * edx, int8_t* a2, int32_t a3, int32_t a4, int32_t a5, void * a6, int32_t RMI_ID)
{
switch(RMI_ID)
{
case Check_Hash_Key_Value_Req:
DWORD Proud_Packet_ByteArray = *reinterpret_cast<DWORD*>(a5 + 0x8);
DWORD Pointer_ByteArray = *reinterpret_cast<DWORD*>(Proud_Packet_ByteArray + 0x8);
uint32_t size = 37;
memcpy((DWORD*)(Proud_Packet_ByteArray + 0xC), &size, sizeof(uint32_t)); // Size
strcpy((char*)(Pointer_ByteArray + 0x5), "a31585229d6e07e16d035e5b7ddf6bad"); // Static Hash
break;
}
return VT_RMI_MessageSend(ecx, a2, a3, a4, a5, a6, RMI_ID);
}
Code:
#pragma once
#include <cstdint>
class GameServerC2S
{
public:
// Thats all we need
virtual void function0();
virtual void function1();
virtual void function2();
virtual bool RMI_MessageSend(int8_t* a2, int32_t a3, int32_t a4, int32_t a5, void * a6, int32_t a7);
};
Code:
#include <windows.h>
using namespace std;
namespace VMTH
{
//===========================================================================//
//==== CountVMTFunctions - Count number of functions inside VMT =============//
//===========================================================================//
UINT CountVMTFunctions ( PDWORD pdwVMT );
//===========================================================================//
//==== SwapWMT - Copy VMT to a new one and then change VMT class pointer ====//
//===========================================================================//
bool SwapVMT ( PDWORD *ppdwClassBase );
//===========================================================================//
//==== ReHookVMT - Update VMT class pointer to an already swapped VMT =======//
//===========================================================================//
bool ReHookVMT ( PDWORD *ppdwClassBase, PDWORD dwNewVMT );
//===========================================================================//
//==== HookVMTFuncion - Hook a function inside VMT ==========================//
//===========================================================================//
bool HookVMTFunction ( PDWORD *ppdwClassBase, DWORD dwNewFunction, UINT uiFunctionIndex );
}
Code:
#include "VMTH.h"
namespace VMTH
{
//===========================================================================//
//==== CountVMTFunctions - Count number of functions inside VMT =============//
//===========================================================================//
UINT CountVMTFunctions ( PDWORD pdwVMT )
{
UINT dwIndex = 0;
for ( dwIndex = 0; pdwVMT [ dwIndex ]; dwIndex++ )
{
if ( IsBadCodePtr ( ( FARPROC ) pdwVMT [ dwIndex ] ) )
{
break;
}
}
return dwIndex;
}
//===========================================================================//
//==== SwapWMT - Copy VMT to a new one and then change VMT class pointer ====//
//===========================================================================//
bool SwapVMT ( PDWORD *ppdwClassBase )
{
PDWORD pdwOldVMT = *ppdwClassBase;
// get vmt size
UINT dwVMTSize = CountVMTFunctions ( pdwOldVMT );
if ( ! dwVMTSize ) { return false; }
// allocate memory for new vmt
PDWORD pdwNewVMT = new DWORD [ dwVMTSize ];
if ( ! pdwNewVMT ) { return false; }
// copy old vmt into new vmt
memcpy ( pdwNewVMT, pdwOldVMT, sizeof ( DWORD ) * dwVMTSize );
// update pointer
*ppdwClassBase = pdwNewVMT;
return true;
}
//===========================================================================//
//==== ReHookVMT - Update VMT class pointer to an already swapped VMT =======//
//===========================================================================//
bool ReHookVMT ( PDWORD *ppdwClassBase, PDWORD dwNewVMT )
{
if
(
*ppdwClassBase
&& dwNewVMT
)
{
*ppdwClassBase = dwNewVMT;
return true;
}
return false;
}
//===========================================================================//
//==== HookVMTFuncion - Hook a function inside VMT ==========================//
//===========================================================================//
bool HookVMTFunction ( PDWORD *ppdwClassBase, DWORD dwNewFunction, UINT uiFunctionIndex )
{
PDWORD pdwVMT = *ppdwClassBase;
if
(
pdwVMT
&& uiFunctionIndex <= CountVMTFunctions ( pdwVMT )
&& uiFunctionIndex >= 0
)
{
pdwVMT [ uiFunctionIndex ] = dwNewFunction;
return true;
}
return false;
}
}
Téléchargez l'archive compressée
Extraire le fichier .dll
Injectez le au lancement du jeu avec un injecteur
Enjoy :)
Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
Source: ep*p
Créateur: FazeDaFapper