首页
社区
课程
招聘
[推荐]下定决心好好学习内核驱动编程
发表于: 2010-9-23 01:26 20992

[推荐]下定决心好好学习内核驱动编程

2010-9-23 01:26
20992

以前自己一直在应用层编程级别上混,现在决定了,要向内核和系统底层驱动进军!主要是因为前段时间看论坛上一个朋友写的代码是讲的内枋编程方面的,不禁有情感叹,自己老是在应用层混,永远都不法达到高手的地步,现在狠下心来,决定潜心研究内核驱动编程,可能以后会把我学习中的一点一滴都记下来,为以后复习做好基础,因为我想学习内核不是一两天的事,既然下决了决心,就要把它学好了!

下面是我最近在研究的一个内核工具中的一些源代码,我有一个疑问,这些代码怎么很像是在写服务的程序,开始不知道为什么,最近在网上找到老罗的一本KMD教程,有这方面的介绍,这里也引用一下:
Windows NT使用某种机制来启动进程,并让它们不和某个具体的交互式的用户界面相关联,这些进程就被称为服务(service),服务的一个很好的例子就是Web服务器,这些Web服务都没有用户界面,服务是唯一以这种方式运行的应用程序(注:指没有用户界面,当然,严格地说病毒、木马以及所有不想见光的程序也是这样的~~),服务可以在系统启动的时候自动启动,也可以被手工启动,从这一点来看,设备驱动程序和服务是类似的

下面有一些很经典的代码,可以作为以后写驱动程序作为参考:
驱动程序模板:

驱动控制程序模板
注册驱动:
RegisterDriver proc uses esi edi ebx pszDriverName:LPSTR, pszDriverPath:LPSTR

        xor ebx, ebx                ; assume error
        mov edi, offset g_szFail

        invoke OpenSCManager, NULL, NULL, SC_MANAGER_CREATE_SERVICE
        .if eax != NULL
                mov esi, eax

                ; Register driver - fill registry directory
                invoke CreateService, esi, pszDriverName, pszDriverName, \
                                        0, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, \
                                        pszDriverPath, NULL, NULL, NULL, NULL, NULL

                invoke LastError

                .if eax != NULL
                        invoke CloseServiceHandle, eax
                        inc ebx                                        ; success
                        mov edi, offset g_szSuccess
                .endif
                invoke CloseServiceHandle, esi
        .else
                invoke MessageBox, NULL, addr g_szOpenSCManagerError, addr g_szCriticalError, MB_OK + MB_ICONSTOP
        .endif
       
                return ebx

RegisterDriver endp

卸载驱动:
UnregisterDriver proc uses esi edi ebx pszDriverName:LPSTR

        xor ebx, ebx                ; assume error
        mov edi, offset g_szFail

        invoke OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
        .if eax != NULL
                mov esi, eax
               
                ; Unregister driver - remove registry directory
                invoke OpenService, esi, pszDriverName, DELETE

                invoke LastError

                .if eax != NULL
                        push eax
                        invoke DeleteService, eax

                        invoke LastError

                        .if eax != 0
                                inc ebx                                        ; success
                                mov edi, offset g_szSuccess
                        .endif
                        call CloseServiceHandle
                .endif

                invoke CloseServiceHandle, esi
        .else
                invoke MessageBox, NULL, addr g_szOpenSCManagerError, addr g_szCriticalError, MB_OK + MB_ICONSTOP
        .endif

        return ebx

UnregisterDriver endp

运行驱动:
RunDriver proc uses esi edi ebx pszDriverName:LPSTR

        xor ebx, ebx                ; assume error
        mov edi, offset g_szFail

        invoke OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
        .if eax != NULL
                mov esi, eax
               
                ; Unregister driver - remove registry directory
                invoke OpenService, esi, pszDriverName, SERVICE_START

                invoke LastError

                .if eax != NULL
                        push eax
                        invoke StartService, eax, 0, NULL
                       
                        invoke LastError
                       
                        .if eax != 0
                                inc ebx                                        ; success
                                mov edi, offset g_szSuccess
                        .endif

                        call CloseServiceHandle
                        mov edi, offset g_szSuccess
                .endif
                invoke CloseServiceHandle, esi
        .else
                invoke MessageBox, NULL, addr g_szOpenSCManagerError, addr g_szCriticalError, MB_OK + MB_ICONSTOP
        .endif

        return ebx

RunDriver endp

停止驱动:
StopDriver proc uses esi ebx pszDriverName:LPSTR

LOCAL sest:SERVICE_STATUS

        xor ebx, ebx                ; assume error
        mov edi, offset g_szFail

        invoke OpenSCManager, NULL, NULL, SC_MANAGER_CONNECT
        .if eax != NULL
                mov esi, eax
               
                ; Unregister driver - remove registry directory
                invoke OpenService, esi, pszDriverName, SERVICE_STOP

                invoke LastError

                .if eax != NULL
                        push eax
                        mov ecx, eax
                        invoke ControlService, ecx, SERVICE_CONTROL_STOP, addr sest
                       
                        invoke LastError

                        .if eax != 0
                                inc ebx                                        ; success
                                mov edi, offset g_szSuccess
                        .endif
                        call CloseServiceHandle
                .endif

                invoke CloseServiceHandle, esi
        .else
                invoke MessageBox, NULL, addr g_szOpenSCManagerError, addr g_szCriticalError, MB_OK + MB_ICONSTOP
        .endif

        return ebx

StopDriver endp

控制驱动:
ControlDriver proc uses esi edi ebx pszDriverName:LPSTR, dwCode:DWORD

LOCAL acBuffer[MAX_PATH]:CHAR
LOCAL dwBytesReturned:DWORD

        xor ebx, ebx                ; assume error
        mov edi, offset g_szFail

        invoke GetVersion
        .if al >= 5
                mov eax, $CTA0("\\\\.\\Global\\%s")
        .else
                mov eax, $CTA0("\\\\.\\%s")
        .endif
        invoke wsprintf, addr acBuffer, eax, pszDriverName

        invoke CreateFile, addr acBuffer, GENERIC_READ + GENERIC_WRITE, 0, \
                                NULL, OPEN_EXISTING, 0, NULL

        invoke LastError

        .if eax != INVALID_HANDLE_VALUE
                mov esi, eax
                invoke DeviceIoControl, esi, dwCode, NULL, 0, NULL, 0, addr dwBytesReturned, NULL

                invoke LastError

                .if eax != 0
                        inc ebx                                        ; success
                        mov edi, offset g_szSuccess
                .endif
                invoke CloseHandle, esi
        .else
                invoke MessageBox, NULL, $CTA0("Can't get Driver handle."), addr g_szCriticalError, MB_OK + MB_ICONSTOP
        .endif

        return ebx

ControlDriver endp

上面几个函数都很好理解,我只想给大家介绍一下最后一个函数是做什么?
当我们启动驱动之后,我们要用这个函数去控制它,首先我们使用CreateFile函数打开驱动,以获得一个文件句柄,当CreateFile函数成功地创建或者打开指定的设备,那么返回值就是设备句柄,否则返回值是INVALID_HANDLE_VALUE。
       invoke CreateFile, addr acBuffer, GENERIC_READ + GENERIC_WRITE, 0, \
NULL, OPEN_EXISTING, 0, NULL
如果上面返回有效的设备句柄,现在就可以像写应用程序那个调用ReadFile,WriteFile,以及DeviceIoControl函数来和设备通讯。
         invoke DeviceIoControl, esi, dwCode, NULL, 0, NULL, 0, addr     dwBytesReturned, NULL

这样一个驱动的控制程序也就完了,也不是很难,这让我想起了一句话:这个社会上没有学不会的知识,只是看你肯不肯花时间去学!

好了,今天就先不学习到这里,至少知道了几个驱动控制函数,呵呵~~每天进步一点点~~相信以后我也可以很自信的去研究内核安全编程!!!加油


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
"好了,今天就先不学习到这里"
呵呵~~
2010-9-23 07:47
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
恩,等你今天再更新啊,哈哈~
2010-9-23 08:00
0
雪    币: 109
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
楼主有决心。跟着学习,,,,,,我学习过下后来种种原因,,,又没学了。 我也下决心要学了。
2010-9-23 08:25
0
雪    币: 839
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呵呵!!!!向楼主学习!
2010-9-23 09:29
0
雪    币: 362
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
向楼主学习!
2010-9-23 13:12
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
7
向楼主学习,我是一面学C,一面学内核
2010-9-23 14:42
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
内核实际上还没应用层强大
2010-9-23 16:04
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
用C写会比较容易把。
其实现在的WDM,WDF式驱动也简单一些了,MS封装了许多东西。
2010-9-23 16:36
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果特别喜欢汇编 可以试试
不然还是用c吧
2010-9-23 21:08
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
为什么要用汇编写驱动啊?浪费时间。
2010-9-24 11:57
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
驱动写的再好....都会被360给提示的所以想学好驱动 先考虑一下如何对付360吧
2010-9-24 12:08
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
13
五笔打的太快,没注意~~其实不管用汇编还是用C,主要是要掌握内核中的精髓,用哪种语言去写我想这个无所谓,也许以后用多用C语言去写,因为必竟用C去写,还是方便一点,文章我一有时间就会更新的~~感谢大家的支持~~
2010-9-24 19:35
0
雪    币: 39
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
支持一下 也打算进军内核
2010-9-24 20:04
0
雪    币: 126
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我也在学。顶一个
2010-9-27 10:19
0
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持下正正, 不过你这么高调老大要说你了.
2010-9-27 23:10
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
同样用五笔的路过
2010-9-28 11:22
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
____________________________________________
      push eax
      mov ecx, eax
      invoke ControlService, ecx, SERVICE_CONTROL_STOP, addr sest
      
      invoke LastError

      .if eax != 0
        inc ebx          ; success
        mov edi, offset g_szSuccess
      .endif
      call CloseServiceHandle
________________________________
上面的代码写的,不仔细看,还真很难看懂!
2010-9-28 12:01
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
支持熊猫正正  潜力贴留名.Opera插图补丁.字数补丁..
2010-10-4 12:34
0
雪    币: 163
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
顶一下,我也想学习,一起努力吧。
2010-10-6 20:23
0
雪    币: 63
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
精神支持 深入学习内核驱动
2011-5-25 10:22
0
雪    币: 7160
活跃值: (1170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
正在学习中!想楼主学习!
2011-5-25 15:08
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
也支持下,我也要好好学习了!
2011-5-25 23:18
0
雪    币: 632
活跃值: (93)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
24
我也在学。顶一个
2011-5-31 14:09
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
熊猫正正 五笔打的太快,没注意~~其实不管用汇编还是用C,主要是要掌握内核中的精髓,用哪种语言去写我想这个无所谓,也许以后用多用C语言去写,因为必竟用C去写,还是方便一点,文章我一有时间就会更新的~~感谢大家的 ...
熊猫,你写这么多汇编,脑袋不胀么
2019-6-15 16:49
0
游客
登录 | 注册 方可回帖
返回
//