日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】_declspec(naked) 使用

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】_declspec(naked) 使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

// 將本文完整拷貝, 然后在VC6 下建立控制臺程序, 可直接運行~? 看到結果后再來閱讀此文

// 文章出處甚多, 已不能列出所有連接

#include "stdafx.h"
#include <stdio.h>

/*
??? >>>>>>?? _declspec(naked) 使用? <<<<<<<<

最近學習驅動開發,在寫繞過inline hook的代碼時,有個問題困擾了我一天,
最后發現原來是在內嵌匯編時,沒有使用_declspec(naked)導致的,
看來是偶的基礎知識掌握的不牢固啊(得補一下了,磨刀不誤砍柴功),在此給記錄一下,給自己一個警示。


對于jmp類型的hook, 如果自己的過程沒有使用_declspec(naked),那么系統會自動給添加一些額外的代碼,控制堆棧平衡,
但是這些額外的代碼會破壞被hook函數的堆棧。


對于call類型的hook,如果使用_declspec(naked)修飾的話,要注意自己恢復堆棧平衡..
下面是網上對_declspec(naked) 的介紹:
_declspec(naked)
就是告訴編譯器,在編譯的時候,不要優化代碼,通俗的說就是
沒代碼,完全要自己寫
比如
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define NAKED?? __declspec(naked)

void NAKED code(void)
{
??? __asm
??? {
??????? ret
??? }
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
使用__declspec(naked)關鍵字定義函數:
1,使用 naked 關鍵字必須自己構建 EBP 指針 (如果用到了的話);
2,必須自己使用 RET 或 RET n 指令返回 (除非你不返回);

// >> __declspec(naked) 是且僅是不產生 prolog 和 epilog 代碼?
// >> {保存并恢復使用過的寄存器和分配局部變量、平衡堆棧、返回值}。

?

_delcspec(naked)用在驅動編寫,C語言內嵌匯編完成一些特定功能。


*/

#pragma warning (disable: 4700)

unsigned int retAddress;

void Test2();
void NormalFunc();

void NormalFunc()
{
??? // data[1] : ebp的值, data[2] : 函數返回地址
??? unsigned int data[1] = { 0 };
??? // 保存 返回地址
??? retAddress = data[2];
??? data[2] = (unsigned int)Test2;
????
??? return ;
}

// naped 函數 (手工指定 prolog 和 epilog)
// >> 一下四種形式皆可
// __declspec(naked) void Test2()
// void __declspec(naked) Test2()
// void _declspec(naked) Test2()
_declspec(naked) void Test2()
{
??? printf("Naked : hello world!\r\n");
??? // 跳回main函數體重!

??? __asm
??? {
??????? jmp [retAddress]
??? }
}

int main()
{
??? NormalFunc();
??? printf(" before exit\r\n");

??? return 0;
}

總結

以上是生活随笔為你收集整理的【转】_declspec(naked) 使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。