Вопрос

Я изучаю, как функции NOP в C ++ или даже C, но об этом очень мало учебных пособий. Я протягивал за последние несколько часов, и я просто застрял. Вот мой код.

#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;
}

Это предполагается, что включить функцию DEC, которая представляет собой 3 байта, не позволяя мне потерять жизни. Однако каждый раз, когда я это стараюсь, это разрушает взлом и говорит, что у меня есть нарушение доступа. Я пытался посмотреть причины, и большинство из них имели дело с размером места, с которой я пишу, и что я копирую. В противном случае я не имею абсолютно понятия. Любая помощь была бы хорошей. Игра Gunroar и базовый адрес "0x409a7e" - это то, где функция DEC есть.

Это было полезно?

Решение

Несколько быстрых моментов:

«VirtualProtect» работает только в вашем текущем процессе. Используйте «VirtualProtectex» для изменения разрешений целевого процесса. И я бы предложил вам установить разрешение «PAGE_EXECUTE_READWRITE» - пишет, но все еще исполняется.

Как уже упоминалось ранее, вам нужно использовать «writeProcessmory», чтобы написать эти NOP; Memset не хватает.

Чтобы выполнить тип взлома, о котором вы говорите здесь правильно, нужно действительно приостановить потоки в целевой процессе, прежде чем умаснуть с этим кодом, а затем возобновить их при выполнении. Но в этом конкретном случае такая забота, вероятно, не имеет значения.

Другие советы

Я не слишком знаком с отладкой Windows (если это то, что вы пытаетесь использовать здесь), но я не думаю, что вы делаете то, что вы думаете, вы делаете :)

Каждый процесс имеет свою виртуальную память (вот почему это виртуальный). Вы пытаетесь написать на 0x00409A7E В виртуальном пространстве текущего процесса, а не игровой процесс «Вы пытаетесь взломать. Получение рукоятки к другому процессу не волшебно отображает своих адресов к вам - вы должны сделать это через некоторые дополнительные вызовы WIN API.

Редактировать:

Я думаю, что вам нужно прикрепить к процессу жертвы как отладчик, что-то вроде DebugActiveProcess. Отказ В противном случае текстовый сегмент игры (вот где указаны инструкции), не является записью вашего процесса.

Вы уверены, что страницы (ы), которые вы пытаетесь написать на самом деле иметь разрешения на запись?

Поправьте мне, если я ошибаюсь, но просто играете в Гуноруар из игр ABA? Если это так, код, по-видимому, открытый источник и на самом деле поставляется в Zip-файле. От того, что вам действительно быстрый взгляд, вам может просто нужно играть с «левым» участником в Shipdested () метода заграгестата (см. Gamemanager.D). Сделайте необходимые исправления, которые вы хотите «Godmode», построить, а затем отправьте их почту, чтобы интегрировать ваши изменения. :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top