C++写进程的受保护内存
所以我决定开始进入内存编辑,以便能够为游戏制作更多的工具。看到游戏通过使用作弊引擎或其他内存编辑软件修补了作弊的网络版本,我决定尝试自己制作一个内存编辑工具,但使用了android模拟器NoxPlayer,因为他们没有在手机上修补该方法,但没有人知道该方法 无论如何,我以前遇到过这样的问题,作弊引擎本身在Nox上编辑内存,因为内存很可能受到保护。但是,通过对作弊引擎进行一些设置更改,我就可以在模拟器上编辑游戏中的内存 <>这是我的C++应用程序,它可以读取从地址抓取的内存,但它不能写入内存地址。p> 所以我想知道是否有人能帮我找到一个解决方案,能够通过模拟器中的受保护内存来改变值 也将在下面提供我当前代码的一部分,尽管那里可能不需要它C++写进程的受保护内存,c++,memory,c++-cli,protection,C++,Memory,C++ Cli,Protection,所以我决定开始进入内存编辑,以便能够为游戏制作更多的工具。看到游戏通过使用作弊引擎或其他内存编辑软件修补了作弊的网络版本,我决定尝试自己制作一个内存编辑工具,但使用了android模拟器NoxPlayer,因为他们没有在手机上修补该方法,但没有人知道该方法 无论如何,我以前遇到过这样的问题,作弊引擎本身在Nox上编辑内存,因为内存很可能受到保护。但是,通过对作弊引擎进行一些设置更改,我就可以在模拟器上编辑游戏中的内存 这是我的C++应用程序,它可以读取从地址抓取的内存,但它不能写入内存地址。p>
private: System::Void backgroundWorker3_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) {
button1->Text = "Stop Spoofing";
string ac;
MarshalString(sid->Text, ac); // made a function to convert system string to std string
stringstream stream(ac);
stream >> value; // setting value to write to memory
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
while (true)
{
if (backgroundWorker3->CancellationPending == true)
{
e->Cancel = true;
break;
}
else
{
if (DoesTxtExist())
{
for (int i(0); i < address.size(); ++i)
{
WriteProcessMemory(handle, (LPVOID)address[i], &value, sizeof(value), 0);
ReadProcessMemory(handle, (PBYTE*)address[i], &readTest, sizeof(int), 0);
}
label1->Text = L"Spoofing ID: "+readTest.ToString()+" "+value.ToString();
// was doing something like this to check if the values changed, but of course they didn't.
}
}
}
}
用于在写入尝试之前将内存保护更改为可写。使用PROCESS\u ALL\u ACCESS打开句柄不会自动使整个进程内存可写。您必须以管理员身份运行。您还可能需要SeDebugPrivilege令牌权限 您可以使用清单文件将应用程序设置为需要管理员模式 您可以从以下位置使用此功能设置SeDebugPrivilege 公共类 { [DllImportadvapi32.dll,ExactSpelling=true,SetLastError=true] 内部静态外部bool调整令牌权限INTPTR htok,bool disall, 参考第1版流体新闻、内部透镜、内部透镜、内部透镜和内部透镜; [DllImportkernel32.dll,ExactSpelling=true] 内部静态外部IntPtr GetCurrentProcess; [DllImportadvapi32.dll,ExactSpelling=true,SetLastError=true] 内部静态外部bool OpenProcessTokenIntPtr h、int acc、ref IntPtr phtok; [DllImportadvapi32.dll,SetLastError=true] 内部静态外部布尔LookupPrivilegeValuestring主机,字符串名称, 长冥王星; [StructLayoutKind.Sequential,Pack=1] 内部结构1 { 公共整数计数; 公众长吕德; 公共int Attr; } 内部常量int SE_特权_ENABLED=0x00000002; 内部const int TOKEN_QUERY=0x00000008; 内部const int TOKEN_ADJUST_PRIVILEGES=0x00000020; 内部常量字符串SE_TIME_ZONE_NAMETEXT=SeTimeZonePrivilege//http://msdn.microsoft.com/en-us/library/bb530716VS.85.aspx 私人布尔塞特普里夫酒店 { 尝试 { 布尔-雷特瓦尔; 托卡马克; IntPtr hproc=GetCurrentProcess; IntPtr htok=IntPtr.0; retVal=OpenProcessTokenhproc,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,ref htok; tp.Count=1; tp.Luid=0; tp.Attr=SE_特权已启用; retVal=LookupPrivilegeValuenull,SE_时区_名称文本,参考tp.Luid; retVal=AdjustTokenPrivilegeshtok,false,ref-tp,0,IntPtr.Zero,IntPtr.Zero; 返回返回; } 捕获异常 { 投 返回false; } } } 一旦这两件事被排除,如果您试图覆盖任何代码,它将位于模块的代码部分,该部分将具有执行权限,但不具有写入权限 要获得写入权限,必须对要修改的内存位置调用VirtualProtectEx。我没有这方面的C代码段,但我基本上有一个WriteProcessMemory的包装器,它在之前和之后调用VirtualProtectEx,如下所示
void PatchEx(HANDLE hProc, char* dst, char* src, const intptr_t size)
{
DWORD oldprotect;
VirtualProtectEx(hProc, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
WriteProcessMemory(hProc, dst, src, size, nullptr);
VirtualProtectEx(hProc, dst, size, oldprotect, &oldprotect);
}
我想,你可以很容易地重新创建一个C。然后,无论何时要写入内存,请使用此功能确保页面内存保护常数设置正确。不幸的是,这对我不起作用。虽然我确实觉得我可能做错了,所以我会提供一个截图给你我的代码,这样你可能会帮助我更多。或者如果这不起作用:这些函数返回什么?你检查他们的错误报告了吗?另外,你不需要为每个字节调用VirtualProtectEx,它可以在页面上工作。我没有看到任何错误,但基本上在我的程序中,当它读取数据时,它仍然是一样的,这里是激活时程序的屏幕截图。但同样,游戏中的值不会改变。也许Nox模拟器保护得太好了?