[转组第8天] | 变量在内存中的位置和访问方式
Posted nww-570
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转组第8天] | 变量在内存中的位置和访问方式相关的知识,希望对你有一定的参考价值。
2018-05-05
《C++反汇编和逆向技术》第七章 变量在内存中的位置和访问方式 读书笔记
1.全局变量和局部变量的区别
全局变量属于进程作用域,也就是说,在整个进程中都能够访问到这个全局变量。静态变量属于文件作用域,在当前源码文件内可以访问到;局部变量属于函数作用域,在函数内部可以访问到;在“{}”语句块内定义的变量,属于块作用域,只能在定义变量的“{}"快内访问到。
全局变量在内存中的地支顺序是先定义的变量在低地址,后定义的变量在高地址。
全局变量的特征如下:
* 所在地址为数据区,生命周期与所在模块一致;
* 使用立即数间接访问。//[g_nVar]
局部变量的特征如下:
* 所在地址为栈区,生命周期与所在的函数作用域一致;
* 使用ebp或esp间接访问。
2. 局部静态变量的工作方式
静态变量分为全局静态变量和局部静态变量,全局静态变量和全局变量类似,只是全局静态变量只能在本文件内使用。但这只是在编译之前的语法检查过程中,对访问外部的全局静态变量做出的限制。全局静态变量的生命周期和全局变量也是一样的,而且在反汇编代码中它们也无二样。
局部静态变量比较特殊,它不会随作用域的结束而消失,并且在未进入作用域之前就已经存在,其生命周期也和全局变量相同。局部静态常量会被预先被作为全局变量处理,而它的初始化部分只是在做赋值操作而已。
局部静态变量只初始化一次,因为其有一个标志位,如果为0则赋值初始化,否则赋值。标志位大小为1个字节,可以表示8个局部静态变量的状态。
如果初始化的数值为常量,即多次初始化也不会产生变化,编译器就直接采用全局变量方式处理,优化了代码,提升了效率。为了使其不超出作用域访问,使用名称粉碎法,在编译期将静态变量重新命名,在原有名称中加入其所在作用域以及类型等信息。
3. 堆变量
malloc与new实现堆空间的申请。
free与delete完成对空间释放。
堆空间的分配类似于商场中的商铺管理,malloc是从商场的空地中划分出一块作为商铺,而new则可以将划分好的商铺直接租用。由于malloc缺少商铺的营业范围规定,因此需要将申请好的堆强制转换以说明其类型方可使用,而new则无需这种操作,直接可以使用。
在对数据末尾也加入了0xFDFDFDFD,这是向下越界的检查标志,这是程序编译方式为Debug版的重要特征之一。
以上是关于[转组第8天] | 变量在内存中的位置和访问方式的主要内容,如果未能解决你的问题,请参考以下文章
[转组第2天] | baby_mips和android xss的调研