Нарушение доступа - PullRequest
       28

Нарушение доступа

1 голос
/ 16 мая 2010

Я изучал, как выполнять 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.

Ответы [ 4 ]

1 голос
/ 16 мая 2010

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

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

Как уже упоминалось ранее, вам нужно использовать «WriteProcessMemory» для записи этих NOP; memset не хватит.

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

1 голос
/ 16 мая 2010

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

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

Edit:

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

0 голосов
/ 16 мая 2010

Поправьте меня, если я ошибаюсь, но вы просто играете в GunRoar из ABA Games? Если так, то код, очевидно, с открытым исходным кодом и фактически поставляется в zip-файле. После того, как вы по-настоящему быстро посмотрите, вам может понадобиться поиграть с «левым» членом в методе shipDestroyed () InGameState (см. Gamemanager.d). Сделайте необходимые исправления, которые вы хотите «GodMode», соберите, а затем отправьте им по электронной почте, чтобы интегрировать ваши изменения. :)

0 голосов
/ 16 мая 2010

Вы уверены, что страницы, которые вы пытаетесь написать, действительно имеют права на запись?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...