c/c++逆向(一)

一个基本的c console程序 :

int Sum1(int nNum1, int nNum2)
{
	int nRet = 0;
	nRet = nNum1 + nNum2;
	return nRet;
}

_declspec(naked) int Sum2(int a, int b)
{
	__asm
	{
		push	ebp
		mov		ebp,		esp
		sub		esp,		44h
		push	ebx
		push	esi
		push	edi
		
		lea		edi,		[ebp-44h]
		mov		ecx,		11h
		mov		eax,		0cccccccch
		rep		stos		dword ptr es:[edi]
		
		//局部变量赋值
		mov		[ebp-4],	0
		//求和
		mov		eax,		[ebp+8]		//第一个参数
		add		eax,		[ebp+0ch]	//第二个参数
		//局部变量(返回值) 赋值(编译器对此代码肯定会有优化、因为一般通过eax得到函数的返回值)
		mov		[ebp-4],	eax

		pop		edi
		pop		esi
		pop		ebx
		mov		esp,		ebp
		pop		ebp
		ret
	}
	
}

int main(int argc, char* argv[])
{
	int nRet = 0;
	int nNum1 = 5;
	int nNum2 = 8;
	nRet = Sum1(nNum1, nNum2);

	//用汇编实现上面代码		注:这里不考虑release版本、编译器所做的优化
	__asm
	{
		//局部变量赋值
		mov		[ebp-4],		0
		mov		[ebp-8],		5
		mov		[ebp-0ch],		8
		//压栈参数-从右向左     注:[ebp+4]=call的下一条指令
		mov		eax,			[ebp-0ch]
		push	eax				//在函数内部访问时=[ebp+0ch]
		mov		ecx,			[ebp-8]
		push    ecx				//在函数内部访问时=[ebp+8]
		//调用函数
		call	Sum2
		//平衡参数
		add		esp,			8
		//给局部变量(返回值) 赋值
		mov		[ebp-4],		eax
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值