如何通过另一个程序访问一个程序的内存变量?可能正在上钩
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 上阅读有关虚拟地址和物理地址的更多信息。
这是第一个名为 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 上阅读有关虚拟地址和物理地址的更多信息。