Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
131 lines
3.5 KiB
C++
131 lines
3.5 KiB
C++
#ifndef _ANTIHACK_H_
|
|
#define _ANTIHACK_H_
|
|
|
|
#define MAX_HACKCOUNT 5
|
|
|
|
#define HACK0 0
|
|
#define HACK1 0
|
|
#define HACK2 0
|
|
|
|
#define XCHG( dwAddress ) (((DWORD) dwAddress) << 16) | (((DWORD) dwAddress) >> 16)
|
|
|
|
#pragma comment( lib, "version" )
|
|
|
|
#define DECLARE_ANTIHACK() CAntiHack g_AntiHack
|
|
#define USE_ANTIHACK1() g_AntiHack.AntiDebug1();
|
|
#define USE_ANTIHACK2(Func) g_AntiHack.AntiDebug2( XCHG( Func ) );
|
|
#define USE_ANTIHACK3(Inst) g_AntiHack.AntiDebug3( Inst );
|
|
|
|
class CAntiHack
|
|
{
|
|
private:
|
|
char m_szTmp[ MAX_PATH ];
|
|
BOOL (WINAPI *pCall)( HINSTANCE hInstance );
|
|
BOOL m_bAntiHack[ MAX_HACKCOUNT ];
|
|
BOOL m_bWinNT;
|
|
|
|
public:
|
|
CAntiHack()
|
|
{
|
|
for( int i=0; i < MAX_HACKCOUNT; i++ )
|
|
m_bAntiHack[ i ] = TRUE;
|
|
|
|
OSVERSIONINFOEX osv;
|
|
|
|
osv.dwOSVersionInfoSize = sizeof( osv );
|
|
GetVersionEx( (LPOSVERSIONINFO) &osv );
|
|
m_bWinNT = (bool) ( osv.dwPlatformId == VER_PLATFORM_WIN32_NT );
|
|
|
|
HMODULE hKernel;
|
|
|
|
if( NULL == (hKernel = LoadLibrary( DecryptText( "KDPKAG-+&;BA" ))) ) // LoadLibrary( "KERNEL32.DLL" );
|
|
return;
|
|
BOOL (WINAPI *pIsDebuggerPresent)( void );
|
|
pIsDebuggerPresent = GetProcAddress( (HMODULE) hKernel, DecryptText( "IrBb^pa`]iFgYfW_d" ) ); // GetProcAddress( "IsDebuggerPresent" );
|
|
m_bAntiHack[HACK0] = pIsDebuggerPresent();
|
|
FreeLibrary( hKernel );
|
|
}
|
|
|
|
~CAntiHack()
|
|
{
|
|
}
|
|
|
|
void AntiDebug1( void )
|
|
{
|
|
#if USE_ANTIHACK == 1
|
|
if( m_bAntiHack[HACK1] ) {
|
|
MessageBox( NULL, "Please turn your Debugger off!", "ERROR", MB_OK );
|
|
ExitProcess( 0 );
|
|
}
|
|
m_bAntiHack[ HACK1 ] = (CreateFileA( "\\[,YOD=>", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ) != INVALID_HANDLE_VALUE ); // \\.\SICE
|
|
m_bAntiHack[ HACK2 ] = (CreateFileA( "\\[,YJOC<=", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ) != INVALID_HANDLE_VALUE ); // \\.\NTICE
|
|
#endif
|
|
}
|
|
|
|
void AntiDebug2( DWORD dwAddress )
|
|
{
|
|
#if USE_ANTIHACK == 1
|
|
if( m_bAntiHack[ HACK2 ] || m_bAntiHack[ HACK1 ] ) {
|
|
WinExit( EWX_SHUTDOWN | EWX_FORCE );
|
|
}
|
|
#endif
|
|
pCall = (BOOL (WINAPI *)( HINSTANCE )) (XCHG( dwAddress ));
|
|
}
|
|
|
|
BOOL AntiDebug3( HINSTANCE hInstance )
|
|
{
|
|
return pCall( hInstance );
|
|
}
|
|
|
|
protected:
|
|
char *DecryptText( char *lpData )
|
|
{
|
|
strcpy( m_szTmp, lpData );
|
|
Decrypt( (unsigned char *) m_szTmp, (DWORD) strlen( m_szTmp ) );
|
|
return m_szTmp;
|
|
}
|
|
bool Encrypt( unsigned char *lpData, DWORD dwLength )
|
|
{
|
|
for( int i=0; i < (int) dwLength; i++ )
|
|
*(lpData + i) -= i;
|
|
return true;
|
|
}
|
|
bool Decrypt( unsigned char *lpData, DWORD dwLength )
|
|
{
|
|
for( int i=0; i < (int) dwLength; i++ )
|
|
*(lpData + i) += i;
|
|
return true;
|
|
}
|
|
BOOL SetPrivilege( unsigned char *name, BOOL bEnable )
|
|
{
|
|
BOOL bResult = FALSE;
|
|
HANDLE hToken;
|
|
DWORD dwRetLen;
|
|
TOKEN_PRIVILEGES tpToken, tpPrev;
|
|
|
|
OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );
|
|
tpToken.PrivilegeCount = 1;
|
|
if( LookupPrivilegeValue( NULL, (LPCSTR) name, &(tpToken.Privileges[0].Luid) ) == TRUE ) {
|
|
if( bEnable )
|
|
tpToken.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
else
|
|
tpToken.Privileges[0].Attributes = 0;
|
|
dwRetLen = 0;
|
|
bResult = AdjustTokenPrivileges( hToken, FALSE, &tpToken, sizeof( tpPrev ), &tpPrev, &dwRetLen );
|
|
}
|
|
CloseHandle( hToken );
|
|
return bResult;
|
|
}
|
|
|
|
bool WinExit( DWORD dwFlags )
|
|
{
|
|
if( SetPrivilege( (unsigned char *) "SeShutdownPrivilege", TRUE ) ) {
|
|
ExitWindowsEx( dwFlags, 0 );
|
|
SetPrivilege( (unsigned char *) "SeShutdownPrivilege", FALSE );
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
#endif
|