DWORD cshell = (DWORD)GetModuleHandleA( "CShell.dll" );
DWORD weapon = *(DWORD*)( cshell + 0xA65EE8);
std::ofstream file;
file.open("Logger.txt");
for(int i = 0; i < 600; i++) { //You can see later how many weapons there are. Then you can lower the loop.
DWORD wapens = *(DWORD*)(weapon +(4*i));
char * weaponname = (char*)(wapens + 0x0008);
file << "Item number: " << i << " ID: " << hex << i << " Name: " << (LPCTSTR)weaponname << ".\n";
}
file.close();
class CWeapon
{
public:
char _0x0000[10];
char Name[26]; //0x000A
};//Size=0x000E
const void __cdecl add_log( const char *fmt, ... )
{
std::ofstream ofile;
ofile.open( "C:\\WEPLOG.txt", std::ios::app );
va_list va_alist;
char logbuf[ 10024 ] = { 0 };
va_start( va_alist, fmt );
vsnprintf( logbuf + strlen( logbuf ), sizeof( logbuf ) - strlen( logbuf ), fmt, va_alist );
va_end( va_alist );
ofile << logbuf << std::endl;
ofile.close( );
}
DWORD FindPattern( DWORD dwStart, DWORD dwLen, BYTE *pszPatt, char pszMask[ ] )
{
unsigned int i = NULL;
int iLen = strlen( pszMask ) - 1;
for( DWORD dwRet = dwStart; dwRet < dwStart + dwLen; dwRet++ )
{
if( *( BYTE * ) dwRet == pszPatt[ i ] || pszMask[ i ] == '?' )
{
if( pszMask[ i + 1 ] == '\0' )
return( dwRet - iLen );
i++;
}
else i = NULL;
}
return NULL;
}
void getPatterns( DWORD *dwWeaponManager, DWORD *dwMaxWeapons )
{
while( !GetModuleHandle( "ClientFX.fxd" ) )
Sleep( 1 );
MODULEINFO objModInfo;
memset( &objModInfo, 0, sizeof( MODULEINFO ) );
GetModuleInformation( GetCurrentProcess( ), GetModuleHandle( "CShell.dll" ), &objModInfo, sizeof( MODULEINFO ) );
add_log( "CShell( Base: 0x%X , Size: 0x%X )",
objModInfo.lpBaseOfDll, objModInfo.SizeOfImage );
if( !objModInfo.lpBaseOfDll )
return;
DWORD pattWeaponManager = FindPattern( ( DWORD ) objModInfo.lpBaseOfDll, objModInfo.SizeOfImage,
( PBYTE ) "\x8B\x0D\x00\x00\x00\x00\x8B\x04\xB1\xD9\xE8\x68\x00\x00\x00\x00", ( char * ) "xx????xxxxxx????" );
pattWeaponManager = *( DWORD * ) ( pattWeaponManager + 0x02 );
pattWeaponManager = *( DWORD * ) ( pattWeaponManager );
*dwWeaponManager = pattWeaponManager;
DWORD pattMaxWeapons = FindPattern( ( DWORD ) objModInfo.lpBaseOfDll, objModInfo.SizeOfImage,
( PBYTE ) "\x81\xFF\x00\x00\x00\x00\x0F\x8C\x00\x00\x00\x00\x38\x1D\x00\x00\x00\x00", ( char * ) "xx????xx????xx????" );
pattMaxWeapons = *( DWORD * ) ( pattMaxWeapons + 0x02 );
*dwMaxWeapons = pattMaxWeapons;
}
DWORD WINAPI dwWeaponLogger( void * )
{
DWORD dwWeaponManager = 0, dwMaxWeapons = 0;
getPatterns( &dwWeaponManager, &dwMaxWeapons );
add_log( "Logger( WepMgr: 0x%X , MaxWeapons: %i )",
dwWeaponManager, dwMaxWeapons );
while( ( !dwWeaponManager && !dwMaxWeapons ) )
Sleep( 1 );
for( int i = 0; i < ( int ) dwMaxWeapons; i++ )
{
CWeapon *pWeapon = *( CWeapon ** ) ( dwWeaponManager + ( 4 * i ) );
if( pWeapon != 0 )
add_log( "[ %i ] %s", i, pWeapon->Name );
}
return 0;
}


class CWeapon
{
public:
char _0x0000[10]; <--- WHY 10?
char Name[26]; <--- WHY 26?
};//Size=0x000E
1009B371 |. 55 PUSH EBP <- (Parameter) Object ID 1009B372 |. 8D4E 0A LEA ECX,DWORD PTR DS:[ESI+0xA] <- ESI is the base of the weapon. ESI + 0xA is weapon name. 1009B375 |. 51 PUSH ECX <- (Parameter) WeaponName 1009B376 |. 68 60A6CF10 PUSH Dumped2.10CFA660 ; ASCII "WeaponName = %s , objectID = %u" 1009B37B |. FFD0 CALL EAX <- Calls the function
char text[100]; sprintf_s(text, "WeaponName = %s , objectID = %u", WeaponName, ObjectID); //The variable names are illustrative