反汇编分析——全局、局部、静态、堆变量

反汇编分析——全局、局部、静态、堆变量_第1张图片

在可执行文件编译的时候就已经存储在固定的位置了,甚至还可以跨文件共享,因为他本身就是静态的,固定在文件当中的嘛

反汇编窗口就是直接拿指针解引用,也就是拿这个地址来访问的,直接寻址

反汇编分析——全局、局部、静态、堆变量_第2张图片

自动变量,不用我们手动释放,当函数执行结束之后就会自动释放空间 

局部变量就是保存在栈空间当中的,每个线程都有它自己的函数调用栈,保存了函数调用关系,以及函数内部的局部变量。函数返回,局部变量就消失了。

反汇编分析——全局、局部、静态、堆变量_第3张图片

begbug版对局部变量的访问都是通过ebp-XX来实现的,而release版则是直接通过esp来寻址局部变量的,这里的寄存器相对寻址,就是通过esp/ebp加减一个数来实现对内存地址的访问的。

反汇编分析——全局、局部、静态、堆变量_第4张图片

 局部静态变量是在一个函数的内部,在别的函数是不能够访问的

反汇编分析——全局、局部、静态、堆变量_第5张图片

test eax,eax; jne 0x1234 》jne里面的e就是等于0的意思

反汇编分析——全局、局部、静态、堆变量_第6张图片

0x427e4c是存放标志位的地址,如果静态变量<=8个,就使用一个字节来存储标志位,否则就再加N个字节,0x427e48紧挨着它存放的就是i的数值。

最后输出的全是0:因为static只有最开始的时候会被初始化,然后把标志位置1,后面就不会执行这个初始化的语句,而直接执行printf,如果想让它的值改变的话也很简单:

static int i=n;
i=n;
printf("%d\n",i);

说白了,就是除了初始化之后你再修改一下这个i的值就可以了。

使用一个常量来初始化静态变量

反汇编分析——全局、局部、静态、堆变量_第7张图片

总结一下静态变量的一个重要特征就是它有一个标志位,一旦被初始化过了,就不会再被初始化了

反汇编分析——全局、局部、静态、堆变量_第8张图片

 反汇编分析——全局、局部、静态、堆变量_第9张图片

 反汇编分析——全局、局部、静态、堆变量_第10张图片

其中前后4个FD是用来检查对空间是否越界的,中间的CD是默认的数据,可以在申请之后memset一下申请的堆空间,返回的首地址就如图所示。

堆空间是使用双向链表_CrtMemBlockHeader这种数据结构连接起来的 

反汇编分析——全局、局部、静态、堆变量_第11张图片

你可能感兴趣的:(逆向学习,windows,c语言,c++,汇编)