【问题标题】:how to access the memory variables of one program by another ? may be hooking如何通过另一个程序访问一个程序的内存变量?可能在勾搭
【发布时间】:2017-01-02 06:24:42
【问题描述】:

这是第一个名为 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 一的内存
有没有办法通过修补操作系统来关闭这种保护
或者这是不可能的。
我正在研究恶意软件和挂钩程序,例如游戏作弊等...
或者这不是我在做的钩子......

【问题讨论】:

  • 这不是您读取其他进程内存的方式。通常你会使用OS specific system calls 来做类似的事情
  • 这可以在 20 年前使用 DOS 6.1 的 IBM PC 上运行。欢迎来到 21 世纪。
  • “我正在研究像游戏作弊这样的恶意软件和钩子程序” - 很高兴看到你完全无法做到这些。

标签: c++ hook


【解决方案1】:

您无法像这样访问内存(至少在您的 PC/笔记本电脑这样的复杂系统中)。 这是因为您在一个程序(进程)中看到的地址不是真实地址。它们是Virtual Addresses,它们与Real Addresses 完全不同。

让我试着为你定义三个概念:

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

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

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

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

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

通过here 阅读更多关于虚拟和物理地址的信息。

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多