_declspec(naked)修饰可以生成一个“裸”函数, 使用后C编译器将生成不含函数框架的纯汇编代码,裸函数中什么都没有,所以也不能使用局部变量,只能全部用内嵌汇编实现。
_declspec(naked) 使用
精选 转载最近学习驱动开发,在写绕过inline hook的代码时,有个问题困扰了我一天,最后发现原来是在内嵌汇编时,没有使用_declspec(naked)导致的,看来是偶的基础知识掌握的不牢固啊(得补一下了,磨刀不误砍柴功),在此给记录一下,给自己一个警示。
对于jmp类型的hook, 如果自己的过程没有使用_declspec(naked),那么系统会自动给添加一些额外的代码,控制堆栈平衡,但是这些额外的代码会破坏被hook函数的堆栈。
对于call类型的hook,如果使用_declspec(naked)修饰的话,要注意自己恢复堆栈平衡。
_declspec(naked)修饰可以生成一个“裸”函数, 使用后C编译器将生成不含函数框架的纯汇编代码,裸函数中什么都没有,所以也不能使用局部变量,只能全部用内嵌汇编实现。
下面是网上对_declspec(naked) 的介绍:
_declspec(naked)
就是告诉编译器,在编译的时候,不要优化代码,通俗的说就是
没代码,完全要自己写
比如
#define NAKED __declspec(naked)
void NAKED code(void)
{
__asm
{
ret
}
}
使用__declspec(naked)关键字定义函数:
1,使用 naked 关键字必须自己构建 EBP 指针 (如果用到了的话);
2,必须自己使用 RET 或 RET n 指令返回 (除非你不返回);
_delcspec(naked)用在驱动编写,C语言内嵌汇编完成一些特定功能。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
__declspec(novtable) 应用
__declspec(novtable) 应用
declspec novtable -
__declspec(dllimport)的作用
是时候总结一下__declspec(dllimport)的作用了。可能有人会问:__declspe
api dll exe 编译器 class -
//typedef GUID IID; MIDL_INTERFACE(x) struct __declspec(uuid(x)) __declspec(novtable)
//// IID_IUnknown and all other system IIDs are provided in UUID.LIB// Link that library in with your proxies, clients and servers///*typedef struct _GUID { // size is 16DWORD Data1;WO
interface struct library system byte -
【转】_declspec(naked) 使用
// 将本文完整拷贝, 然后在VC6 下建立控制台程序, 可直接运行~ 看
堆栈 #include c语言 -
__declspec(dllexport)的位置问题无法解析 编译错误 #define #ifdef 编译器