_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(dllexport)和__declspec(dllimport)ExportImport
- 理解 __declspec(dllexport)和__declspec(dllimport)ExportImport
- dll的def檔案與__declspec(dllexport)匯出函式方式比較Export函式
- extern "C" __declspec(dllexport)Export
- __declspec(dllimport)的作用Import
- 函式: 函式是怎麼使用的?函式
- 何時使用函式表示式與函式宣告函式
- edge函式使用函式
- 【Java】函式使用Java函式
- pipe函式使用函式
- 02_函式定義及使用函式函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- round函式與trunc函式的使用方法函式
- 【函式】Oracle中聚合函式rank()使用方法函式Oracle
- Shell 函式的使用函式
- Thunk函式的使用函式
- Generator 函式的使用函式
- Spark Sql 函式使用SparkSQL函式
- LNNVL函式的使用函式
- Grouping函式使用函式
- exe等函式使用函式
- Oracle over()函式使用Oracle函式
- 索引中使用函式索引函式
- sqlserver DATEPART函式使用SQLServer函式
- smarty塊函式使用函式
- 使用bind()函式的產生的函式用作建構函式this的指向函式
- 函式指標使用c++類成員函式函式指標C++
- vb如何使用ftp函式,vb如何使用ftp函式要知道這些FTP函式
- async函式使用場景函式
- 高階函式的使用函式
- tap函式的日常使用函式
- python-函式使用Python函式
- hive視窗函式使用Hive函式
- 在 bash 中使用函式函式
- 第8課 使用函式函式
- Linux access()函式 使用Linux函式
- SQL CHARINDEX函式的使用SQLIndex函式
- Windows API GetUserNameEx 函式使用WindowsAPI函式