Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存黑客攻击/内存分配:为什么这样做?如何?_C++_C_Memory - Fatal编程技术网

C++ 内存黑客攻击/内存分配:为什么这样做?如何?

C++ 内存黑客攻击/内存分配:为什么这样做?如何?,c++,c,memory,C++,C,Memory,我知道的是,你在试图操作的软件中寻找一些变量的地址。一旦你找到了它,你就试着找到它的“基指针”,这样无论进程在哪里,你都可以访问这些变量。我的意思是当进程重新启动时,变量会有不同的地址,但你仍然知道它们在哪里 现在我不明白为什么这是可能的 < P>让我在C++中这样做:< /P> int *x = (int*)malloc(sizeOf(int)); 这不是动态的吗?难道x不应该被放在一个“随机”的地址,当时是免费的吗? 基本上我要问的是,当代码被执行时,x到底在哪里 编辑:我的意思是,像健康

我知道的是,你在试图操作的软件中寻找一些变量的地址。一旦你找到了它,你就试着找到它的“基指针”,这样无论进程在哪里,你都可以访问这些变量。我的意思是当进程重新启动时,变量会有不同的地址,但你仍然知道它们在哪里

现在我不明白为什么这是可能的

< P>让我在C++中这样做:< /P>
int *x = (int*)malloc(sizeOf(int));
这不是动态的吗?难道x不应该被放在一个“随机”的地址,当时是免费的吗? 基本上我要问的是,当代码被执行时,x到底在哪里

编辑:我的意思是,像健康状况这样的变量通常存储在game.exe+0000caff这样的地址中,然后您总是可以在那里找到它们

难道x不应该放在一个“随机”的地址,而这个地址在当时是免费的吗

如果在操作系统中运行一个进程,实际使用的指针值可能会寻址特定类型的虚拟地址空间,这些虚拟地址空间与一个具体的RAM和ROM地址区域相关联,并且由操作系统管理


因此,如果按顺序执行相同的动态存储持续时间de-/分配,则这些分配很可能在每次运行程序时收到相同的(虚拟)地址。这个级别没有随机变量。

x
是一个包含整数地址的变量

malloc
在堆上分配内存,但
x
仍位于堆栈上(如果在函数中声明)

然而,您的程序有不同的内存部分,一个用于全局变量和常量,一个用于源代码,一些用于资源,一个用于动态内容(堆)和其他一些

假设您的
x
位于全局变量的部分,并指向堆。然后
x
有一个静态地址

这个地址可以通过汇编程序指令在源代码部分找到,如
moveax,[0x123]
。 此汇编指令还有一个地址,该地址与指令所在的模块有关。这些模块可以动态加载(例如通过LoadLibrary),但模块基址到指令的偏移量是固定的

要获取
x
指向的数据:

base = getModuleBaseAddress("modulename")
addressOfX = base + offset
valueOfX = *addressOfX
大多数对象不在堆栈上,可以由模块地址、跳转到使用对象指针的指令的固定偏移量和获取对象变量的某些偏移量引用


要查找内存中的对象,还可以使用模式扫描来扫描内存。

以下是从32位x86体系结构的角度来看的,其他体系结构可能会有不同的做法。另外,我假设一行代码在一个函数中

首先,请记住声明
int*x
的含义,它大致可以理解为“变量x将包含整数的地址”

变量
x
是一个局部变量(或自动变量),这意味着它的位置在编译时确定,并且在激活函数时为它分配存储空间(很可能在堆栈上)

x
中包含的值是一个动态地址(可能位于堆上)

因此,变量
x
和函数激活框架中的某个位置之间存在绑定。原谅可怜的ASCII艺术,比如 这(地址是概念性的,还请记住堆栈会向下扩展):

~~
|            |
+------------+

0x04000 | |除其他事项外,将依赖于操作系统。你没有提供足够的信息让我们知道你是如何“黑客”你的目标可执行文件的。您可能还需要查看汇编程序的输出,以了解存储内容的方式。“一旦找到它,您就可以尝试找到它的“基本指针”,这样无论进程在哪里,您都可以访问这些变量。”请给出一个实际示例,说明重复运行流程时,
x
的值是如何相同的。还要记住,有一些概念,比如进程的虚拟地址空间,这取决于实际使用的操作系统的策略。我的意思是,为什么x地址与进程的偏移量相同,而它应该是动态的?@vlatkozelka:我想这里有一个困惑
x
似乎是一个全局指针,全局指针几乎每次都处于相同的偏移量。它指向一个“当时免费的随机地址”。即使
x
是某个函数的局部函数,它们有时也可能每次都以相同的偏移量结束,这取决于它的编程方式。我说的每件事都有一千个例外,比如“这不是动态的吗?x不应该被放在一个“随机”的地址中吗?是的,但是程序包含一个指向它的指针。。。实际上,
*x
位于“随机”地址。不是
x
             ~            ~
             |            |
             +------------+
    0x04000  |            |<----   ebp
             +------------+
             |            |
             +------------+
    0x03ff8  |     x      | 
             +------------+
             |            |
             +------------+
    0x03ff0  |            |<----  esp
             +------------+