逆向笔记——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

原文地址:https://www.cnblogs.com/Erma/p/12928355.html