我想知道为什么这段代码不起作用:
#include <iostream>
using namespace std;
int main()
{
int *pointer = (int*)0x02F70BCC;
cout<<*pointer;
return 0;
}
在我看来它应该写在0x02F70BCC的屏幕值上, 而不是这个我的程序崩溃。 我知道带有地址0x02F70BCC的内存存储值为20。 但就像我说的那样,无论它是什么,都不想显示正确的数字。 请帮帮我们,详细的解释会对你很好。
答案 0 :(得分:5)
它不起作用,因为您无法访问所需内存中的每个位置。并非内存中的每个位置都有效,您可能需要阅读Virtual Address Space。
某些地址保留用于设备驱动程序和内核模式操作。可以为未初始化的指针保留另一个地址范围(例如0xCCCCCCCC
和更高)。
即使某个位置有效,操作系统仍可能拒绝从某个位置写入/读取,如果这会导致未定义的行为或违反系统安全。
修改强>
我认为您可能有兴趣创建某种&#34; GameHack&#34;,它允许您修改资源数量,单位数量,经验水平,属性或任何东西。
内存访问不是一个简单的主题。不同的操作系统使用不同的策略来防止安全违规。但是很多事情都可以在这里完成,毕竟有很多软件可以用来做这些事情。
首先,你真的需要编写自己的工具吗?如果你只是想要作弊,请使用ArtMoney - 这是一个很棒的记忆编辑器,我已经使用多年了。
但是如果你真的必须手动编写它,你需要先做一些研究。 例如,在Windows上,我将从这些开始:
另外,我很确定,可能的技巧之一就是假装你是一个调试器:
编辑2
我做了一些研究,它看起来,在Windows上(我认为这是你的平台,因为你提到了游戏;无法想象在糟糕的Linux上玩任何东西),编写另一个过程所需的步骤&#39;记忆是:
1。枚举流程:(EnumProcesses)
const size_t MAX_PROC_NUM = 512;
DWORD procIDs[MAX_PROC_NUM] = { 0 };
DWORD idsNum = 0;
if(!EnumProcesses(procIDs, sizeof(DWORD) * MAX_PROC_NUM, &idsNum))
//handle error here
idsNum /= sizeof(DWORD); //After EnumProcesses(), idsNum contains number of BYTES!
2. 打开所需的流程。 (OpenProcess,GetModuleFileNameEx)
const char* game_exe_path = "E:\\Games\\Spellforce\\Spellforce.exe"; //Example
HANDLE game_proc_handle = nullptr;
DWORD proc_access = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE; //read & write memory, query info needed to get .exe name
const DWORD MAX_EXE_PATH_LEN = 1024;
for(DWORD n = 0 ; n < idsNum ; ++idsNum)
{
DWORD current_id = procIDs[n];
HANDLE current_handle = OpenProcess(proc_access, false, current_id);
if(!current_handle)
{
//handle error here
continue;
}
char current_path[MAX_EXE_PATH_LEN];
DWORD length = GetModuleFileNameEx(current_handle, nullptr, current_path, MAX_EXE_PATH_LEN);
if(length > 0)
{
if(strcmp(current_path, game_exe_path) == 0) //that's our game!
{
game_proc_handle = current_handle;
break;
}
}
CloseHandle(current_handle); //don't forget this!
}
if(!game_proc_handle)
//sorry, game not found
3。写内存(WriteProcessMemory)
void* pointer = reinterpret_cast<void*>(0x02F70BCC);
int new_value = 5000; //value to be written
BOOL success = WriteProcessMemory(game_proc_handle, pointer, &new_value, sizeof(int), nullptr);
if(success)
//data successfully written!
else
//well, that's... em...
此代码只是&#39;按原样编写,但我没有看到任何错误,因此您可以将其作为起点。我还为我使用的所有功能提供了链接,因此通过一些额外的研究(如果需要),您可以实现您的目标。
干杯。
答案 1 :(得分:-1)
使用时,
cout<<*pointer;
程序尝试取消引用指针的值并将值写入地址。
如果您只想打印指针,请使用:
cout << pointer;
示例:
int main()
{
int i = 20;
int* p = &i;
std::cout << *p << std::endl; // print the value stored at the address
// pointed to by p. In this case, it will
// print the value of i, which is 20
std::cout << p << std::endl; // print the address that p points to
// It will print the address of i.
}