访问违规

时间:2010-05-16 03:19:41

标签: c++ memory access-violation memcpy

我一直在学习如何在C ++甚至C中使用NOP函数,但是很少有关于它的在线教程。我现在一直在谷歌搜索过去几个小时,我只是被卡住了。这是我的代码。

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

这是假设NOP的DEC函数长3个字节,防止我失去生命。但是,每次我尝试它,它都会破坏黑客并说我有访问权限。我试图查找原因,其中大部分都处理了我写的位置的大小以及我正在复制的内容。否则,我完全不知道。你能帮忙的话,我会很高兴。游戏是GunRoar,基地址“0x409A7E”是DEC功能的地方。

4 个答案:

答案 0 :(得分:1)

我对Windows调试不太熟悉(如果这是你在这里试图利用的),但我认为你没做你认为你在做的事情:)

每个进程都有自己的虚拟内存(这就是虚拟的原因)。您正在尝试在当前进程的虚拟地址空间中写入0x00409A7E,而不是您正在尝试攻击的游戏进程。获取另一个进程的句柄并不会奇怪地将其地址映射到您的地址 - 您必须通过一些额外的Win API调用来完成它。

编辑:

我认为你需要作为调试器附加到受害者进程,例如DebugActiveProcess。否则,您的过程无法写入游戏的文本段(指令所在的位置)。

答案 1 :(得分:1)

一些快速点:

'VirtualProtect'仅适用于您当前的流程。使用“VirtualProtectEx”更改目标进程的权限。我建议您设置权限'PAGE_EXECUTE_READWRITE' - 可写,但仍可执行。

如前所述,你需要使用'WriteProcessMemory'来编写那些NOP; memset是不够的。

要执行你在这里正确讨论的hack类型,你应该在使用它的代码之前暂停目标进程中的线程,然后在完成后恢复它们。但在这个特殊情况下,这种关心可能并不重要。

答案 2 :(得分:0)

您确定您尝试写入的页面实际上具有写入权限吗?

答案 3 :(得分:0)

如果我错了,请纠正我,但你刚刚从ABA Games玩GunRoar吗?如果是这样,代码显然是开源的,实际上是在zip文件中提供的。从快速查看,您可能只需要在InGameState的shipDestroyed()方法中使用“left”成员(请参阅gamemanager.d)。进行必要的修复,你想要'godmode',构建,然后发送邮件来整合你的更改。 :)