// Just_a_Test.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
BOOL FindProcessByName( TCHAR* name, PROCESSENTRY32 &entry )
{
entry.dwSize = sizeof( entry );
HANDLE hTlHelp = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, GetCurrentProcessId() );
if( Process32First( hTlHelp, &entry ) )
{
if( !_tcscmp( entry.szExeFile, name ) )
{
return TRUE;
}
while( Process32Next( hTlHelp, &entry ) )
{
if( !_tcscmp( entry.szExeFile, name ) )
{
return TRUE;
}
}
}
if( hTlHelp != INVALID_HANDLE_VALUE )
{
CloseHandle( hTlHelp );
}
return FALSE;
}
BOOL FindModule( TCHAR* name, DWORD dwProcID, MODULEENTRY32 &entry )
{
HANDLE hTlHelp = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcID );
ZeroMemory( &entry, sizeof( entry ) );
entry.dwSize = sizeof( MODULEENTRY32 );
if( Module32First( hTlHelp, &entry ) )
{
if( !_tcscmp( entry.szModule, name ) )
{
return TRUE;
}
while( Module32Next( hTlHelp, &entry ) )
{
if( !_tcscmp( entry.szModule, name ) )
{
return TRUE;
}
}
}
if( hTlHelp != INVALID_HANDLE_VALUE )
{
CloseHandle( hTlHelp );
}
return FALSE;
}
enum ConsoleColors
{
Color_Blue = 9,
Color_Green = 10,
Color_Red = 12,
Color_Yellow = 14,
Color_White = 15
};
void SetConsoleColor( ConsoleColors color )
{
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), color );
}
void DrawNewLines( int count )
{
if( count > 0 )
{
while( count-- )
{
std::cout << "\n";
}
}
}
DWORD FindSignature( UCHAR* chSig, UCHAR* chModule, DWORD dwModuleSize, DWORD dwSigLen )
{
UCHAR *chMod = chModule;
while( chMod < chModule + dwModuleSize - dwSigLen )
{
if( memcmp( chMod, chSig, dwSigLen ) == NULL )
{
return chMod - chModule;
}
chMod++;
}
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*enum HackTypes { Hack_InfiniteAmmo, Hack_NoAmmo };
bool bUseHacks = true;
bool bHacks[sizeof(HackTypes) / sizeof( int )];
if( bUseHacks )
{
bHacks[ Hack_InfiniteAmmo ] = true;
bHacks[ Hack_NoAmmo ] = true;
}*/
bool bUnlimAmmo = true;
bool bNoAmmo = true;
SetConsoleColor( Color_Blue );
std::cout << "Vietcong Hack Status: ";
PROCESSENTRY32 ProcEntry;
if( FindProcessByName( L"vietcong.exe", ProcEntry ) )
{
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, ProcEntry.th32ProcessID );
MODULEENTRY32 mEntry;
if( FindModule( L"game.dll", ProcEntry.th32ProcessID, mEntry ) )
{
SetConsoleColor( Color_Green );
std::wcout << L"[LOADED]";
UCHAR *iModule = new UCHAR[mEntry.modBaseSize];
ReadProcessMemory( hProcess, mEntry.modBaseAddr, iModule, mEntry.modBaseSize, NULL);
UCHAR chSig[] = { 0x81, 0xEC, 0x28, 0x02, 0x00, 0x00, 0x53, 0x55, 0x56, 0x57, 0x68, 0x54 };
int iIFaceOffset = FindSignature( chSig, (UCHAR*)iModule, mEntry.modBaseSize, sizeof( chSig ) );
if( iIFaceOffset > 0 )
{
UCHAR chUnlimAmmoSig[] = { 0x66, 0x29, 0x5C, 0x7E };
int iUnlimAmmoOffs = FindSignature( chUnlimAmmoSig, (UCHAR*)(iModule + iIFaceOffset), mEntry.modBaseSize - iIFaceOffset, sizeof( chUnlimAmmoSig ) );
if( iUnlimAmmoOffs > 0 )
{
UCHAR chAmmoPatch[] = { 0x83, 0x6C, 0x7E, 0x3C, 0x00 };
DWORD dwOldProtect;
VirtualProtectEx( hProcess, mEntry.modBaseAddr + iIFaceOffset + iUnlimAmmoOffs, sizeof( chAmmoPatch ), PAGE_READWRITE, &dwOldProtect );
WriteProcessMemory( hProcess, mEntry.modBaseAddr + iIFaceOffset + iUnlimAmmoOffs, chAmmoPatch, sizeof( chAmmoPatch ), NULL );
}
else
{
SetConsoleColor( Color_Red );
std::wcout << L"\nCould not find ammo offset!";
}
}
else
{
SetConsoleColor( Color_Red );
std::wcout << L"\nCould not find GAME_SAV_LOAD offset!";
}
delete [] iModule;
}
else
{
SetConsoleColor( Color_Red );
std::cout << "[MDL NOT DETECTED]";
}
}
else
{
SetConsoleColor( Color_Red );
std::cout << "[NOT DETECTED]";
}
getchar();
return 0;
}
Comments