【转】_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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

采样频率和带宽的关系_基于矢量网络分析仪的 TDR 与传统采样示波器 TDR 之间的测量性能和优势比较...

最近几年随着多 Gbps 传输的普及&#xff0c;数字通信标准的比特率也在迅速提升。比特率的提高使得在传统数字系统中不曾见过的问题显现了出来。诸如反射和损耗的问题会造成数字信号失真&#xff0c;导致出现误码。另外由于保证器件正确工作的可接受时间裕量不断减少&#xff0…

【模板】并查集

只是再自己打一遍熟悉一些 #include<iostream> #include<cstdio> using namespace std; #define tcl(a,b,c) for(ab;a<c;a) int f[100001]; int get(int x) {if(f[x]x)return x;else {f[x]get(f[x]);return f[x];} } void join(int a,int b) {int t1,t2;t1get(a…

mysql的分片系统_MySQL分片

shardingMySQL5以后提供了Sharding的能力&#xff0c;其目的就是为突破单节点数据服务器I/O能力限制&#xff0c;解决数据库Scale Out水平扩展的问题。通过Sharding可以将数据按照物理位置贴合用户分布&#xff0c;得到更加快速的响应&#xff1b;操作庞然大物总是让人头疼&…

在线普通话转粤语发音_香港最新悬疑侦探剧福尔摩师奶,粤语知识好难

150元系统学粤语付费咨询微信2019年2月25日香港TVB上了一部新剧《福尔摩师奶》&#xff0c;该剧以19世纪末至20世纪初的油麻地为背景&#xff0c;讲述一个女探长祖迪费查(陈松伶饰)破案的故事。/ 盏鬼 // 识少少 /①普通话的“嫉妒、受不了”&#xff0c;粤语会说&#xff1a;唔…

Java web小项目_个人主页(1)—— 云环境搭建与项目部署

摘自&#xff1a;Java web小项目_个人主页&#xff08;1&#xff09;—— 云环境搭建与项目部署 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-26 23:59:39 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115104493?spm1001.2014.3001…

网页搜索怎么显示排名_深圳seo搜索排名优化效果怎么样

效果怎么样l31b10seo搜索排名优化深圳&#xff0c;企业商家为了自己的网站有更好的排名&#xff0c;获得更好的流量&#xff0c;往往会采用SEO优化&#xff0c;那么SEO优化有哪些方法呢&#xff1f;或者是哪些方法更有效呢&#xff1f;这是一个多媒体的时代&#xff0c;内容元素…

String.slice

String.slice(start, end)start从字符串的哪个index开始截取 默认值0 如果为负值&#xff0c;则从字符串的尾部向前倒推indexend到从字符串的哪个index结束截取 默认值string.length 有效值 Math.abs(string.length)>end 如果为负值&#xff0c;则从字符串的尾部向前倒推ind…

mysql5.5怎么删除字段_Linux 上 Mysql5.5 只能新建表中的字段不能删除表,权限root...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼mysql> describe wef_wall_content;------------------------------------------------------------------------| Field | Type | Null | Key | Default | Extra |----------------------------------------------------------…

实战 Lucene,第 1 部分: 初识 Lucene

Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包&#xff0c;它不是一个完整的搜索应用程序&#xff0c;而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。 目前已经有很…

Java web小项目_个人主页(2)—— 边缘加速原理与实现

摘自&#xff1a;Java web小项目_个人主页&#xff08;2&#xff09;—— 边缘加速原理与实现 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-27 14:44:40 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115260283?spm1001.2014.3001.5…

range函数python-Python for循环与range函数的使用详解

for 循环 For … in 语句是另一种循环语句&#xff0c;其特点是会在一系列对象上进行迭代&#xff08;Iterates&#xff09;&#xff0c;即它会遍历序列中的每一个项目 注意&#xff1a; 1、else 部分是可选的。当循环中包含它时&#xff0c;它循环中包含它时&#xff0c;它总会…

Ajax同步和异步的区别?

今天在code review时候看到同事的代码&#xff0c;用了ajax同步&#xff0c;async:false,如果不设置async参数&#xff0c;默认是true&#xff0c;为异步&#xff0c;异步的情况是比较复杂的&#xff0c;看下同步这个例子&#xff1a; function getCommit(){ var data null;…

mysql 双从性能_MySQL双主一致性架构优化

转自&#xff1a;MySQL双主一致性架构优化 - osc_avwazwuz的个人空间 - OSCHINA​my.oschina.net一、双主保证高可用MySQL数据库集群常使用一主多从&#xff0c;主从同步&#xff0c;读写分离的方式来扩充数据库的读性能&#xff0c;保证读库的高可用&#xff0c;但此时写库仍然…

最清晰细致的教程!一步步教你打造Win7+CentOS双系统

大概半年前自学了一段时间Linux&#xff0c;但没有坚持下来……最近又想开始看&#xff0c;但是希望看到Linux在物理机下的运行情况而不是仅仅在虚拟机下运行&#xff0c;所以尝试着在已经安装了Win7的系统下安装CentOS&#xff0c;实现双系统切换使用的目的。经过大半天的实验…

全国计算机等级考试题库二级C操作题100套(第01套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

linux系统日志_如何使用 Linux Cockpit 来管理系统性能 | Linux 中国

Linux Cockpit 是一个基于 Web 界面的应用&#xff0c;它提供了对系统的图形化管理。看下它能够控制哪些。-- Sandra Henry-stocker如果你还没有尝试过相对较新的 Linux Cockpit&#xff0c;你可能会对它所能做的一切感到惊讶。它是一个用户友好的基于 web 的控制台&#xff0c…

触摸屏之linux3.4.2安装tslib

1. 写好触摸屏驱动后&#xff0c;安装tslib 1.1 tar xzf tslib-1.4.tar.gz 1.2 cd tslib 1.3 修改编译器版本号或者内核版本号&#xff0c;使它们一致。不然会出错&#xff0c;显示selected device is not a touchscreen I understand 在内核中 —— include/linux/input.h:…

使用randomaccessfile类将一个文本文件中的内容逆序输出_Java IO2:RandomAccessFile

RandomAccessFileRandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类&#xff0c;它提供了众多的文件访问方法。RandomAccessFile类支持"随机访问"方式&#xff0c;可以跳转到文件的任意位置处读写数据。要访问一个文件的时候&#xff0c;不想把文件从头…

JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法…

全国计算机等级考试题库二级C操作题100套(第02套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…