zoukankan      html  css  js  c++  java
  • 汇编的角度分析变量类型与分支语句

                                                                     

    全局变量的特点:

      1、全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面
      是否有值取决于声明时是否给定了初始值,如果没有,默认为0

      2、全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值.

      3、全局变量所占内存会一直存在,知道整个进程结束.

      4、全局变量的反汇编识别:

      MOV 寄存器,byte/word/dword ptr ds:[0x12345678]

      通过寄存器的宽度,或者byte/word/dword 来判断全局变量的宽度


      全局变量就是所谓的基址

    局部变量的特点:

      1、局部变量在程序编译完成后并没有分配固定的地址.

      2、在所属的方法没有被调用时,局部变量并不会分配内存地址,只有当所属的程序被调用了,才会在
      堆栈中分配内存.

      3、当局部变量所属的方法执行完毕后,局部变量所占用的内存将变成垃圾数据.局部变量消失.

      4、局部变量只能在方法内部使用,函数A无法使用函数B的局部变量.

      5、局部变量的反汇编识别:
      
      [ebp-4]

      [ebp-8]

      [ebp-0xC]

    int g_r ;                
                    
    void __cdecl Function1(int x,int y,int z)                
    {                
        g_r = x+y+z;            
    }                
    void __stdcall Function2(int x,int y,int z)                
    {                
        g_r = x+y+z;            
    }                
    void __fastcall Function3(int x,int y,int z)                
    {                
        g_r = x+y+z;            
    }                
                    

    如何判断函数有几个参数,已经分别是什么: 


    一般情况:

    步骤一:观察调用处的代码

    push 3
    push 2
    push 1
    call 0040100f

    步骤二:找到平衡堆栈的代码继续论证

    call 0040100f
    add esp,0Ch

    或者函数内部

    ret 4/8/0xC/0x10


    最后,两者一综合,函数的参数个数基本确定.

    上诉还存在心得问题:参数传递未必都是通过堆栈,还可能通过使用寄存器.

    比如:

    push ebx
    push eax
    mov ecx,dword ptr ds:[esi]
    mov edx,dword ptr ds:[edi]
    push 45
    push 33
    call 函数地址

    2、函数调用处的代码无法查看.

    00401050 push ebp       
    00401051 mov ebp,esp
    00401053 sub esp,48h                 1、不考虑ebp、esp
    00401056 push ebx
    00401057 push esi                   2、只找给别人赋值的寄存器
    00401058 push edi eax/ecx/edx/ebx/esi/edi
    00401059 push ecx
    0040105A lea edi,[ebp-48h]              3、找到以后追查其来源,如果,该寄存器中的值
    0040105D mov ecx,12h               不是在函数内存赋值的,那一定是传进来的参数.
    00401062 mov eax,0CCCCCCCCh
    00401067 rep stos dword ptr [edi]            公式一:寄存器 + ret 4 = 参数个数
    00401069 pop ecx
    0040106A mov dword ptr [ebp-8],edx          公式二:寄存器 + [ebp+8] +[ebp+0x] = 参数个数
    0040106D mov dword ptr [ebp-4],ecx
    00401070 mov eax,dword ptr [ebp-4]
    00401073 add eax,dword ptr [ebp-8]
    00401076 add eax,dword ptr [ebp+8]
    00401079 mov [g_x (00427958)],eax
    0040107E pop edi
    0040107F pop esi
    00401080 pop ebx
    00401081 mov esp,ebp
    00401083 pop ebp
    00401084 ret 4


    IF语句的反汇编判断:


    执行各类影响标志位的指令
    jxx xxxx


    1、案例一

    mov eax,dword ptr [ebp+8] 分析:cmp指令 影响标志位
    cmp eax,dword ptr [ebp+0Ch] jle :小于或者等于就跳转到00401059
    jle 00401059


    2、案例二

    mov eax,dword ptr [ebp+8] 分析:cmp指令 影响标志位
    cmp eax,dword ptr [ebp+0Ch] jl :小于则跳转
    jl 00401059


    3、案例三

    mov eax,dword ptr [ebp+8] jge :大于或者等于则跳转
    cmp eax,dword ptr [ebp+0Ch]
    jge 00401059


    4、案例四

    mov eax,dword ptr [ebp+8] jg :大于则跳转
    cmp eax,dword ptr [ebp+0Ch]
    jg 00401059



    整体分析:

    函数调用处代码:

    push 5 分析:
    push 4 两个参数
    call 0040100f
    add esp,8

     

     

     

  • 相关阅读:
    使用slot-scope复制vue中slot内容
    pre-commit钩子,代码质量检查
    vue 顶级组件
    Vue源码探究-事件系统
    vue 配置多页面应用
    vuex commit保存数据技巧
    在VUE中,关于CKEditor使用
    使用el-checkbox实现全选,点击失效没有反应
    vue组件之间的通信
    不做Next,争做Nest——庆科首届智能硬件创新设计大赛产生决赛12强
  • 原文地址:https://www.cnblogs.com/heyhx/p/14202362.html
Copyright © 2011-2022 走看看