Domanda How to make a C++ ASM Hacks!

Stato
Discussione chiusa ad ulteriori risposte.

xXxDarkAlexXx

Utente Silver
19 Gennaio 2009
114
4
22
84
Ultima modifica:
[Tutorial]How to make a C++ ASM Hacks!

Salve!
Oggi vi spiegherò come creare un hack in C++, editanto il famigerato gamecode!

Programmi necessari:

Allora per prima cosa segliete un gioco, io ho scelto Solitario.

Per chi è proprio agli inizi ho fatto degli screen..

Non descrivo gli screen poichè sono commentati, se non capite qualcosa chiedete pure!

1° Screen. Come aprire un processo su cui lavorarci!

http://img405.imageshack.us/img405/9025/procedimento1.png

2° Screen. Come trovare l'address del tempo [Parte 1]

http://img405.imageshack.us/img405/7317/procedimento2.png

3° Screen. Come trovare l'address del tempo [Parte 2]

http://img509.imageshack.us/img509/5852/procedimento3.png

4° Screen. Come trovare i codici asm [Parte 1]

http://img134.imageshack.us/img134/1890/procedimento4.png

5° Screen. Come trovare i codici asm [Parte 2]

http://img256.imageshack.us/img256/2064/procedimento5.png

6° Screen. Come trovare i codici asm [Parte 3]

http://img19.imageshack.us/img19/1877/procedimento6.png

Per fare in modo che il tempo si blocchi basta scrivere questo codice:


Codice:
BYTE Nop[] = {0x90,0x90,0x90};//3 nop, 1 per ogni address
    WriteProcessMemory(hProcess, (LPVOID)0x00356a25, &Nop, sizeof(Nop), NULL);// cambiate l'address con il vostro!


Per fare in modo che il tempo si riattivi basta scrivere questo codice:


Codice:
BYTE On[] = {0xff,0x40,0x08};//Byte per riattivare il tempo!
    WriteProcessMemory(hProcess, (LPVOID)0x00356a25, &On, sizeof(On), NULL);// cambiate l'address con il vostro!


Per scriverlo completo con queste due funzioni basta scrivere questo codice:

1° Passaggio = Aprire Dev-C++
2° Passaggio = File -> New -> Source File
3° Passaggio = Salvarlo (anche vuoto) da qualche parte con formato .cpp
4° Passaggio = Copiare il codice sottostante!O riscriverlo,vi consiglio di riscriverlo ^^



Codice:
#include <iostream>
#include <io.h>		
#include <fcntl.h>
#include <windows.h>

using namespace std;

int main() 
{
    
while (1)
{
string op1 = "-";
cout << "Inserisci On/Off: " << endl;
cin >> op1;
if(op1=="On")//se si scrive On
{
             system("cls");//Cancella
HWND hwnd;
    hwnd = FindWindow(0, "Solitario");
    DWORD proc_id;   
    GetWindowThreadProcessId(hwnd, &proc_id); 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);


    BYTE Nop[] = {0x90,0x90,0x90};//3 nop, 1 per ogni address
    WriteProcessMemory(hProcess, (LPVOID)0x00356a25, &Nop, sizeof(Nop), NULL);// cambiate l'address con il vostro!
    cout << "\nHack attivato con successo!\n" << endl;
    return main();
    
}
if(op1=="Off")//se si scrive Off
{
              system("cls");//Cancella
HWND hwnd;
    hwnd = FindWindow(0, "Solitario");//Ottiene l'id della finestra tramite il nome,di essa.
    DWORD proc_id;   
    GetWindowThreadProcessId(hwnd, &proc_id); 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);


    BYTE On[] = {0xff,0x40,0x08};//Byte per riattivare il tempo!
    WriteProcessMemory(hProcess, (LPVOID)0x00356a25, &On, sizeof(On), NULL);// cambiate l'address con il vostro!
    cout << "\nHack disattivato con successo!\n" << endl;
    return main();//ritorna a main.
    
}

}

}


Spero sia utile, e che vi sia piaciuta!

Credits: 100% XxDarkAlexX.

Make for Unfair-Gamers!
 
ma meglio che scrivi "by UG"...vabbè ma apparte questo:
il metodo è lo stesso che ho usato io per fare il buon vecchio exiMH, funziona si ma è un bel po' macchinoso >.>

ad ogni modo good job
 
Asd dovevo farla anche io.. mi hai preceduto. Vorra dire che la faccio per VB. Cmq il sorgente racchiudilo in un tag
Codice:
 
Ultima modifica:
Ho capito che è più professionale, ma resta il fatto che di asm non ha nulla xD Non è che per il fatto che modifichi il valore di un address in 0x90 significa che si usa il codice asm xDù

no no, a parer mio è piu divertente fare hack in asm, colpisci il programma proprio nella sua struttura invece di modificare semplicemente un valore


Quello si, è anche più logico... però intendevo che in questo caso non è in asm, o almeno concettualmente ha solo modificato un valore a 0x90, ma di asm non c'è nulla in questo caso.

PS: farlo in asm e modificare un valore è la stessa cosa.... anche quando usi direttamente il codice asm stai modificando il valore dell'address.
 
Ripeto che è diverso, quando modifichi l'HEX (che sarebbe l'asm scritto in un altra codifica, ma pur sempre asm è) vai a modificare la struttura del programma.

Quando usi i pointer e poi scrivi sull'address è come cambiare il valore di una variabile di un programma.

E' totalmente diverso ;) poi l'effetto può essere lo stesso, ma quello non centra
 
Ultima modifica:
Ripeto che è diverso, quando modifichi l'HEX (che sarebbe l'asm scritto in un altra codifica, ma pur sempre asm è) vai a modificare la struttura del programma.

Quando usi i pointer e poi scrivi sull'address è come cambiare il valore di una variabile di un programma.

E' totalmente diverso ;) poi l'effetto può essere lo stesso, ma quello non centra

In ogni caso in entrambi i casi non fai altro che cambiare il valore xD Poi l'effetto non è lo stesso, quando fai le modifiche sul gamecode tutto il gioco subisce le modifiche in quanto l'address che modifichi controlla tutti i pg e npc; mentre quando lo fai con l'address puntato modifichi solo il tuo pg...La cosa migliore è fare le modifiche sul gamecode, però andando a modificare l'address puntato anzichè il puntatore generale.

Cioè per esempio per metin2 nello speed hack....
nessuno andrebbe a fare una cosa simile:
1)
Codice:
mov [ecx+off], value

In quanto le modifiche andrebbero a tutti i pg ed npc...

conviene fare:
2)
Codice:
mov ebx, [pointer]
mov ebx, [ebx+8]
mov ebx, 5b6

mov [ebx], value

In questo modo modifichi solo il valore dell'address che punta al tuo pg.

Questo per dire che in entrambi i casi modifichi il valore all'address.... Solo che nel primo caso lo fai tramite l'address comune della procedura che regola la velocità di tutti gli elementi nel gioco; nel secondo caso lo fai modificando il valore della variabile che regola la speed del tuo pg tramite una modifica da un puntatore (che è quello che fate sempre col ReadProcessMemory)
 
Questo è l'esempio per metin perchè probabilmente la parte che vai a modificare in asm è la dichiarazione della funzione che viene chiamata ogni volta per calcolare le velocità dei pg, ma non è assolutamente vero che tutte le modifiche asm sono per tutto il game e le modifiche fatte con i pointer riguardano solo il tuo pg

ti faccio un paragone:
perchè non voglio che un albero produca i frutti posso
- modificargli il dna in modo che non li sintetizzi (asm)
- togliergli il frutto ogni volta che viene prodotto (modifica pointer)

cade a pennello :)
 
Ultima modifica:
Questo è l'esempio per metin perchè probabilmente la parte che vai a modificare in asm è la dichiarazione della funzione che viene chiamata ogni volta per calcolare le velocità dei pg, ma non è assolutamente vero che tutte le modifiche asm sono per tutto il game e le modifiche fatte con i pointer riguardano solo il tuo pg

ti faccio un paragone:
perchè non voglio che un albero produca i frutti posso
- modificargli il dna in modo che non li sintetizzi (asm)
- togliergli il frutto ogni volta che viene prodotto (modifica pointer)

cade a pennello :)

Il concetto è che quando metti what find out con CE troverai solo il metodo, mai caso per caso. Per cui le modifiche saranno sempre generalizzate, a meno che non modifichi solo il valore puntato che ti interessa... Ovviamente sempre sfruttando come attacco del code-cave il metodo.

Per esempio per l'auto pozze ho fatto così:

-ogni volta che viene chiamata la funzione che modifica la barra dell'HP....
- controlla se l'address della MIA hp puntato dal pointer è minore di 1/2
-se è minore chiama la funzione per la pozza
-se è maggiore ritorna

In questo caso potevo fare solo così con qualche salto condizionato.... (che sarebbe l'esempio del DNA) XD
 
Questo è l'esempio per metin perchè probabilmente la parte che vai a modificare in asm è la dichiarazione della funzione che viene chiamata ogni volta per calcolare le velocità dei pg, ma non è assolutamente vero che tutte le modifiche asm sono per tutto il game e le modifiche fatte con i pointer riguardano solo il tuo pg

ti faccio un paragone:
perchè non voglio che un albero produca i frutti posso
- modificargli il dna in modo che non li sintetizzi (asm)
- togliergli il frutto ogni volta che viene prodotto (modifica pointer)

cade a pennello :)
Mi spiace contraddirti, ma se un albero lo vuoi rendere sterile (o che non produca frutti, come hai detto), puoi solo fare in modo che il dna si corrompa o che non abbia più risorse per produrre i frutti.
 
Mi spiace contraddirti, ma se un albero lo vuoi rendere sterile (o che non produca frutti, come hai detto), puoi solo fare in modo che il dna si corrompa o che non abbia più risorse per produrre i frutti.


Guarda che Eximus ha detto giusto!!! Ci stanno due modi:

1) modificare il DNA
2) levare frutti volta per volta...

Ma è ovvio che la seconda è solo approssimativa xD

Il concetto era che nell'asm puoi fare tutte le modifiche nel flusso del programma, mentre modificando le variabili puntate puoi solo rendere modifiche temporanee... in quanto prima o poi quella variabile riassumerà il valore di partenza.
 
Eh vabbè grazie...se non voglio che il fabbro mi rompa un oggetto stacco la corrente prima di premere "migliora" >.< così non me lo rompe di sicuro....
 
Già...Abbiamo fatto un ottimo regionamento di gruppo...intanto dopodomani dovremmo tornare alle noiose vite da studenti. :omfg:
 
Stato
Discussione chiusa ad ulteriori risposte.