news 2026/7/23 22:35:31

反汇编变量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
反汇编变量

反汇编变量

全局变量

全局变量和常量有着相似的性质,都是在程序执行之前就存在了。常量在PE的不可写数据节中,全局变量和局部变量在PE的可读可写数据节中。

下面来看一个简单的例子:

#include<stdio.h>intg_num=0x12345678;intmain(){printf("%d\r\n",g_num);return0;}

调试该程序时我们发现传递g_num变量的时候,直接传递了一个常数地址。我们用该地址减去模块的加载起始地址,就得到了该变量的相对虚拟地址。

通过PE分析工具,我们就可以利用该相对虚拟地址在可执行文件中找到该变量。

具有初始值的全局变量,其值在链接时被写入创建的PE文件中,当用户执行该文件时,操作系统先分析这个PE中的数据,将各节中的数据填入对应的虚拟内存地址中。这时全局变量就已经存在了,PE的分析和加载工作完成后,才开始执行入口点的代码。

由于这种性质,可以解释为什么全局变量会有一个默认值。

访问全局变量与访问常量类似,都是通过立即数访问。由于全局变量在编译期就已经确定了地址,因此编译器在编译的过程中可以计算出一个固定的地址值。

若定义多个全局变量,它们的内存地址根据定义先后从低到高排列。

局部变量

局部变量和全局变量最大的区别就是声明周期不同,在访问的限制上是编译期检测的。在访问方式上,局部变量是通过栈指针相对间接访问的,而全局变量的内存地址在全局数据区中,通过栈指针无法访问到。

访问局部变量是通过esp和ebp进行访问的。

定义多个局部变量,它们的内存地址是从高到低排列的。

局部静态变量

全局静态变量和全局变量相似,只是在访问范围上不同,前者只能在当前文件中访问。

实际上,局部静态变量和全局变量都保存在执行文件的数据区中,但由于局部静态变量被定义在某一作用域内,让我们产生了错觉,误认为此处为它的生命起始点。实则不然,局部静态变量会预先被作为全局变量处理,而它的初始化部分只是在做赋值操作而已。

对于局部静态变量,在汇编层面上会使用一个标志来检测静态局部变量是否被初始化过。这个标志是区分全局变量和局部静态变量的重要依据。初始化的过程可以类比单例模式。在c++11之前静态局部变量的初始化不是线程安全的。

既然局部静态变量和全局变量一样都保存在执行文件的数据区中,那么如何避免函数外部访问该局部静态变量呢?答案是永固名称粉碎法,对变量的名称进行适当的修改。C++的函数重载也是如此,同样是先粉碎函数名称再组合出新名称)。

堆变量

堆变量的识别要点是调用了malloc或者new(实际上掉哟个了malloc)初始化。堆在内存中由一个结构体体现,结构体中除了保存有堆数据的指针,还有上溢和下溢检测标志字节,还包括堆的大小,使用次数等。

在指定了-MDd编译选项的情况下,在堆变量指向的内存中,前后分别有四个字节的0xFD,这是避免内存上溢和下溢的保护字节。如果没有指定使用-MDd编译选项,那么编译器为了优化程序的运行速度和程序的大小,会优化掉这些字节,在内存中就看不到结构体中的内容。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 18:08:32

数组作为参数

数组作为参数 当数组作为参数传递的时候&#xff0c;实际上传递的是数组的首地址&#xff0c;在语法上来说传递的是一个指针变量。 #include <stdio.h> #include <string.h>void getArrLen(char buffer[]) {printf_s("using sizeof: %zd\n", sizeof(buff…

作者头像 李华
网站建设 2026/7/20 22:47:27

蜜罐技术-德迅猎鹰

什么是蜜罐&#xff1f;蜜罐是一种主动防御技术&#xff0c;通过主动的暴露一些漏洞、设置一些诱饵来引诱攻击者进行攻击&#xff0c;从而可以对攻击行为进行捕获和分析。原理是什么&#xff1f;蜜罐可以故意暴露一些易受攻击的端口&#xff0c;使这些端口保持在开放状态&#…

作者头像 李华
网站建设 2026/7/23 22:26:34

Daily Report — Day 9 (Beta)

Daily Report — Day 9 (Beta)&#x1f4c5; 日期&#xff1a;2025/12/16&#x1f465; 参与人&#xff1a;zc、lzy、shr、zmj、xhy✅ 昨日完成工作&#xff08;Day 8 落地成果&#xff09;推荐模块稳定性修复&#xff08;zc&#xff09;对现有权重计算逻辑进行边界检查与异常兜…

作者头像 李华
网站建设 2026/7/18 7:25:20

Seed-Coder-8B-Base与SonarQube智能集成路径

Seed-Coder-8B-Base与SonarQube智能集成路径 在现代软件交付的节奏中&#xff0c;我们早已习惯了两种“声音”&#xff1a;一种来自IDE里流畅的代码补全提示&#xff0c;另一种则是CI流水线上冷冰冰的质量门禁失败通知。前者鼓励你加速前进&#xff0c;后者却总在关键时刻踩下刹…

作者头像 李华
网站建设 2026/7/23 18:23:36

基于CentOS7 DM8单机部署配置记录-20251216

前言 学习动力&#xff0c;源于兴趣和需求&#xff0c;最近接到内部需求&#xff0c;说要本地部署一个DM8给开发同学进行做开发适配&#xff0c;然后就开始了进行部署之旅。 下载地址如下&#xff1a; DM官方下载地址 选择对应版本&#xff0c;进行下载安装包。 一、安装前…

作者头像 李华
网站建设 2026/7/22 3:22:05

大模型入门:预训练、微调和蒸馏,一篇文章全掌握

本文详细介绍了大模型训练的三大核心技术&#xff1a;预训练&#xff08;海量无标注数据培养通用能力&#xff09;、微调&#xff08;专业数据优化特定任务&#xff09;和蒸馏&#xff08;大模型知识迁移至小模型&#xff09;。文章通过生动比喻和具体实现方式&#xff0c;帮助…

作者头像 李华