zoukankan      html  css  js  c++  java
  • 逆向笔记——C、C++对应的汇编结构(一)

    C、C++对应的汇编结构

    1、对裸函数的反汇编

    int __declspec(naked) Function(int x, int y, int z)
    {
    	__asm ret
    }
    

    对应的汇编

    	Function(1,2,3);
    01081738  push        3  
    0108173A  push        2  
    0108173C  push        1  
    0108173E  call        Function (01081235h)  
    01081743  add         esp,0Ch 
    
    01081235  jmp         Function (010816F0h)
    
    	__asm ret
    010816F0  ret 
    

    从上面的反汇编代码来看,主函数中调用Function(1,2,3); 从Function(1,2,3)直接jmp到ret返回到主函数空间。

    2、对普通空函数的反汇编

    普通空函数

    void Function1(int x, int y, int z)
    {
    
    }
    

    对应的汇编结构

    	Function1(1, 2, 3);
    013D1748  push        3  
    013D174A  push        2  
    013D174C  push        1  
    013D174E  call        Function1 (013D1375h)  
    013D1753  add         esp,0Ch  
    
    013D1375  jmp         Function1 (013D18E0h) 
    
    void Function1(int x, int y, int z)
    {
    013D18E0  push        ebp  
    013D18E1  mov         ebp,esp  
    013D18E3  sub         esp,0C0h  
    013D18E9  push        ebx  
    013D18EA  push        esi  
    013D18EB  push        edi  
    013D18EC  lea         edi,[ebp-0C0h]  
    013D18F2  mov         ecx,30h  
    013D18F7  mov         eax,0CCCCCCCCh  
    013D18FC  rep stos    dword ptr es:[edi]  
    013D18FE  mov         ecx,offset _377E8FF0_cstructreverse@cpp (013DB000h)  
    013D1903  call        @__CheckForDebuggerJustMyCode@4 (013D1203h)  
    
    }
    

    这里普通的函数与裸函数对比来看,普通函数编译器为我们实现了堆栈的的提升与平衡。

    3、普通函数实现一个3个数的加法

    int Function1(int x,int y,int z)
    {
        int a=1;
        int b=2;
        int c=3;
        return x+y+z+a+b+c;
    }
    

    4、裸函数实现一个3个数的加法

    友情提示:一定要自己熟悉堆栈图

    关键步骤:

    (1)保存原来的栈底

    (2)提升堆栈

    (3)保护现场

    (4)初始化缓冲区

    (5)真正的函数功能实现

    (6)恢复现场

    (7)平衡堆栈

    (8)跳到原函数空间

    int __deslpe Function(int x,int y,int z)
    {
        __asm{
            push ebp
            
            mov ebp,esp
            mov esp,0x40
            
            push esi
            push edi
            push edx
            
            mov eax,0xcccccccc
            mov ecx,0x10
            rep stosd
            
            mov dword ptr ds:[ebp-0x4],1
            mov dword ptr ds:[ebp-0x8],2
            mov dword ptr ds:[ebp-0xC],3
            
            mov eax, dword ptr ds:[ebp+0x4]
            add eax, dword ptr ds:[ebp+0x8]
            add eax, dword ptr ds:[ebp+0xC]
    
    	    add eax, dword ptr ds:[ebp-0x4]
            add eax, dword ptr ds:[ebp-0x8]
            add eax, dword ptr ds:[ebp-0xC]
       
            pop esi
            pop edi
            pop edx
            
            mov esp,ebp
            pop ebp
            
            ret
        }
    }
    

    注意:

    参数:从ebp+8开始

    局部变量:从ebp-4开始

    返回地址:ebp+4

    平衡堆栈的0x40:这个只要够用就ok

  • 相关阅读:
    (转)SQL Server 2005两种安全验证模式
    C#练习题记录(交换两个数1)
    C# using 用法
    服务器的理解(菜鸟)
    zZ
    ZzZ
    [转]Arcgis制作泰森多边形具体步骤
    [转]免费网站推广
    [转]如何让Firefox优化得比Chrome更快
    [转]3天搞定网站重新被百度收录的方法
  • 原文地址:https://www.cnblogs.com/Erma/p/12928355.html
Copyright © 2011-2022 走看看