指针和内存地址的问题

时间:2015-03-26 21:41:55

标签: c++

我想知道为什么这段代码不起作用:

#include <iostream>
using namespace std;
int main()
{
int *pointer = (int*)0x02F70BCC;
cout<<*pointer;
return 0;
}

在我看来它应该写在0x02F70BCC的屏幕值上, 而不是这个我的程序崩溃。 我知道带有地址0x02F70BCC的内存存储值为20。 但就像我说的那样,无论它是什么,都不想显示正确的数字。 请帮帮我们,详细的解释会对你很好。

2 个答案:

答案 0 :(得分:5)

它不起作用,因为您无法访问所需内存中的每个位置。并非内存中的每个位置都有效,您可能需要阅读Virtual Address Space

某些地址保留用于设备驱动程序和内核模式操作。可以为未初始化的指针保留另一个地址范围(例如0xCCCCCCCC和更高)。

即使某个位置有效,操作系统仍可能拒绝从某个位置写入/读取,如果这会导致未定义的行为或违反系统安全。

修改

我认为您可能有兴趣创建某种&#34; GameHack&#34;,它允许您修改资源数量,单位数量,经验水平,属性或任何东西。

内存访问不是一个简单的主题。不同的操作系统使用不同的策略来防止安全违规。但是很多事情都可以在这里完成,毕竟有很多软件可以用来做这些事情。

首先,你真的需要编写自己的工具吗?如果你只是想要作弊,请使用ArtMoney - 这是一个很棒的记忆编辑器,我已经使用多年了。

但是如果你真的必须手动编写它,你需要先做一些研究。 例如,在Windows上,我将从这些开始:

ReadProcessMemory

WriteProcessMemory

另外,我很确定,可能的技巧之一就是假装你是一个调试器:

DebugActiveProcess

编辑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. 打开所需的流程。 (OpenProcessGetModuleFileNameEx

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.
}