C/C++ 您当前所在位置:首页 > C/C++ > C语言中的裸函数

C语言中的裸函数

陈成 陈成 2020-07-09 21:59:27 C/C++ 182人已围观

简介 C语言裸函数记住一点,编译器不会为它生成任何代码。我们在平常调用函数时哪怕是调用一个没有任何代码的空函数,编译器最少都会生成一个基本的框架。但调用裸函数的话不会,在反汇编中除了看到正常的call后面跟一个地址外,进入函数里面如果我们本身也没对裸函数做任何操作,那程序就会出错。

C语言裸函数记住一点,编译器不会为它生成任何代码。我们在平常调用函数时哪怕是调用一个没有任何代码的空函数,编译器最少都会生成一个基本的框架。但调用裸函数的话不会,在反汇编中除了看到正常的call xxxx外,进入里面后如果我们本身也没对裸函数做任何操作,那程序就会出错。

语法

返回类型 __declspec(naked) 函数名()
{

}

//下面__declspec(naked)是固定的
void __declspec(naked) test()
{

}

我们看调用一个正常的空函数的汇编

函数调用.png

再看看调用一个空裸函数

函数调用.png

直接就变成了这样,程序已经出错了。编译器没有为裸函数生成任何代码,连ret都没有,没有返回地址,程序当然会出错,不让程序出错最少最少都要在裸函数里面加上一个ret。

我们可以在裸函数里面写__asm{},大括号中间写汇编。

void __declspec(naked) test()
{
    __asm
    {
        ret
    }
}

文章评论

发送

站点信息

  • 上线时间:2020年05月30日
  • 网站程序:自建框架
  • 博客模板:今夕何夕
  • 文章统计43篇文章
  • 评论统计0条评论
  • 留言统计0条留言
  • 统计数据:百度统计