原文链接:[原创]浅谈如何使用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核心驱动程序的更多相关文章

  1. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  2. [原创]浅谈移动互联网App兼容性测试

    [原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...

  3. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  4. [原创] 浅谈ETL系统架构如何测试?

    [原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ...

  5. [原创]浅谈在创业公司对MVP的理解

    [原创]浅谈在创业公司对MVP的理解 目前自已所处的公司类似一个创业平台,我们内部会不断的去孵化不同方向的产品,产品经理经常谈到的一个词就是MVP,所以有必需要去了解下什么是MVP? 1 什么是MVP ...

  6. [原创]浅谈IT人如何做理财规划

    [原创]浅谈IT人如何做理财规划 鱼哥博客上多数写的是技术和管理相关,但很少有理财等话题,今天抽空来谈谈IT人如何做理财规划,如果要想学习理财,我想很有名的“标准普尔家庭资产象限图”上值得每个学习和理 ...

  7. [原创]浅谈移动App安全测试

    [原创]浅谈移动App安全测试 移动互联网很火,就像当年互联网兴起一样,这几天和朋友在沟通交流,谈到一个话题,你们做金融App钱放在你们哪边安全不?会不会你们做的移动App不安全,让人盗了里面的资金, ...

  8. [原创]浅谈H5页面性能优化方法

    [原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...

  9. [原创]浅谈H5页面性能测试

    [原创]浅谈H5页面性能测试 H5页面我想各位都不陌生,随着移动互联网兴起,不管是App,还是H5都火起来了,最突出的2个表现是ios/android/前端等工程师薪水大涨,尤其是资深前端工程师40W ...

随机推荐

  1. HTML1网页三部份内容

    网页三部份内容:HTML CSS Javascript 路径:一般做网页的时候用的相对路径. images/aaa.jpg 网页同一个目录中找images文件夹,再在images里面找aaa.jpg ...

  2. WebService到底是什么

    WebService到底是什么 http://blog.csdn.net/wooshn/article/details/8069087 张孝祥WebService  http://wenku.baid ...

  3. 实现FileCopy(Ring0 x86 x64)

    1.1 内核不接受一个字符串文件路径,必须填写一个OBJECT_ATTRIBUTES结构. 这个结构,在InitializeObjectAttributes初始化 typedef struct _OB ...

  4. Android 添加菜单项

    刚开始看郭大神的<>,实现以下里面的一些例子.利用Menu给APP添加一个菜单项. 效果图 结构图 在res的menu文件夹下创建一个xml文件,当然你也可以使用系统创建的main.xml ...

  5. jquery与ajax的应用

    1.编写第一个Ajax的例子,先来看一下传统的JavaScript实现的ajax例子. 首先在前台页面中书写HTML代码. <input type="button" valu ...

  6. nginx,wsgi,flask之间的关系

    之前看写flask 应用的一些疑问,百度上的答案解释的不错,这里记着以后可以看看Web 服务器层对于传统的客户端 - 服务器架构,客户端向服务器发送请求,服务器接收请求,处理请求,最后给客户端返回请求 ...

  7. Oracle EBS-SQL (INV-5):检查期间拉式物料领用记录数.sql

    select         FU.description                                  操作者,         KK.DESCRIPTION           ...

  8. Balsamiq Mockups registration code

    最近使用Mockups 进行页面原型设计,发现是未注册的,于是网上查询了下注册码,居然有效,在此记录下.    有需要的朋友也可以试试. Name:Rick Dong     Key:eNrzzU/O ...

  9. VS2012中的全部预定义键盘快捷键列表

    原文 http://www.elanblog.com/2013/05/14/vs2012-key-list/#sectionToggle7 Visual Studio 集成开发环境 (IDE) 包括若 ...

  10. haproxy hdr_beg 配置

    v-dev-app01:/root# ping www.zjdev.com PING www.zjdev.com (192.168.32.16) 56(84) bytes of data. 64 by ...