文章目录
- 数组初始化的编译模式特征
- 1. **局部数组存储位置**
- 2. **显式初始化部分**
- 3. **未显式初始化部分的处理**
- 4. **内存布局特征**
- 5. **编译器优化特征**
- 6. **初始化模式识别**
- 7. **逆向识别线索**
8:intArr[10]={1};00F21DE0 mov dword ptr[Arr],100F21DE7 xor eax,eax00F21DE9 mov dword ptr[ebp-2Ch],eax00F21DEC mov dword ptr[ebp-28h],eax00F21DEF mov dword ptr[ebp-24h],eax00F21DF2 mov dword ptr[ebp-20h],eax00F21DF5 mov dword ptr[ebp-1Ch],eax00F21DF8 mov dword ptr[ebp-18h],eax00F21DFB mov dword ptr[ebp-14h],eax00F21DFE mov dword ptr[ebp-10h],eax00F21E01mov dword ptr[ebp-0Ch],eax9:10:intArr2[10]={1,2};00F21E04mov dword ptr[Arr2],100F21E0B mov dword ptr[ebp-5Ch],200F21E12xor eax,eax00F21E14mov dword ptr[ebp-58h],eax00F21E17mov dword ptr[ebp-54h],eax00F21E1A mov dword ptr[ebp-50h],eax00F21E1D mov dword ptr[ebp-4Ch],eax00F21E20mov dword ptr[ebp-48h],eax00F21E23mov dword ptr[ebp-44h],eax00F21E26mov dword ptr[ebp-40h],eax00F21E29mov dword ptr[ebp-3Ch],eax数组初始化的编译模式特征
1.局部数组存储位置
Arr:栈帧偏移[ebp-30h]开始,占用40字节Arr2:栈帧偏移[ebp-60h]开始,占用40字节
2.显式初始化部分
- Arr[10]:仅第一个元素显式赋值为1
mov dword ptr [Arr],1 ; Arr[0] = 1 - Arr2[10]:前两个元素显式赋值
mov dword ptr [Arr2],1 ; Arr2[0] = 1 mov dword ptr [ebp-5Ch],2 ; Arr2[1] = 2
3.未显式初始化部分的处理
- 统一清零模式:使用
xor eax,eax+ 连续mov指令xor eax,eax ; eax = 0 mov dword ptr [ebp-XXh],eax ; 逐一清零剩余元素 - 清零范围:
- Arr:位置
[ebp-2Ch]到[ebp-0Ch](9个元素) - Arr2:位置
[ebp-58h]到[ebp-3Ch](8个元素)
- Arr:位置
4.内存布局特征
- 连续存储:每个数组元素按4字节对齐连续排列
- 反向偏移:数组在栈中从低地址向高地址增长
- 固定间隔:数组元素间固定偏移4字节(int类型)
5.编译器优化特征
- 高效清零:使用
xor eax,eax而非mov eax,0 - 批量移动:未使用循环,而是展开的连续
mov指令 - 直接内存操作:所有初始化直接在栈内存完成,未经过寄存器中转
6.初始化模式识别
模式1(部分初始化后清零):
mov [base], value ; 第一个元素赋值 xor reg, reg ; 准备零值 mov [base+4], reg ; 清零第二个元素 mov [base+8], reg ; 清零第三个元素 ... ; 重复直到数组结束模式2(多个显式值后清零):
mov [base], value1 ; 第一个元素 mov [base+4], value2 ; 第二个元素 xor reg, reg ; 准备零值 mov [base+8], reg ; 清零第三个元素 ... ; 清零剩余元素7.逆向识别线索
- 数组开始标记:非零值的直接内存写入
- 数组边界确定:连续清零操作序列的结束
- 数组大小推断:通过偏移量计算(每个int占4字节)
- 初始化值确定:显式的
mov指令值 vs 清零的默认值