天天看点

[原创]浅谈如何使用gcc开发NT核心驱动程序

 [原创]浅谈如何使用gcc开发nt核心驱动程序

    一谈到在 win nt 下开发核心驱动程序,可能不少人首先都会想到微软“正统”

的vc来。诚然,用vc 配合 winddk 的确工作的不错,但或许我们可以让其变

得更简单更完善一些。

    其实偶一般是用 masm32v9 + editplus2 编写 nt内核驱动,仅此而已。

从环境搭建的便捷性和编写代码的灵活性来说无疑这是非常高的。但汇编

终归是汇编,虽然强大,但很多事都要自己动手来做,往往很简单的功能都

要用比较“生硬”的方法来完成,比如:

;****************************************************************

.data

         szenter db "enter driverentry",0

         szleave db "leave driverentry",0

.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 模版。如君所见,连字符串放在哪个段

中也要自己亲手安排,小程序尚可忍受,一旦代码规模上去就非常不方便。我们

也可以把数据直接放在代码段中,比如:

  jmp real_start

  szenter db "enter driverentry",0

  szleave db "leave driverentry",0

real_start:

 mov status,status_device_configuration_error

    这样一来虽然不用自己操作段,但是毕竟稍显怪异,而且变量定义和

使用还是要分开。无奈,只有用宏来解决了:

 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 + 一个好用的编辑器 即可。 :)

继续阅读