[C++逆向] 7 变量在内存中的位置和访问方式
2021-02-07 21:19
标签:http 链表 百度 虚拟 操作系统 线索 相同 逆向 执行文件 块作用域举例 用户在运行文件的时候,操作系统线分析这个PE中的数据,将各个节中的数据填入对应的虚拟地址中,此时全局变量已经存在了,等PE的分析和加载完成之后,才开始执行入口点的代码,因此全局变量不受作用域影响,程序的任何位置都可以被访问到。 通过变量2访问变量1 (但是该代码在Release版本中不成立 书上的bug 哈哈) 局部静态变量实际上和全局变量是一样的,都保存再执行文件的数据区,局部静态变量会预先被当作全局变量处理,初始化实际上只是赋值 和全局变量内存结构和访问原理上是一样的,相当于全局静态变量,等价u有限制外部源码文件访问的全局变量 以上代码执行之后结果是什么呢? 结果居然是五个0,为什么呢?我各种仔细检查代码,发现啥问题都没有。通过调试发现,第7行执行过后,j变量还是0。 最后,书上给了答案,原因是因为为了保证局部静态变量只能被初始化一次,编译器在局部静态变量内存周围做了一个标记,每次通过检查标记判断是否已经被初始化了。如果初始化了就直接跳过。 但是!!!!!!!!! 经过我实际操作发现,上面的方法是vc6的方法,在我用的vs2019中似乎使用了新的方法。。。 这样让我很头大,但是发现了线索,就是_tls_index翻译过来就是tls索引?tls似乎听过!似乎有一个特殊的节表就是tls!通过百度,知道了tls是线程局部储存的意思。而fs里面包含了很多指针,通过查询 2Ch偏移指向的正是 线程局部储存,所以,是否可以认为,新的编译器使用了线程局部储存的方式来标记静态变量呢? 通过修改代码,把代码改成下图,可以得到正确结果。 [C++逆向] 7 变量在内存中的位置和访问方式 标签:http 链表 百度 虚拟 操作系统 线索 相同 逆向 执行文件 原文地址:https://www.cnblogs.com/cjdty/p/12774310.html
变量类型
作用域
可访问
全局变量
进程作用域
整个进程可访问
静态变量
文件作用域
当前代码文件可访问
局部变量
函数作用域
函数内可访问
{}内变量
块作用域
只能在{}内访问
全局变量和局部变量的区别
局部静态变量
有意思的
堆变量
上一篇:Java几种常用的循环
下一篇:http请求 常见状态码
文章标题:[C++逆向] 7 变量在内存中的位置和访问方式
文章链接:http://soscw.com/index.php/essay/52346.html