_declspec(naked) 使用(裸函式)

whatday發表於2013-08-20
最近學習驅動開發,在寫繞過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語言內嵌彙編完成一些特定功能。

相關文章