// 将本文完整拷贝, 然后在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) 使用相关推荐

  1. _declspec(naked) 使用(裸函数)

    最近学习驱动开发,在写绕过inline hook的代码时,有个问题困扰了我一天,最后发现原来是在内嵌汇编时,没有使用_declspec(naked)导致的,看来是偶的基础知识掌握的不牢固啊(得补一下了 ...

  2. _declspec(naked) 使用

    // 将本文完整拷贝, 然后在VC6 下建立控制台程序, 可直接运行~  看到结果后再来阅读此文 // 文章出处甚多, 已不能列出所有连接 #include "stdafx.h" ...

  3. __declspec(naked)详解

    __declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码 注意点: [cpp] view plaincopy void __declspec(na ...

  4. C++基础巩固__declspec(naked)

    From: http://blog.csdn.net/hgy413/article/details/7921776 __declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不 ...

  5. inline hook学习

    vs2013编译 //inline hook 实际上就是指 通过改变目标函数头部的代码来使改变后的代码跳转至我们自己设置的一个函数里,产生hook.#include <windows.h> ...

  6. 安全的交互通道 及 栈回塑检查与伪造

    第四章:安全的交互通道 消息钩子,Hook游戏消息处理过程,GetKeyState(),GetAsyncKeyState()和GetKeyBoardState()函数,进程间通信. 消息钩子:SetW ...

  7. 32位汇编第七讲,混合编程,内联汇编

    32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...

  8. MS08-025 win32k.sys NtUserFnOUTSTRING Privilege Escalation Exploit

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 以下消息来自幻 ...

  9. 内核层 inlinehook 隐藏进程

    上次是SSDT  HOOK 方式 隐藏 进程 ,如链接:http://blog.csdn.net/hjxyshell/article/details/16993119 这次是InlineHook 方式 ...

最新文章

  1. Map m=new HashMap()
  2. python 列表中的数字转字符串_python 将列表中的字符串转为数字
  3. 怎么在HTML中加个日历,HTML中如何添加日历插件(JQUERY)
  4. Serverless那么火,2019年的采用如何?
  5. [转]WebView长按弹出复制粘贴
  6. 08-spring学习-annotation配置
  7. nginx能不能获取到vue项目#后面的内容
  8. 创业与老子的顺其自然
  9. openssl req
  10. android demo示例代码,Android Service demo例子使用详解(示例代码)
  11. 一文读懂什么是硬件开发、智能硬件、硬件系统?
  12. 如意云路由刷PandoraBox
  13. CF1556E Equilibrium
  14. 微微一笑很倾城(2)
  15. VM虚拟机更换网络环境后无法连接网络
  16. 产品概念之2/4:三层次理论 —— 生产者主导视角的产品概念
  17. 7.2 一次产品异常复位引发的质量提升经历
  18. 解读一道微软经典面试题:海盗分宝石
  19. 普通青年VS文艺青年VS2B青年,爆笑语录!
  20. 刷脸支付微信支付宝小程序可以营销活动

热门文章

  1. ssh整合学习(1)
  2. 反射笔记-----------------------------
  3. [Android]SQLite的使用
  4. ASP.NET_读写Cookie
  5. 设置在VS2005的IDE中迅速打开xaml文件
  6. 使 Framework 2.0 的程序集不用安装 Framework 就可以运行的工具免费发布了
  7. GARFIELD@12-02-2004
  8. 如何让Element UI的Message消息提示每次只弹出一个
  9. Jenkins配置与使用
  10. iOS开发之share第三方登录以及分享