变量分析
1.内存区域
程序需要加载到内存才能运行;
程序运行时会把内存分为几个区域;
代码区 ->放程序代码,可读可执行;
堆栈 ->存放参数、局部变量、临时数据;
堆 ->动态申请的内存,可读可写;
全局变量区 ->存放全局变量;可读可写;
常量区 ->存放常量,只读;
2.全局变量
特点:
1、在程序编译完以后就已经预留的空间,预留的大小由类型决定,且位置不会发生变化.
2、全局变量如果没有给的初始值,默认为0.
3、全局变量可以在任何其他的函数里面进行读写.
4、多个函数使用同一个全局变量,只要exe程序不结束,里面将一直存储最后一次修改的值.
1)全局变量的反汇编识别
//全局变量
int g = 255;
void plus(){
//局部变量
int a=12;
g=a;
}
int main(int argc, char* argv[])
{
plus();
return 0;
}
反汇编结果:
结论:
mov 寄存器,byte/word/dword ptr ds:[0x12345678]
这样的代码很可能是全局变量,也就是说发现了直接寻址很可能是全局变量;
可以根据寄存器的宽度或者byte/word/dword来判断全局变量的宽度;
全局变量就是所谓的“基址”;
3.局部变量
局部变量特点:
1、只有当函数调用时才会分配空间,且一定要有初值.
2、局部变量的作用范围仅限于当前函数自己,其他函数无法使用
3、当函数执行完毕后,局部变量将变成垃圾数据,可以随时被其他数据所覆盖.
局部变量的反汇编识别:
[ebp-4]
[ebp-8]
[ebp-0x0c]
上面的方式寻址的很可能是局部变量;
4.函数参数分析
一般情况分析步骤:
还有可能是fastcall调用约定,因此需要考虑寄存器传参;