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