Domanda

Ho imparato come funziona NOP in C ++ o anche C, ma ci sono pochissime tutorial on-line su di esso. Sono stato googling per le ultime ore e che io sono solo bloccato. Qui è il mio codice.

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;

//#define NOP 0x90
byte NOP[] = {0x90};

void enableDebugPrivileges() {
    HANDLE hcurrent=GetCurrentProcess();
    HANDLE hToken;
    BOOL bret=OpenProcessToken(hcurrent,40,&hToken);
    LUID luid;
    bret=LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid);
    TOKEN_PRIVILEGES NewState,PreviousState;
    DWORD ReturnLength;
    NewState.PrivilegeCount =1;
    NewState.Privileges[0].Luid =luid;
    NewState.Privileges[0].Attributes=2;
    AdjustTokenPrivileges(hToken,FALSE,&NewState,28,&PreviousState,&ReturnLength);
}
DWORD GetProcId(char* ProcName)
{
    PROCESSENTRY32   pe32;
    HANDLE         hSnapshot = NULL;

    pe32.dwSize = sizeof( PROCESSENTRY32 );
    hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

    if( Process32First( hSnapshot, &pe32 ) )
    {
        do{
            if( strcmp( pe32.szExeFile, ProcName ) == 0 )
                break;
        }while( Process32Next( hSnapshot, &pe32 ) );
    }

    if( hSnapshot != INVALID_HANDLE_VALUE )
        CloseHandle( hSnapshot );

    return pe32.th32ProcessID;
}
void WriteMem(DWORD Address, void* Value, size_t Size) {
    DWORD Protect = NULL;
    VirtualProtect((LPVOID)Address, 3, PAGE_READWRITE, &Protect);
    memcpy((void*)Address, Value, 3);
    VirtualProtect((LPVOID)Address, 3, Protect, &Protect);
}
void nop_(PVOID address, int bytes){ 
    DWORD d, ds; 
    VirtualProtect(address, bytes, PAGE_EXECUTE_READWRITE, &d); 
    memset(address, 144, bytes);
    VirtualProtect(address,bytes,d,&ds); 
}  

void MemCopy(HANDLE pHandle, void* Dest, const void* Src, int Len)
{
 DWORD OldProtect;
 DWORD OldProtect2; 
 VirtualProtect(Dest, Len, PAGE_EXECUTE_READWRITE, &OldProtect);
 memcpy(Dest, Src, Len);
 VirtualProtect(Dest, Len, OldProtect, &OldProtect2);
 FlushInstructionCache(pHandle, Dest, Len);
}

int main()
{
   enableDebugPrivileges();

   DWORD pid;
   HANDLE phandle;

   // Obtain the process ID
   pid = GetProcId("gr.exe");
    if(GetLastError())
   {
      cout << "Error_PID_: " << GetLastError() << endl;
      system("pause");
      return -1;
   }

   // Obtain the process handle
   phandle = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
   if(GetLastError())
   {
      cout << "Error_HANDLE_: " << GetLastError() << endl;
      system("pause");
      return -1;
   }

   // Debug info, 0 = bad
   cout <<"pid   : " << pid << endl;
   cout <<"HANDLE: " << phandle << endl << endl;
   system("pause");


   // Change value to
   short iValue   =   -1;
   int choice   =   0;

   BYTE * bGodMode  = (BYTE *) (0x409A7E); // Lives Address


   bool hack = true;
   while(hack)
   {
      system("cls");
      cout << "What hack?\n0. Exit\n1. Lives\n\n!> ";
      cin >> choice;
      switch(choice)
      {
      case 0:
         {
            hack=false;
            break;
         }
      case 1:
         // Modify Time
         cout << "God Mode On\n!> ";
//  cin >> iValue;
//  nop_((PVOID)(0x409A7E), 3);
//   MemCopy(phandle, (PVOID)0x409A7E, &NOP, 1);
   WriteMem((DWORD)(0x00409A7E), (void*)NOP, sizeof NOP);
         if(GetLastError())
         {
            cout << "Error: " << GetLastError() << endl;
            system("pause");
         }
         break;
      default:
         cout << "ERROR!\n";
         break;
      }
      Sleep(100);
   }

   system("pause");
   return 0;
}

Questa è supponiamo di NOP la funzione di dicembre che è 3 byte impedendomi lunga di perdere la vita. Tuttavia, ogni volta che ho provato, si blocca l'hack e dice ho avuto una violazione di accesso. Ho provato a cercare le ragioni e la maggior parte di loro sono occupato con la dimensione della posizione che sto scrivendo e che cosa sto copiando da. In caso contrario, non ho assolutamente idea. Qualsiasi aiuto sarebbe bello. Il gioco è GunRoar e l'indirizzo di base "0x409A7E" è dove la funzione DEC è.

È stato utile?

Soluzione

Alcuni punti rapidi:

‘VirtualProtect‘funziona solo sul processo in corso. Usare ‘VirtualProtectEx’ per modificare le autorizzazioni del processo di destinazione. E io suggerirei di permesso set ‘PAGE_EXECUTE_READWRITE’ -. Scrivibile, ma ancora eseguibile

Come accennato prima, avrete bisogno di usare ‘WriteProcessMemory’ scrivere quelle PON; memset non sarà sufficiente.

Per eseguire il tipo di hack si parla qui correttamente, si dovrebbe davvero sospendere i thread nel processo mirato prima di pasticciare con il suo codice, e poi riprendere quando fatto. Ma in questo caso particolare, tale cura probabilmente non importa.

Altri suggerimenti

Io non sono troppo familiarità con Windows di debug (se è quello che si sta cercando di sfruttare qui), ma non credo che si sta facendo quello che pensi che stai facendo:)

Ogni processo ha la propria memoria virtuale (è per questo che di virtual ). Si sta tentando una scrittura 0x00409A7E nello spazio di indirizzamento virtuale del processo corrente, non il processo di gioco si sta cercando di incidere. Ottenere una maniglia per un altro processo non magicamente mappare gli indirizzi alla tua -. Dovete farlo attraverso alcuni ulteriori chiamate API Win

Modifica:

Credo che è necessario connettersi al processo vittima come un debugger, qualcosa come DebugActiveProcess . In caso contrario, il segmento di testo del gioco (è lì che le istruzioni siano) non è scrivibile dal processo.

Sei sicuro che la pagina (s) che si sta tentando di scrivere in realtà hanno i permessi di scrittura?

mi corregga se sbaglio, ma stai solo giocando GunRoar da ABA Games? In tal caso, il codice è apparentemente open source ed è effettivamente spedito nel file zip. Da dare un'occhiata molto veloce, si potrebbe solo bisogno di giocare con il membro "sinistra" nel metodo shipDestroyed () della InGameState (vedi gamemanager.d). Effettuare le correzioni necessarie che si desidera 'godmode', costruire, e poi mandare la posta per integrare le modifiche. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top