naked函数的一些分析

我们知道VC++和gcc都支持naked函数,即所谓的“裸函数”,对于这种函数,编译器不会生成任何函数入口代码和退出代码。这种函数一般应用在与操作系统内核相关的代码中,如中断处理函数、钩子函数等。

VC++的声明语法:__declspec(naked)

gcc的声明语法:__attribute__((naked))

因为编译器不会生成入口代码和退出代码,所以写naked函数的时候要分外小心。进入函数代码时,父函数仅仅会将参数和返回地址压栈,亦即只有esp寄存器和eip寄存器会发生变化。

一般来说,使用naked函数时需要注意以下问题:(以VC++编译器为例)

1、函数必须显式返回。

一般通过__asm ret的内嵌汇编指令返回,否则的话,就等着int 3吧^^

2、不可以通过任何方式使用局部变量。

若声明一个局部变量,并在代码中为其赋值,则会更改父函数中相应位置的局部函数的值。举例:

__declspec(naked) void Test()
{
int x;
x
= 3;
__asm ret;
}

int main(int argc, char* argv[])
{
int x = 1;
Test();
printf(
"%d\n",x);
return 0;
}

打印值为3,父函数的局部变量被更改。

3、只能通过esp引用参数。

因为子函数继承了父函数的ebp寄存器,所以只能通过esp引用参数。

(声明:本文作者为暗影吉他手(lhxarcher),转载请注明作者和原始链接,并保留本声明,否则你就画个圈圈自己诅咒自己吧!)



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 10861