如何通过另一个程序访问一个程序的内存变量?可能正在上钩

how to access the memory variables of one program by another ? may be hooking

这是第一个名为 hooktry.cpp

的程序
 #include <iostream>
 #include<stdio.h>
 using namespace std;

class c1{
int c=2;

public:

int * printadd()
{
    int *p=&c;
    printf("the address of c is %d\n",p);
    return p;

}
void printv()
{
    printf("the value is ===%d\n",c);
}



};

int main(int argc, const char * argv[]) {

int *p;
c1 mem;
char c;
p=mem.printadd();
mem.printv();
*p=12;
scanf("%c",&c);
mem.printv();
return 0;
}

输出: c的地址是1606416304
值为 ===2

同时运行另一个代码hooktry2.cpp

#include <iostream>
using namespace std;



int main(int argc, const char * argv[]) {
// insert code here...
int *p;

p=(int*)1606416304;
*p=23;

return 0;
}

我在这个
中遇到分段错误 hooktry2.cpp 无法访问 hooktry.cpp one
的内存 有没有办法通过修补操作系统来关闭这种保护
或者这是不可能的。
我正在研究 gamecheat 等恶意软件和挂钩程序...
或者这不是我正在做的钩子......

您不能像这样访问内存(至少在像您的 PC/Laptop 这样的复杂系统中)。 这是因为您在一个程序(进程)中看到的地址不是真实地址。他们是 Virtual Addresses,他们与 Real Addresses.

完全不同

让我尝试为您定义三个概念:

  • 物理地址: RAM 芯片(主存储器)中物理位置的地址。
  • Logical/Virtual 地址: 你的程序用来访问它的东西的地址。它通常稍后由硬件芯片 (MMU) 转换为物理地址(大多数情况下,甚至 CPU 都不知道这种转换)。
  • MMU:内存管理单元 (MMU),有时称为分页内存管理单元 (PMMU),是一种计算机硬件单元,所有内存引用都通过自身传递,主要执行虚拟内存地址到物理地址的转换。在 here.
  • 阅读更多相关信息

对于一个简单的系统(没有MMU),物理地址=虚拟地址。较大的系统通常是请求分页的虚拟内存系统,其中 MMU 将虚拟地址转换为物理地址,或警告 OS 采取行动(分配页面,从磁盘读取页面,或拒绝访问页面 -> 陷阱或故障)。通常,操作系统会为每个程序分配其自己的虚拟地址 space

在你的例子中,两个程序都有不同的虚拟内存地址space。您不能在属于另一个程序(进程)的一个程序中引用任何内容。这是因为如果您试图在您的某个程序中获取变量的地址,您将无法获取真实地址。您将获得的地址在您当前的程序中有效,如果您尝试将一个程序的地址用于另一个程序(进程)则没有任何意义。

因此,您尝试执行的操作将导致 UNDEFINED BEHAVIOR。在你的情况下,它导致 Segmentation Fault 作为你试图尊重的地址,没有在你程序的虚拟地址 space 中退出。虽然有几种技术可以用来实现你想要的。 Inter-process communication 是用于两个进程之间的通信技术的术语。下面给出的几个可以在 POSIX 系统中用于进程间通信:

  • 管道
  • 消息队列
  • 套接字
  • 内存映射
  • 共享内存

here 上阅读有关虚拟地址和物理地址的更多信息。