C语言裸函数记住一点,编译器不会为它生成任何代码。我们在平常调用函数时哪怕是调用一个没有任何代码的空函数,编译器最少都会生成一个基本的框架。但调用裸函数的话不会,在反汇编中除了看到正常的call xxxx外,进入里面后如果我们本身也没对裸函数做任何操作,那程序就会出错。
语法返回类型 __declspec(naked) 函数名()
{
}
例//下面__declspec(naked)是固定的
void __declspec(naked) test()
{
}
我们看调用一个正常的空函数的汇编
再看看调用一个空裸函数
直接就变成了这样,程序已经出错了。编译器没有为裸函数生成任何代码,连ret都没有,没有返回地址,程序当然会出错,不让程序出错最少最少都要在裸函数里面加上一个ret。
我们可以在裸函数里面写__asm{},大括号中间写汇编。void __declspec(naked) test()
{
__asm
{
ret
}
}
由于表达能力有限或其他一些原因,本站可能有少量错误,欢迎指正!
扫描关注个人博客QQ交流群共同探讨
此文为本站原创,由 陈成 发表,转载需要以链接形式注明出处