Code:
DWORD hashTable = 0x59B7CC8; // Address for TeknoMW3 ( 1.4.382 )
DWORD hashTable = 0x5A98A48; // Address for Steam version 1.5.388
long GenerateHashValue( char* CvarName )
{
long dwRet = 0;
char letter = 0;
for( UINT i = 0; i < strlen( CvarName ); i++ )
{
letter = tolower( CvarName[i] );
dwRet += ( long )( letter ) * ( 119 + i );
}
return dwRet & 0x3FF;
}
DWORD Cvar_FindVar( HANDLE hProcess, char* Name )
{
char Cvar[32];
memset( Cvar, 0, 32 );
long hash = GenerateHashValue( Name );
DWORD hashTable = 0x5A98A48;
DWORD dwStruct = ( hashTable + ( 4 * (int)hash ) );
ReadProcessMemory( hProcess, ( PVOID )dwStruct, &dwStruct, 4, 0 );
DWORD dwString = 0;
for( ;; )
{
if( dwString )
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0x48 ), &dwStruct, 4, 0 );
ReadProcessMemory( hProcess, ( PVOID ) dwStruct, &dwString, 4, 0 );
ReadProcessMemory( hProcess, ( PVOID ) dwString, &Cvar, 32, 0 );
if( !dwStruct )
return NULL;
if( !_strcmp( Name, Cvar ) )
return dwStruct;
}
}
typedef struct
{
int argNum;
char cmdName[256];
char cmdArgs[256][256];
char* CombineArgs( )
{
static char Args[ 256 ];
for( int i = 0; i < argNum; i++ )
{
strcat_s( Args, 256, cmdArgs[i] );
if( i != argNum-1 )
strcat_s( Args, 256, " ");
}
return Args;
}
} cmdline_t;
void SplitCommandLine(const char *inCMDLine, cmdline_t *outInfo)
{
memset(outInfo, 0, sizeof(cmdline_t));
int len = strlen(inCMDLine) + 1;
char *cmdbuf = new char[len];
memcpy(cmdbuf, inCMDLine, len);
char *token = strtok(cmdbuf, " ");
while (token != NULL)
{
int tlen = strlen(token) + 1;
if (outInfo->argNum == 0)
memcpy(outInfo->cmdName, token, tlen);
else
memcpy(outInfo->cmdArgs[outInfo->argNum - 1], token, tlen);
token = strtok(NULL, " ");
if (token != NULL) ++outInfo->argNum;
}
}
// --------------------------------------------------------------------------------
char* GetCvarValue( HANDLE hProcess, char* CvarName )
{
static char dwRet[256];
memset( dwRet, 0, 256 );
DWORD dwStruct = Cvar_FindVar( hProcess, CvarName );
if( !dwStruct )
return "";
BYTE Type = 0;
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0x8 ), &Type, 1, 0 );
switch( Type )
{
case TYPE_BOOL:
{
bool val = 0;
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 1, 0 );
sprintf_s( dwRet, 256, "%s", ( val ) ? "1" : "0" );
}
break;
case TYPE_FLOAT:
{
float val = 0.f;
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 4, 0 );
sprintf_s( dwRet, 256, "%g", val );
}
break;
case TYPE_VEC2:
{
float val[2];
memset( val, 0, 8 );
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 8, 0 );
sprintf_s( dwRet, 256, "%g %g", val[0], val[1] );
}
break;
case TYPE_VEC3:
case TYPE_VEC3_2:
{
float val[3];
memset( val, 0, 12 );
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 12, 0 );
sprintf_s( dwRet, 256, "%g %g %g", val[0], val[1], val[2] );
}
break;
case TYPE_VEC4:
{
float val[4];
memset( val, 0, 16 );
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 16, 0 );
sprintf_s( dwRet, 256, "%g %g %g %g", val[0], val[1], val[2], val[3] );
}
break;
case TYPE_INT:
case TYPE_ENUM:
{
int val = 0;
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 4, 0 );
sprintf_s( dwRet, 256, "%i", val );
}
break;
case TYPE_STRING:
{
char val[256];
memset( val, 0, 256 );
DWORD dwPointer = 0;
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &dwPointer, 4, 0 );
ReadProcessMemory( hProcess, ( PVOID )dwPointer, &val, 256, 0 );
sprintf_s( dwRet, 256, "%s", val );
}
break;
case TYPE_COLOR:
{
BYTE color[4];
float flt_color[4];
memset( flt_color, 0, 16 );
memset( color, 0, 4 );
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &color, 4, 0 );
for( int i = 0; i < 4; i++ )
flt_color[i] = ( float )( color[i] * 0.003921568859368563 );
sprintf_s( dwRet, 256, "%g %g %g %g", flt_color[0], flt_color[1], flt_color[2], flt_color[3] );
}
break;
default:
sprintf_s( dwRet, 256, "" );
break;
}
return dwRet;
}
void SetCvar( HANDLE hProcess, char* String )
{
cmdline_t cmdOut;
SplitCommandLine( String, &cmdOut );
DWORD dwStruct = Cvar_FindVar( hProcess, cmdOut.cmdName );
if( !dwStruct )
return;
int NumOfArgs = cmdOut.argNum;
BYTE Type = 0;
ReadProcessMemory( hProcess, ( PVOID )( dwStruct + 0x8 ), &Type, 1, 0 );
switch( Type )
{
case TYPE_BOOL:
{
bool val = ( strcmp( cmdOut.cmdArgs[0], "1" ) == 0 ) ? true : false;
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 1, 0 );
}
break;
case TYPE_FLOAT:
{
float val = (float)atof( cmdOut.cmdArgs[0] );
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 4, 0 );
}
break;
case TYPE_VEC2:
{
if( NumOfArgs >= 2 )
{
float val[2];
memset( val, 0, 8 );
for( int i = 0; i < 2; i++ )
val[i] = (float)atof( cmdOut.cmdArgs[i] );
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 8, 0 );
}
}
break;
case TYPE_VEC3:
case TYPE_VEC3_2:
{
if( NumOfArgs >= 3 )
{
float val[3];
memset( val, 0, 12 );
for( int i = 0; i < 3; i++ )
val[i] = (float)atof( cmdOut.cmdArgs[i] );
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 12, 0 );
}
}
break;
case TYPE_VEC4:
{
if( NumOfArgs >= 4 )
{
float val[4];
memset( val, 0, 16 );
for( int i = 0; i < 4; i++ )
val[i] = (float)atof( cmdOut.cmdArgs[i] );
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 16, 0 );
}
}
break;
case TYPE_ENUM:
case TYPE_INT:
{
int val = atoi( cmdOut.cmdArgs[0] );
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &val, 4, 0 );
}
break;
case TYPE_STRING:
{
void* pMem = VirtualAllocEx( hProcess, NULL, 256, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
WriteProcessMemory( hProcess, pMem, cmdOut.CombineArgs( ), 256, 0 );
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &pMem, 4, 0 );
}
break;
case TYPE_COLOR:
{
BYTE color[4];
memset( color, 0, 4 );
for( int i = 0; i < 4; i++ )
{
color[i] = ( BYTE )( floor(atof(cmdOut.cmdArgs[i]) / 0.00392156862 + 0.5));
}
WriteProcessMemory( hProcess, ( PVOID )( dwStruct + 0xC ), &color, 4, 0 );
}
break;
}
}
USAGE:
// GetCvarValue
printf("CG_Fov Value: %s\n", GetCvarValue( hProcess, "cg_fov" ) );
// SetCvar
// String = CvarName followed my value
SetCvar( hProcess, "cg_fov 80" );
SetCvar( hProcess, "g_ScoresColor_EnemyTeam 1 1 0.7 1" );
// Cvar_FindVar
printf("cg_fov struct is located at 0x%X\n", Cvar_FindVar( hProcess, "cg_fov" ) );