Pushok icon

Vietcong patcher

Pushok | PRO | 01/29/12 10:20:43 AM UTC | 0 ⭐ | 348 👁️ | Never ⏰ | []
C++ |

4.08 KB

|

None

|

0 👍

/

0 👎

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