[原创]浅谈如何使用gcc开发NT核心驱动程序
一谈到在 Win NT 下开发核心驱动程序,可能不少人首先都会想到微软“正统”的VC来。诚然,用VC 配合 WINDDK 的确工作的不错,但或许我们可以让其变得更简单更完善一些。
其实偶一般是用 Masm32v9 + EditPlus2 编写 NT内核驱动,仅此而已。从环境搭建的便捷性和编写代码的灵活性来说无疑这是非常高的。但汇编终归是汇编,虽然强大,但很多事都要自己动手来做,往往很简单的功能都要用比较“生硬”的方法来完成,比如:
;**************************************************************** .data ;**************************************************************** szenter db "enter driverentry", szleave db "leave driverentry", ;****************************************************************
.code INIT
;**************************************************************** DriverEntry proc pDriverObject:PDRIVER_OBJECT,/ pusRegistryPath:PUNICODE_STRING local status:NTSTATUS mov status,STATUS_DEVICE_CONFIGURATION_ERROR invoke DbgPrint,$CTA0("enter driverentry") invoke DbgPrint,addr szenter ;do someting you want! invoke DbgPrint,addr szleave mov eax, status ret DriverEntry endp
;****************************************************************
end DriverEntry
以上是一个简单的不能再简单的Driver 模版。如君所见,连字符串放在哪个段中也要自己亲手安排,小程序尚可忍受,一旦代码规模上去就非常不方便。我们也可以把数据直接放在代码段中,比如:
;****************************************************************
.code INIT
;**************************************************************** DriverEntry proc pDriverObject:PDRIVER_OBJECT,/ pusRegistryPath:PUNICODE_STRING local status:NTSTATUS jmp Real_Start szenter db "enter driverentry",
szleave db "leave driverentry", Real_Start: mov status,STATUS_DEVICE_CONFIGURATION_ERROR invoke DbgPrint,addr szenter ;do someting you want! invoke DbgPrint,addr szleave mov eax, status ret DriverEntry endp
;****************************************************************
end DriverEntry
这样一来虽然不用自己操作段,但是毕竟稍显怪异,而且变量定义和使用还是要分开。无奈,只有用宏来解决了:
invoke DbgPrint,$CTA0("enter driverentry") invoke DbgPrint,$CTA0("leave driverentry")
辛勤的汇编语言工作者们多么希望能向c那样简单的方式来写啊 ^_^
puts("So Cool!");
但是VC对 标准 c99 的支持并不好,咋办呢?用gcc吧(不是广告哦。)有人可能会问gcc能写Windows下的驱动么?答案是肯定的。以下是偶总结出的2个方法:
1 gcc.exe + ld.exe
2 gcc.exe + link.exe
前者是全部是原汁原味的gcc;而后者编译器是gcc,连接器却是MS官方的link.exe。以下便是用 gcc 写的一个类似 ASM-Driver 的模版:
#include <stdio.h>
#include "ddk/ntddk.h" _stdcall NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,/
PUNICODE_STRING pRegistryPath)
{
NTSTATUS status = STATUS_DEVICE_CONFIGURATION_ERROR; DbgPrint("enter DriverEntry,I'm Hopy!/n"); DbgPrint("Leave DriverEntry,byb :)!/n"); return status;
}
简单吗?呵呵。注意开头的_stdcall一定要加,否则调用者会来平衡stack,这会造成stack异常,从而sys必须重启后才能卸载。活活,偶们可以利用gcc出色的代码优化功能来优化偶们的代码:
gcc -O3 -o miniDrv.obj -c miniDrv.c
注意我们并不连接只是编译,所以用 -c 选项,而且可以看见我们使用了 O3级别的优化。结果生成的PE文件只比用汇编生成的大几十字节,而且从逆向sys可以看到机器码布局非常简练几乎可以和汇编的相媲美了。
总结如下:
使用gcc编写NT下的驱动十分方便,只需要
gcc 包 + MS link + 一个好用的编辑器 即可。 :)
[原创]浅谈如何使用gcc开发NT核心驱动程序的更多相关文章
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- [原创]浅谈移动互联网App兼容性测试
[原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...
- [原创]浅谈Web UI自动化测试
[原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...
- [原创] 浅谈ETL系统架构如何测试?
[原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ...
- [原创]浅谈在创业公司对MVP的理解
[原创]浅谈在创业公司对MVP的理解 目前自已所处的公司类似一个创业平台,我们内部会不断的去孵化不同方向的产品,产品经理经常谈到的一个词就是MVP,所以有必需要去了解下什么是MVP? 1 什么是MVP ...
- [原创]浅谈IT人如何做理财规划
[原创]浅谈IT人如何做理财规划 鱼哥博客上多数写的是技术和管理相关,但很少有理财等话题,今天抽空来谈谈IT人如何做理财规划,如果要想学习理财,我想很有名的“标准普尔家庭资产象限图”上值得每个学习和理 ...
- [原创]浅谈移动App安全测试
[原创]浅谈移动App安全测试 移动互联网很火,就像当年互联网兴起一样,这几天和朋友在沟通交流,谈到一个话题,你们做金融App钱放在你们哪边安全不?会不会你们做的移动App不安全,让人盗了里面的资金, ...
- [原创]浅谈H5页面性能优化方法
[原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...
- [原创]浅谈H5页面性能测试
[原创]浅谈H5页面性能测试 H5页面我想各位都不陌生,随着移动互联网兴起,不管是App,还是H5都火起来了,最突出的2个表现是ios/android/前端等工程师薪水大涨,尤其是资深前端工程师40W ...
随机推荐
- dev中 使用一些控件后,窗体屏蔽右键某些菜单
使用Ribbon时,ribbonControl1.ShowToolbarCustomizeItem=false; 使用LayoutControl时,layoutControl1.AllowCustom ...
- javascript 手机号抽奖
案例 ---- 手机号抽奖 开始抽奖 停止 *具体的备注在代 ...
- ASP .Net Core 使用 Dapper 轻型ORM框架
一:优势 1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2,Dapper很快.Dapper的速度接近与IDataReader,取列表 ...
- javascript获取元素结点到页面的绝对距离的方式
var div = document.getElementById('div');var p = getPos(div); function getPos(obj) { var pos = {left ...
- C语言函数qsort的使用方法
qsort函数stdlib.h文件中,函数原型为 void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,co ...
- mysql错误:Error Code: 1175. You are using safe update mode and you tried to update a table……
今天遇到一个mysql错误: Error Code: . You are using safe update mode and you tried to update a table withou ...
- Git客户端使用
1.下载安装包 git: https://git-for-windows.github.io/index.html tortoisegit: https://download.tortoisegit ...
- [转]C 语言指针的使用
第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有 ...
- Java日期时间使用(转)
Java日期时间使用总结 转自:http://lavasoft.blog.51cto.com/62575/52975/ 一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个 ...
- jQuery插入节点的方法
注:摘自<锋利的jQuery(第二版)> append() 向每个匹配的元素内部追加内容: HTML代码:<p>我想说:</p>jQuery代码:$(" ...