[Guida] Creare cheat in C++ (Console/Dll)

Stato
Discussione chiusa ad ulteriori risposte.

Steurendo

Utente Emerald
26 Ottobre 2011
733
105
213
573
Ultima modifica:
Salve a tutti nabboli °-°
Oggi non ho niente da fare e mi va di spiegarvi come creare un cheat in C++.
Ci sono due modi per creare il cheat: con la Console o con una Dll; li vedremo tutti e due.
NOTA: la guida è rivolta per coloro che conoscono le basi di C++.
NOTA 2: se in questa guida speri di trovare degli address da utilizzare per un cheat.. Alt+F4 is the way :\

Primo metodo: Console
Create un nuovo progetto vuoto. IMPORTANTE: Aprire sempre il cheat come amministratore altrimenti non funzionerà!
Come prima cosa abbiamo bisogno di creare un Header, che nel mio caso chiamerò "functions.h" (poi potete decidere voi come chiamarlo però per questione di ordine conviene dare un nome sensato ai files e.e), e un file Cpp, che chiamerò "main.cpp" (come tradizione xD).
Cominciamo prima con "functions.h".
Ciò che andrà scritto su questo header, come si intuisce dal nome, sono gli includes (librerie senza le quali è impossibile creare un qualsiasi progetto) e le funzioni utili per creare un buon cheat.
Partiamo con lo scrivere gli includes:
Codice:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
E dato che useremo le stringhe si deve "dire" al programma che si utilizza il namespace "std":
Codice:
using namespace std;
Perfetto. Ora andremo a definire le funzioni necessarie a far funzionare bene in cheat:
Codice:
BOOL ProcessExists(string ProcessName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 PE32;
    PE32.dwSize = sizeof(PROCESSENTRY32);
    do
    {
        if(PE32.szExeFile == ProcessName)
        {
            CloseHandle(hSnapshot);
            return TRUE;
        }
    } while(Process32Next(hSnapshot, &PE32));
    CloseHandle(hSnapshot);
    return FALSE;
}


DWORD GetProcID(string ProcessName)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 PE32;
    PE32.dwSize = sizeof(PROCESSENTRY32);
    while(Process32Next(hSnapshot, &PE32) && PE32.szExeFile != ProcessName);
    return PE32.th32ProcessID;
}
Le due funzioni sono ProcessExists, che semplicemente verifica se un determinato processo è aperto, e GetProcID, che ottiene il Process Identifier (comunemente detto PID) per poter usare OpenProcess.
Con "functions.h" abbiamo finito e adesso andremo a scrivere sul main.cpp.
Innanzitutto bisogna includere "functions.h" per poter utilizzare le funzioni scritte prima:
Codice:
#include "functions.h"
Notare che per includere il file ho messo le virgolette "" invece dei segni <>.. Ciò sta a indicare che includerò nel file un Header presente nel progetto.
Anche qua bisogna dire che si usa "std":
Codice:
using namespace std;
Si scrive la funzione principale che sarà l'entry point del programma:
Codice:
void main()
{
}
All'interno di quelle due graffe scriveremo il codice del programma.
Per dare un tocco di stile si può mettere un piccolo titolo al cheat ad esempio:
Codice:
cout << "========================" << endl
     << "===Cheat by Steurendo===" << endl
     << "========================" << endl
     << endl;
Poi dichiariamo le variabili contenenti il nome del processo (nel nostro caso di S4), gli address e i value delle varie funzioni (per la guida userò due soli funzioni, con dati inventati ovviamente)
Codice:
char *ProcessName = "S4Client.exe";
DWORD adrHP = 0x00A1B2C3,
      valHP = 255,
      useHP = FALSE,
      adrSP = 0x00D4E5F6,
      valSP = 255,
      useSP = FALSE;
Quei due "useHP" e "useSP" sono due variabili che si utilizzeranno ora per specificare se l'utente vorrà attivare la funzione:
Codice:
cout << "200 HP: ";
cin >> useHP;
cout << "Inf SP";
cin >> useSP;
Adesso utilizzeremo una delle due funzioni dichiarate in precedenza, ovvero ProcessExists, per aspettare che il processo di S4 venga aperto:
Codice:
cout << "Waiting for " << ProcessName << "..." << endl
     << endl;
while(!ProcessExists(ProcessName));
Ora si comincia a scrivere il vero e proprio cuore del cheat:
Codice:
cout << ProcessName << " found!" << endl
     << endl;
Sleep(1000);
DWORD PID = GetProcID(ProcessName);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);


if(useHP)
    WriteProcessMemory(hProcess, (LPVOID)adrHP, &valHP, sizeof(valHP), NULL);
if(useSP)
    WriteProcessMemory(hProcess, (LPVOID)adrSP, &valSP, sizeof(valSP), NULL);
    
CloseHandle(hProcess);
cout << "Done!" << endl;
In questa fase il codice fa esattamente questo: ottiene il PID di S4, apre il processo S4Client.exe per poter scrivere al suo interno, se precedentemente l'utente ha scelto di attivare le funzioni scrive la memoria (modifica il valore dell'address), chiude l'handle di S4Client.exe.
In questo modo abbiamo creato un semplicissimo cheat No-Menu. Poi volendo uno può crearsi una base personalizzata in modo da semplificarsi il lavoro (come ho fatto io :p) ma necessita di qualche conoscenza in più (forse più avanti deciderò di rilasciare la mia base).

Secondo metodo: Dll
Questo metodo è di gran lunga più corto rispetto all'altro anche se presenta le sue piccole difficoltà, ovvero bisogna abilitare la scrittura della memoria del processo e andare a modificare il valore di un address; può anche essere scomodo in quanto bisogna injectare la Dll nel processo desiderato e soprattutto, non si può scegliere direttamente quale funzione attivare poichè verranno "attivate" tutte.
Create un nuovo progetto Win32 -> Dll e checkare "Progetto vuoto" (io uso VisualStudio per cui non so come si faccia a creare un progetto Dll con DevC++ o altri Ide).
Per questo metodo useremo sempre un Header ("definitions.h") e un Cpp ("dllmain.cpp").
Scriveremo prima su "definitions.h", partendo dal definire prima gli includes, gli address e per finire la funzione per disabilitare la protezione del processo e modificare la memoria su:
Codice:
#include <Windows.h>

#define ADR_HP 0x00A1B2C3
#define ADR_SP 0x00D4E5F6


void WriteMemory(DWORD address, DWORD value)
{
    DWORD dwOldProt;
    VirtualProtect((LPVOID)address, 4, PAGE_READWRITE, &dwOldProt);
    *(DWORD *)address = value;
    VirtualProtect((LPVOID)address, 4, dwOldProt, &dwOldProt);
}
Ora andremo a toccare "dllmain.cpp", cominciando con l'includere "definitions.h" e definire l'EntryPoint del programma:
Codice:
#include "definitions.h"

int __stdcall DllMain(HMODULE hModule, DWORD  dwReasons, LPVOID lpReserved)
{
}
All'interno delle graffe metteremo il codice del cheat vero e proprio:
Codice:
if(dwReasons == DLL_PROCESS_ATTACH)
{
    WriteMemory(ADR_HP, 123456789);
    WriteMemory(ADR_SP, 987654321);
}
Corto vero? Queste righe non fanno altro che verificare che la dll sia stata injectata correttamente e modificare la memoria con la funzione definita prima.
Come sempre con certe conoscenze ci si potrebbe semplificare ulteriormente la vita.. basta sperimentare :)
La guida è terminata.. spero di essere stato d'aiuto ;)
Ricordare sempre di eseguire come amministratore i cheats Console!

P.S. Non sono espertissimo per cui se ho sbagliato qualcosa vi prego di correggermi :)
 
l'errore 'sta qua:


if(dwReasons == DLL_PROCESS_ATTACH)
{
WriteMemory(ADR_HP, 123456789);
WriteMemory(ADR_SP, 987654321);
}
e qua c'è la correzione:

#if(dwReasons == DLL_PROCESS_ATTACH)
{
WriteMemory(ADR_HP, 123456789);
WriteMemory(ADR_SP, 987654321);
}
#endif
 
ovviamente ho corretto soltanto il codice per la dll perché non mi va di correggere anche gli altri... dove c'è if deve diventare #if e dove finisce l'if si deve mettere #endif... poi non ho esaminato gli altri codici e non mi va, quindi non so se ci stanno altri errori
 
l'errore 'sta qua:


if(dwReasons == DLL_PROCESS_ATTACH)
{
WriteMemory(ADR_HP, 123456789);
WriteMemory(ADR_SP, 987654321);
}
e qua c'è la correzione:

#if(dwReasons == DLL_PROCESS_ATTACH)
{
WriteMemory(ADR_HP, 123456789);
WriteMemory(ADR_SP, 987654321);
}
#endif
A me funziona come ho scritto io altrimenti avrei corretto, non credi?
Wow la guida non è rivolta al suo creatore! :oddio:
A parte il fatto che è vero.. ho imparato programmazione in modo amatoriale.. ma tu sei iscritto su Inforge solo per criticare ovunque puoi? :\
Comunque volendo avrei potuto pubblicare la base che ho creato solo per far vedere che sarei in grado di fare una cosa più complessa ma ho preferito non dover mettere cose incomprensibili ad alcuni.
 
A me funziona come ho scritto io altrimenti avrei corretto, non credi?

A parte il fatto che è vero.. ho imparato programmazione in modo amatoriale.. ma tu sei iscritto su Inforge solo per criticare ovunque puoi? :\
Comunque volendo avrei potuto pubblicare la base che ho creato solo per far vedere che sarei in grado di fare una cosa più complessa ma ho preferito non dover mettere cose incomprensibili ad alcuni.
:oddio:

Vabbe lasciamo stare.
 
Molto utile, appena avrò tempo cercherò di crearne uno utilizzando questa guida, grazie tante davvero molto utile :)
 
Stato
Discussione chiusa ad ulteriori risposte.