Há um tempo atrás, briguei com um dos moderadores que pertencia a equipe (não sei se ainda pertence, não me lembro mais quem é), que fez com que eu tomasse raiva do fórum e de toda a sua equipe, por causa de algumas infranções que recebi (realmente mereci, afinal, não estava de acordo com as regras). Assim, deixei-me levar por um lado imaturo, inconseqüente, que levou-me a 'defamar' o fórum e sua equipe. Por isso, nesse tópico, peço minhas sinceras e humildes desculpas aos administradores do fórum e a todos membros que aqui frequentam (mesmo que não estejam por dentro do assunto).
-----------------------------------------------------------------------------------------
Voltando ao objetivo do tópico...
Não possuo mais interesse por MuOnline, estou partindo para outros jogos. Então, pretendo a cada dia, liberar funções/proteções que havia feito para um dos meus projetos que seria vendido e não será mais.
Está é uma possível solução (proteção), contra Trade Hack.
Ao invez de bloquear diversos packets usados pelo WPE Pro, ele verifica se o usuário já está com o trade aberto (caso um novo pedido de trade seja solicitado) e impede que o GameServer processe essa ação, assim, impedindo o Trade Hack.
Óbviamente, existe outros modos, mas esse é um método simples e muito útil.
O código abaixo, foi feito para servidores: 0.96.40, ou como muitos chamam: 97d, mas, o mesmo é compatível com outras versões, porém, o código terá de ser reajustado de acordo com a versão do servidor (Pegar os valores das structs PMSG_TRADE_REQUEST, PMSG_TRADE_RESPONSE caso os valores sejam diferentes e reanalizar as funções solicitação de trade e resposta, para ter certeza que não possui novos argumentos [se possuir, basta adiciona-los na função], e os devidos offsets para hook).
Trade.h:
Código:
#pragma once
#include <Windows.h>
#include <stdio.h>
namespace Network
{
struct PMSG_TRADE_REQUEST
{
PBMSG_HEAD h;
unsigned char NumberH;
unsigned char NumberL;
};
struct PMSG_TRADE_RESPONSE
{
PBMSG_HEAD h;
unsigned char Response;
unsigned char Id[10];
unsigned short Level;
int GuildNumber;
};
class Trade
{
public:
static void Request(PMSG_TRADE_REQUEST* lpMsg, DWORD dwIndex);
static void Response(PMSG_TRADE_RESPONSE* lpMsg, DWORD dwIndex);
};
}
Trade.cpp:
Código:
#include "Trade.h"
namespace Network
{
void Trade::Request(PMSG_TRADE_REQUEST* lpMsg, DWORD dwIndex)
{
WORD szTarget = (WORD)Object[dwIndex].TargetNumber;
if(Object[dwIndex].m_IfState.use == 1 && Object[dwIndex].m_IfState.type == 1 && Object[dwIndex].pTransaction == 1)
{
if(Object[szTarget].Type == 1)
{
return;
}
}
ServerRequestTrade(lpMsg, dwIndex);
}
void Trade::Response(PMSG_TRADE_RESPONSE* lpMsg, DWORD dwIndex)
{
WORD szTarget = (WORD)Object[dwIndex].TargetNumber;
if(Object[dwIndex].m_IfState.use == 1 && Object[dwIndex].m_IfState.type == 1 && Object[dwIndex].pTransaction == 1)
{
if(Object[szTarget].Type == 1)
{
return;
}
}
ServerResponseTrade(lpMsg, dwIndex);
}
}
Hook:
Código:
Hook((DWORD)&Network::Trade::Request, 0x402216);
Hook((DWORD)&Network::Trade::Response, 0x4018E3);
Defines:
Código:
#define ServerRequestTrade ((void(*)(Network::PMSG_TRADE_REQUEST*, DWORD)) 0x41D3B0)
#define ServerResponseTrade ((void(*)(Network::PMSG_TRADE_RESPONSE*, DWORD)) 0x41D990)
Créditos:
Network.