[转组第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天] | 变量在内存中的位置和访问方式的主要内容,如果未能解决你的问题,请参考以下文章

[转组第7天] | 函数的工作原理

[转组第2天] | baby_mips和android xss的调研

[转组第5天] | 天枢分享Reverse入门

[转组第3天] | 黑盒测试

[转组第10天] | Android6.0.0_r1源码编译和POC程序的编译

JavaScript学习:变量作用域和内存问题