概述
- 本文例子均来自《IDA PRO 权威指南》第八章第一节
- 阅读前需要掌握基本的汇编指令
例子
1、全局分配的数组
int global_array[3];
int main() {
int idx = 2;
global_array[0] = 10;
global_array[1] = 20;
global_array[2] = 30;
global_array[idx] = 40;
}
- 全局变量存在.data或者.bss节内
- 在使用ida反汇编的时候没办法知道数据到底是不是数组,要自己分析
2、栈分配的数组
int main() {
int stack_array[3];
int idx = 2;
stack_array[0] = 10;
stack_array[1] = 20;
stack_array[2] = 30;
stack_array[idx] = 40;
}
- array[0](var_10,-10h)储存数组内第一个数的偏移量
- 通过idx的赋值位置,可以分析出数组的大小,(10h-4h)/4h=3
3、堆分配数组
#include <stdlib.h>
int main() {
int *heap_array = (int*)malloc(3 * sizeof(int));
int idx = 2;
heap_array[0] = 10;
heap_array[1] = 20;
heap_array[2] = 30;
heap_array[idx] = 40;
}
- 不太明白书中说的为什么每次访问数组的时候都要进行一次array地址的读取,执行完之后array的地址应该是已经确定了的,频繁的读取[ebp+array]不知道为什么
总结
- 都很容易看出每个元素大小
- 在不知道源码的情况下并不能很快人出是数组