【逆向知识】裸函数(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

你可能感兴趣的:(【逆向知识】裸函数(Naked函数))