最近学习驱动开发,在写绕过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(naked) 使用(裸函数)相关推荐

  1. 【Win32汇编】__declspec(naked)裸函数

    使用 __declspec(naked) 定义的函数,编译器只会负责参数压栈.执行CALL指令,和释放参数的内存(堆栈平衡),除此之外啥也没有,比如提升堆栈,寄存器的保存和恢复,或者是函数返回,这些都 ...

  2. 【逆向知识】裸函数(Naked函数)

    1 说明 指定裸函数编写的函数,编译器生成不带任何多余代码. 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列. 裸函数对于编写虚拟设备驱动程序特别有用. 2 练习 ...

  3. c++裸函数naked解析

    先分享一个案例: 1 #include <stdio.h>2 3 __declspec(naked) void Test()4 {5 int x;6 x = 3;7 __asm ret;8 ...

  4. c语言裸函数,【逆向知识】裸函数(Naked函数)

    1 说明 指定裸函数编写的函数,编译器生成不带任何多余代码. 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列. 裸函数对于编写虚拟设备驱动程序特别有用. 2 练习 ...

  5. 裸函数naked解析

    先分享一个案例: 1 #include <stdio.h> 2 3 __declspec(naked) void Test() 4 { 5 int x; 6 x = 3; 7 __asm ...

  6. 裸函数 __declspec(naked)

    在C语言转化成汇编的过程中,编译器会自动处理堆栈,比如以下代码,即使add函数里面一条语句都没有,但是编译器在编译过程中 还是生成了很多指令(00F11380 - 00F1139C) 用于处理堆栈 v ...

  7. 裸函数 __declspec(naked),C语言是怎么变成汇编的,用裸函数加汇编实现一个最简单的加法函数

    裸函数: 普通函数会自动生成实现堆栈提升.堆栈的缓存区建立.堆栈平衡和函数返回的汇编代码,裸函数不会自动生成任何代码,全部要自己手动写汇编代码. 裸函数定义:__declspec(naked) 加汇编 ...

  8. 【转】_declspec(naked) 使用

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

  9. _declspec(naked) 使用

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

最新文章

  1. Win32中GDI+应用(三)---Graphics类
  2. 数据库的三大范式以及五大约束
  3. leetcode169. 多数元素——pygo
  4. JAVA和C浮点数,为什么在C ++和Java中使用float函数会产生不同的结果?
  5. linux如何确认账号过期了,linux下非root用户秘密过期如何确认,如果确认,该如何延期使其有效?...
  6. 三维电子沙盘数字沙盘M3DGIS无人机倾斜摄影三维建模
  7. ARM ELF 镜像结构
  8. 深入理解React:懒加载(lazy)实现原理
  9. 阿里云免费服务器搭建个人博客
  10. 关于Axure RP 的授权,我猜你还想知道......
  11. 2017年最后一篇文章:微信小程序游戏跳一跳刷榜原理解析!
  12. 爱创课堂vue视频资料
  13. GitHub代码托管
  14. 分支限界解决旅行商tsp问题
  15. c语言怎样画坐标轴,c语言 用小星星画各种图形(菜鸟学C语言)
  16. python中size的用法.dim_对于numpy中的函数的参数dim的一点理解
  17. IDEA Git和svn切换
  18. Oracle中cursor(游标)总结
  19. 【解决】camunda部署流程报错should point to a running platform rest api
  20. PPTV(pplive)_forap_1084_9993.exe 木马清除经历

热门文章

  1. java B2B2C Springboot多租户电子商城系统-spring-cloud-eureka-consumer...
  2. 如何让云存储更好为“我”所用
  3. 医疗人工智能会替代医生吗
  4. Ubuntu 16.04安装QtCharts时报错:'qtConfig' is not a recognized test function.
  5. 【练习】ViewPager标签滑动
  6. Android Custom View系列《圆形菜单一》
  7. iSCSI存储技术全攻略
  8. vue-cli Invalid Host header
  9. Linux常用命令:cp,mv,rm
  10. 【转载】为何要十跪父母