首页
论坛
专栏
课程

[调试逆向] [原创]静态变量的底层实现

2019-6-28 17:50 1390

[调试逆向] [原创]静态变量的底层实现

2019-6-28 17:50
1390

静态变量有局部静态变量(作用域内的静态变量),全局静态变量,然而他们的实现和全局变量是一样的,而局部静态变量只能在作用域访问是C语言的优化。

局部静态变量不会随作用域结束而销毁,并且在未进入作用域之前就已经存在,其生命周期也与全局变量相同。局部静态变量和全局变量都保存在执行文件中的数据区中。

局部静态变量会预先被作为全局变量处理,而它的初始化部分,只是在做赋值操作而已。

在C++语法中局部静态变量只能被初始化一次,编译器的内部实现如下


上述代码首先从004257cc处取出1字节内容进行判断,这个byte的内容实际上就是局部静态变量初始状态的一个标志,这个标志占1字节,通过位运算,将标志的一位置1,而1个字节占8位,so这个标志可以同时表示8个局部静态变量的初始状态。

标志坐在的内存地址在最先定义的局部静态变量地址的附近,如最先定义的整型局部静态变量在地址0x004257C0处,那么标记位地址通常在0x004257C4或0x004257BC处。当同一作用域内超过8个局部静态变量时,下一个标记位将会在第9个定义的局部静态变量地址附近。




[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-7-17 04:24 被Hasic编辑 ,原因: 乱码修改
最新回复 (6)
Hasic 2019-6-28 17:57
2
0
原文地址   https://basicbit.cn/2018/10/20/2018-10-20-%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/
myangel 2019-6-28 18:34
3
0
。。。。。原创?
killpy 2 2019-7-1 14:14
4
0
没看明白 楼主能否讲得再细致一点呢
Hasic 2019-7-15 08:56
5
0
killpy 没看明白 楼主能否讲得再细致一点呢
每个静态变量都会在有一个BIT位置存储它的初始化状态,这个BIT位会在static变量地址的附近,第一次初始化判断BIT位是否为1,如果是1跳过赋值代码,如果不是1,赋值为1 (or 指令)。
Hasic 2019-7-15 08:57
6
0
killpy 没看明白 楼主能否讲得再细致一点呢
文中代码
void Static(int nNum)
{
    static int g_nNum = nNum;
    xor eax,eax
    mov al,byte ptr['Static'::'2'::$$1 (004257cc)]
    and eax,1
    test eax,eax
    jne pp
    mov cl,byte ptr['Static'::'2'::$$1 (004257cc)]
    or cl,1
    mov byte ptr['Static'::'2'::$$1 (004257cc)], cl
    mov edx,[ebp + 8]
    mov [_sbh_sizeHeaderList+4 (004257c8)],edx
pp:
    printf("%d", g_nNum);
}
killpy 2 2019-7-21 13:54
7
0
Hasic 文中代码 void Static(int nNum) { static int g_nNum = nNum; xor eax,eax mov al,byte ptr[ ...
知道了 感谢
游客
登录 | 注册 方可回帖
返回