【逆向知识】裸函数(Naked函数)

1 说明

指定裸函数编写的函数,编译器生成不带任何多余代码。 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列。 裸函数对于编写虚拟设备驱动程序特别有用。

2 练习目的

  • 熟悉堆栈结构

  • 参数、局部变量的位置

  • 返回值存储的位置

3 代码实现

// 20180217_裸函数.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

// 两数相加函数
int add(int x, int y)
{
	return x+y;
}


// 裸函数实现 两数相加函数
int __declspec(naked) Plus(int x, int y) 
{
	__asm
	{
		//保留调用前的栈底
		push ebp
		// 提升堆栈
		mov ebp,esp
		sub esp,0x40
		// 保留现场
		push ebx
		push esi
		push edi
		// 开始填充缓冲区
		mov eax,0xCCCCCCCC
		mov ecx,0x10
		lea edi,dword ptr ds:[ebp-0x40]
		rep stosd

		// 函数核心功能
		mov eax,dword ptr ds:[ebp+0x8]
		add eax,dword ptr ds:[ebp+0xC]

		// 恢复现场
		pop edi
		pop esi
		pop ebx

		//降低堆栈
		mov esp,ebp
		pop ebp
		ret
	}
}


int main()
{
	// c语言函数实现
	add(1, 2);
	// 裸函数实现
	Plus(1,2);
    return 0;
}

原文地址:https://www.cnblogs.com/17bdw/p/8452400.html