// 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; }