Ultima modifica:
Un piccolo regalino a tutti i metiniani...
4.0 Gli Assi
La mappa di metin2 va vista come un piano cartesiamo XD Anch'essa è composta dai 3 assi: X,Y e Z per l'altezza.
Vedesi la figura sotto:
Ok Adesso che abbiamo capito meglio il prospetto, passiamo al dunque... Con le assi si possono fare moltissime cose su metin2, tra cui (non ci crederete mai) la funzione migliore scoperta....
4.1 Il Teleporter Hack
Le coordinate sono contenute in 3 address, il cui value corrisponde al valore della X, Y e Z. Scrivendo su questi address, come abbiamo visto nei tutorial precedenti, è possibile modificare le coordinate attuali con un consecutivo spostamento del PG sulla mappa.... Vediamo meglio come trovare questi address.
=====================
Pointer = 0x5F29BC
===
Asse X
Offset1 = 16
Offset2 = 1412
----
Asse Y
Offset1 = 16
Offset2 = 1416
----
Asse Z
Offset1 = 16
Offset2 = 1420
----
====
Bene, adesso sappiamo come trovare l'address risalendo tramite la ReadProcessMemory al all'address puntato, sommiamo offset1, leggiamo offset1, prendiamo il value e sommiamo l'offset 2.
Adesso abbiamo l'address per ognuno dei tre assi.
ATTENZIONE!!! Il value sarà molto superiore a quello delle coordinate che trovate sulla mappa, quando noi scriviamo la memoria dobbiamo renderlo proporzionato...
ovvero:
CoordinataMappaGioco: X = CoordinataMappaGiocoMassima : value massimo
X = CoordinataMappaGioco * value massimo / coordinataMappaGiocoMassima....
XD
Non è così complicato come può sembrare.....
4.1 LockMob
Il lock mob è sicuramente la funzione pià interessante realizzabile con le coordinate, e non è così difficile come dicono le voci di corridoio XD Anzi a dirla tutta è molto pià semplice di un normale teleporter con mappa.
Però sicuramente è il più complicato da spiegare soprattutto per un nabbo di ASM come me
Ma andiamo per gradi....
Il valore delle X, Y, Z che abbiamo visto prima, sono contenuti all'interno del registro esi con un offset
Essi sono:
esi+000003a8 // X
esi+000003ac // Y
esi+000003b0 // Z
Vedesi figura:
Ok Spero vi sia chiaro.... (lo spero perchè non so come altro spiegarlo)
Nel gamecode esistono funzioni che ci permettono di muoverci aggiornando le coordinate a ogni passo, copiando così il valore nel registro esi+offset...
In poche parole abbiamo:
mov [esi+000003a8],eax // X
mov [esi+000003ac],ecx // Y
mov [esi+000003b0],edx // Z
Nella prima funzione, il registro eax contiene il valore della coordinata X dopo aver effettuato il passo, il valore viene copiato in esi+3a8 che conteneva il valore della X prima di aver effettuato il passo, questa funzione permette al PG di muoversi lungo l'asse X che altrimenti sarebbe impossibile. Stessa cosa per gli altri due assi. Le tre istruzioni sono consecutive sul gamecode.
Adesso, per fare un lock mob, non dobbiamo fare altro che fare in modo che eax, ecx e edx contengano solo le nostre coordinate attuali, bloccate al tempo dell'attivazione del Lock. In modo che camminando non si aggiornino ma rimangano sempre tali.
Molti di voi avranno notato che su metin, la chiamata che aggiorna la posizione del PG è la stessa che aggiorna la posizione dei MOB e degli NPC e di tutti gli altri giocatori!!!!
Per cui, una volta che eax, ecx ed edx contengono solo e soltanto le nostre coordinate, il che indica implicitamente che qualsiasi mob, npc o pg si muova, attivando la call che aggiorna le coordinate, ZACKK!!! Rimane intrappolato nelle nostre coordinate, perchè il registro eax contiene solo e soltanto le nostre coordinate!!!
Ho scritto in grassetto perchè è il meccanismo "chiave" del funzionamento del LockMob... Usiamo li stessi registri di mob ed NPC (non voglio criticare la GF, ma funziona così)
Eheheheeh.....
Vediamo come procedere....
Adesso per comodità lo farò vedere solo per la X col registro eax.
Allora dobbiamo fare in modo che eax contenga solo le nostre coordinate fisse nel punto in cui siamo attualmente...
Prima di procedere qui, consiglio vivamente di leggersi la guida di un esperto serio: http://www.cheatforge.net/community/asm/2116-creare-un-cheat-editando-il-gamecode-asm.html
Dopodichè procediamo....
Allora andiamo sul gamecode come mostrato nella guida che vi ho linkato, andate all'address 004F1616 con click destro->GoTo
Vedesi figura
Se vi esce una cosa simile siete sul punto giusto...
(L'immagine è sbagliata, stasera rifaccio lo screen)
Ecco come lockare eax in C++
Video Guida
[YOUTUBE]<object width="660" height="525"><param name="movie" value="http://www.youtube.com/v/mGPatBzxoWQ&hl=it&fs=1&color1=0x5d1719&color2=0xcd311b&border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/mGPatBzxoWQ&hl=it&fs=1&color1=0x5d1719&color2=0xcd311b&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="660" height="525"></embed></object>[/YOUTUBE]
fonte: Cap 4 "mio tutorial"
4.0 Gli Assi
La mappa di metin2 va vista come un piano cartesiamo XD Anch'essa è composta dai 3 assi: X,Y e Z per l'altezza.
Vedesi la figura sotto:
Ok Adesso che abbiamo capito meglio il prospetto, passiamo al dunque... Con le assi si possono fare moltissime cose su metin2, tra cui (non ci crederete mai) la funzione migliore scoperta....
4.1 Il Teleporter Hack
Le coordinate sono contenute in 3 address, il cui value corrisponde al valore della X, Y e Z. Scrivendo su questi address, come abbiamo visto nei tutorial precedenti, è possibile modificare le coordinate attuali con un consecutivo spostamento del PG sulla mappa.... Vediamo meglio come trovare questi address.
=====================
Pointer = 0x5F29BC
===
Asse X
Offset1 = 16
Offset2 = 1412
----
Asse Y
Offset1 = 16
Offset2 = 1416
----
Asse Z
Offset1 = 16
Offset2 = 1420
----
====
Bene, adesso sappiamo come trovare l'address risalendo tramite la ReadProcessMemory al all'address puntato, sommiamo offset1, leggiamo offset1, prendiamo il value e sommiamo l'offset 2.
Adesso abbiamo l'address per ognuno dei tre assi.
ATTENZIONE!!! Il value sarà molto superiore a quello delle coordinate che trovate sulla mappa, quando noi scriviamo la memoria dobbiamo renderlo proporzionato...
ovvero:
CoordinataMappaGioco: X = CoordinataMappaGiocoMassima : value massimo
X = CoordinataMappaGioco * value massimo / coordinataMappaGiocoMassima....
XD
Non è così complicato come può sembrare.....
4.1 LockMob
Il lock mob è sicuramente la funzione pià interessante realizzabile con le coordinate, e non è così difficile come dicono le voci di corridoio XD Anzi a dirla tutta è molto pià semplice di un normale teleporter con mappa.
Però sicuramente è il più complicato da spiegare soprattutto per un nabbo di ASM come me
Ma andiamo per gradi....
Il valore delle X, Y, Z che abbiamo visto prima, sono contenuti all'interno del registro esi con un offset
Essi sono:
esi+000003a8 // X
esi+000003ac // Y
esi+000003b0 // Z
Vedesi figura:
Ok Spero vi sia chiaro.... (lo spero perchè non so come altro spiegarlo)
Nel gamecode esistono funzioni che ci permettono di muoverci aggiornando le coordinate a ogni passo, copiando così il valore nel registro esi+offset...
In poche parole abbiamo:
mov [esi+000003a8],eax // X
mov [esi+000003ac],ecx // Y
mov [esi+000003b0],edx // Z
Nella prima funzione, il registro eax contiene il valore della coordinata X dopo aver effettuato il passo, il valore viene copiato in esi+3a8 che conteneva il valore della X prima di aver effettuato il passo, questa funzione permette al PG di muoversi lungo l'asse X che altrimenti sarebbe impossibile. Stessa cosa per gli altri due assi. Le tre istruzioni sono consecutive sul gamecode.
Adesso, per fare un lock mob, non dobbiamo fare altro che fare in modo che eax, ecx e edx contengano solo le nostre coordinate attuali, bloccate al tempo dell'attivazione del Lock. In modo che camminando non si aggiornino ma rimangano sempre tali.
Molti di voi avranno notato che su metin, la chiamata che aggiorna la posizione del PG è la stessa che aggiorna la posizione dei MOB e degli NPC e di tutti gli altri giocatori!!!!
Per cui, una volta che eax, ecx ed edx contengono solo e soltanto le nostre coordinate, il che indica implicitamente che qualsiasi mob, npc o pg si muova, attivando la call che aggiorna le coordinate, ZACKK!!! Rimane intrappolato nelle nostre coordinate, perchè il registro eax contiene solo e soltanto le nostre coordinate!!!
Ho scritto in grassetto perchè è il meccanismo "chiave" del funzionamento del LockMob... Usiamo li stessi registri di mob ed NPC (non voglio criticare la GF, ma funziona così)
Eheheheeh.....
Vediamo come procedere....
Adesso per comodità lo farò vedere solo per la X col registro eax.
Allora dobbiamo fare in modo che eax contenga solo le nostre coordinate fisse nel punto in cui siamo attualmente...
Prima di procedere qui, consiglio vivamente di leggersi la guida di un esperto serio: http://www.cheatforge.net/community/asm/2116-creare-un-cheat-editando-il-gamecode-asm.html
Dopodichè procediamo....
Allora andiamo sul gamecode come mostrato nella guida che vi ho linkato, andate all'address 004F1616 con click destro->GoTo
Vedesi figura
Se vi esce una cosa simile siete sul punto giusto...
(L'immagine è sbagliata, stasera rifaccio lo screen)
Ecco come lockare eax in C++
Codice:
#include <windows.h>
HANDLE GetProc();
DWORD GetX();
DWORD GetY();
DWORD GetZ();
int main()
{
DWORD X = GetX();
DWORD Y = GetY();
DWORD Z = GetZ();
HANDLE hProcess = GetProc();
WriteProcessMemory(hProcess, (LPVOID)0x5f77e1, &X, sizeof(X), NULL);
WriteProcessMemory(hProcess, (LPVOID)0x5F781D, &Y, sizeof(Y), NULL);
WriteProcessMemory(hProcess, (LPVOID)0x5F7846, &Z,sizeof(Z), NULL);
//LOCK ON ENABLE
BYTE Xlock[] = { 0x50, 0xa1, 0xe1, 0x77, 0x5f, 0x00, 0x89, 0x86, 0xa8, 0x03, 0x00, 0x00, 0x58, 0xe9, 0x3b, 0x9e, 0xef, 0xff };
WriteProcessMemory(hProcess, (LPVOID)0x5F77cf, &Xlock, sizeof(Xlock), NULL);
BYTE Xatk[] = { 0xe9, 0xb4, 0x61, 0x10, 0x00, 0x90 };
WriteProcessMemory(hProcess, (LPVOID)0x4F1616, &Xatk, sizeof(Xatk), NULL);
}
HANDLE GetProc()
{
HWND hWnd = FindWindow(0, "METIN2");
DWORD proc_id;
GetWindowThreadProcessId(hWnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
return hProcess;
}
DWORD GetX()
{
DWORD buff, buff1, buff2;
DWORD addy, addy1;
ReadProcessMemory(GetProc(), (LPVOID)0x005F29BC, &buff, sizeof(buff), NULL);
addy = buff + 16;
ReadProcessMemory(GetProc(), (LPVOID)addy, &buff1, sizeof(buff1), NULL);
addy1 = buff1 + 1412;
ReadProcessMemory(GetProc(), (LPVOID)addy1, &buff2, sizeof(buff2), NULL);
DWORD X = buff2;
return X;
}
DWORD GetY()
{
DWORD buff, buff1, buff2;
DWORD addy, addy1;
ReadProcessMemory(GetProc(), (LPVOID)0x005F29BC, &buff, sizeof(buff), NULL);
addy = buff + 16;
ReadProcessMemory(GetProc(), (LPVOID)addy, &buff1, sizeof(buff1), NULL);
addy1 = buff1 + 1416;
ReadProcessMemory(GetProc(), (LPVOID)addy1, &buff2, sizeof(buff2), NULL);
return buff2;
}
DWORD GetZ()
{
DWORD buff, buff1, buff2;
DWORD addy, addy1;
ReadProcessMemory(GetProc(), (LPVOID)0x005F29BC, &buff, sizeof(buff), NULL);
addy = buff + 16;
ReadProcessMemory(GetProc(), (LPVOID)addy, &buff1, sizeof(buff1), NULL);
addy1 = buff1 + 1420;
ReadProcessMemory(GetProc(), (LPVOID)addy1, &buff2, sizeof(buff2), NULL);
return buff2;
}
Video Guida
[YOUTUBE]<object width="660" height="525"><param name="movie" value="http://www.youtube.com/v/mGPatBzxoWQ&hl=it&fs=1&color1=0x5d1719&color2=0xcd311b&border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/mGPatBzxoWQ&hl=it&fs=1&color1=0x5d1719&color2=0xcd311b&border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="660" height="525"></embed></object>[/YOUTUBE]
fonte: Cap 4 "mio tutorial"