gpt4 book ai didi

c++ - 访问冲突

转载 作者:行者123 更新时间:2023-11-30 04:38:52 24 4
gpt4 key购买 nike

我一直在学习如何在 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 是 3 个字节长的 DEC 函数,以防止我失去生命。但是,每次我尝试它时,它都会使黑客崩溃并说我遇到了访问冲突。我试图查找原因,其中大部分与我正在写入的位置的大小以及我正在复制的内容有关。否则,我完全不知道。你能帮忙的话,我会很高兴。游戏是GunRoar,基地址“0x409A7E”是DEC函数所在的位置。

最佳答案

几个要点:

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

如前所述,您需要使用“WriteProcessMemory”来编写这些 NOP; memset 是不够的。

要正确执行您在此处讨论的黑客攻击类型,应该在处理代码之前真正挂起目标进程中的线程,然后在完成后恢复它们。但在这种特殊情况下,这种关心可能无关紧要。

关于c++ - 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2842479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com