变量分析

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调用约定,因此需要考虑寄存器传参;
 
 
posted @ 2019-09-20 11:07  L丶银甲闪闪  阅读(436)  评论(0编辑  收藏  举报