[原创]浅谈如何使用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 ...
随机推荐
- Android Studio之build.gradle小技巧
一: 当你工程引用android 的support包的时候,常常会这样写: dependencies { compile 'com.android.support:recyclerview-v7:22 ...
- js查找元素
1.className <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...
- 在win8.1下安装laravel5.1时碰到的坑不少,但总算搞掂,真有点不容易。
安装好php后,安装laravel的方法有如下几种. 1.先安装好composer, 再用composer下载资源并安装,命令如下: composer create-project laravel/l ...
- Android客户端与服务器交互中的token
学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...
- VS2013启动项目调试的时候会启动本地IIS
VS2013启动项目调试的时候会启动本地IIS ,而在这种状态下去调试程序,会有很多功能用不了,而且还会有错误:如下图: 解决方法,将托管管道模式更改一下就行了:
- Subsequence(暴力+二分)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10875 Accepted: 4493 Desc ...
- T-SQL变量
T-SQL中变量分为全局变量和局部变量,分别使用@@和@前缀. 全局变量 常用的全局变量有@@VERSION .@@IDENTITY.@@ERROR.@@ROWCOUNT 用法 select @@VE ...
- CSS3 border属性的妙用
.ribbon { background: #45c9c8; position: absolute; width: 75px; height: 25px; line-height: 25px; top ...
- FPGA开发(3)
转载 榨干FPGA片上存储资源 记得Long long time ago,特权同学写过一篇简短的博文<M4K使用率>,文章中提到了Cyclone器件的内嵌存储块M4K的配置问题.文中提到了 ...
- OC弱语法
OC是在运行过程中才会检测对象有没有实现相应的方法,所有编译过程只给出警告:可能找不到对应方法: 如果程序在运行过程中出错,就会出现程序闪退: 类方法:类可以直接调用的方法,相当于java中的 ...