首页
社区
课程
招聘
[原创]Win32Asm 驱动学习笔记《 HOOK SSDT》
发表于: 2013-8-6 12:00 12963

[原创]Win32Asm 驱动学习笔记《 HOOK SSDT》

2013-8-6 12:00
12963

SYSCALL_INDEX MACRO lpZwproc:REQ
mov eax, lpZwproc

mov eax,[eax+2] ;jmp dword ptr ds:[0F7B24390h]
mov eax,[eax] ; ZwTerminateProcess Base
mov eax,[eax+1] ;NtTerminateProcess Index
EXITM <eax>
endm
;***************************************************************************
; 一个简单的HOOK SSDT 框架 by nohacks WebHome: 4daK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6F1L8$3S2S2j5$3E0K6
;***************************************************************************

.386
.model flat, stdcall
option casemap:none

include w2k\ntstatus.inc
include w2k\ntddk.inc
include w2k\ntoskrnl.inc
include w2k\w2kundoc.inc

includelib \RadASM\masm32\lib\w2k\ntoskrnl.lib

include \RadASM\masm32\Macros\Strings.mac



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

; 根据给出的服务对应的Zw函数返回服务号,例如:SYSCALL_INDEX(ZwTerminateProcess)

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

SYSCALL_INDEX MACRO lpZwproc:REQ
mov eax, lpZwproc

mov eax,[eax+2] ;jmp dword ptr ds:[0F7B24390h]
mov eax,[eax] ; ZwTerminateProcess Base
mov eax,[eax+1] ;NtTerminateProcess Index
EXITM <eax>
endm



.data ?



OldProc dd ? ;用来保存原来的服务地址


.code


;***************************************************************************
; 根据给出的服务序号和替代服务地址修改ssdt表,返回值为原服务地址
;***************************************************************************
EditSSDT proc uses ecx dwIndex:dword,lpNowProc:dword


mov ecx, dwIndex ;服务号
mov eax, KeServiceDescriptorTable ;KSDT ,ntoskrnel SYSTEM_SERVICE_TABLE

mov eax,[eax] ; KSDT的指针

.if ecx>[eax+8] ;判断服务序号是否超出服务总数

mov eax,FALSE
ret

.endif

mov eax,[eax] ;SSDT的指针

pop [eax+ecx*4] ;保存原来的ServerBase


lea ecx,[eax+ecx*4] ;取序号地址 也就是 mov ecx,eax+ecx*4

push ecx ;保护ecx, MmIsAddressValid函数会修改ECX的值
invoke MmIsAddressValid,[ecx] ;检查地址是否有效
pop ecx

.if al== FALSE

jmp retun


.endif

;去掉写保护
push eax
cli
mov eax, cr0
and eax, not 10000h
mov cr0, eax
pop eax


;修改 SSDT
push lpNowProc
pop [ecx]


;恢复写保护
push eax
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti
pop eax


retun:

pop eax ;原来的ServerBase

ret


EditSSDT endp


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

收藏
免费 5
支持
分享
最新回复 (22)
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
2
汇编很好玩吗?
2013-8-6 12:05
0
雪    币: 106728
活跃值: (202444)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
+1
2013-8-6 12:15
0
雪    币: 217
活跃值: (898)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
4
+2
2013-8-6 12:40
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢共享
谢谢
2013-8-6 12:53
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
汇编很好玩吗?
如果没有后面的注释,可读性一塌糊涂,敢不敢后面不写注释
2013-8-6 13:26
0
雪    币: 750
活跃值: (227)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
7
呵呵,每个人的环境不一样,我是业余玩家,写驱动只会W32ASM不会其它。

写注释是因为照顾象我一样的新手朋友

因为我的代码完全是能用API就用API

所以有点汇编基础的人应该都能看懂

希望我的回答你能满意,谢谢!
2013-8-6 13:32
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼主分享
2013-8-6 14:00
0
雪    币: 167
活跃值: (200)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
汇编很好玩  汇编能力强 读程序代码能力不可能弱!
2013-8-6 14:27
0
雪    币: 750
活跃值: (227)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
10
还不错。。。。
2013-8-6 14:39
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
正在学习琢石成器,希望能早日看懂楼主的大作
2013-8-6 15:48
0
雪    币: 7278
活跃值: (5356)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
还可以,很喜欢用RadAsm
2013-8-6 17:01
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主能否把开发环境“RadAsm(Masm+Kmdkit)整合版”共享一下啊:)
2013-8-7 11:22
0
雪    币: 750
活跃值: (227)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
14
2013-8-7 11:26
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看来还有人玩汇编驱动....找到同类的感觉确实不错.  另回答上面的问题  汇编确实好玩....像我这类新手  除了汇编容易一点入门外  其它怕是想搞清楚来龙去脉还是相当的麻烦
2013-8-8 21:48
0
雪    币: 808
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
汇编接触系统底层,用多了感觉和c没有区别。
radasm非常不错。
2013-8-9 08:05
0
雪    币: 67
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
非常不错的贴子!我喜欢汇编
2013-8-10 01:38
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习中。。。。。
2013-8-10 03:38
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
冷嘲热讽很好玩么?
2013-8-11 12:57
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
push [eax+ecx*4]                         ;压入原来的ServerBase                              

   lea ecx,[eax+ecx*4]                    ;取序号地址 也就是 mov ecx,eax+ecx*4

   push ecx                                ;保护ecx, MmIsAddressValid函数会修改ECX的值
   invoke MmIsAddressValid,ecx             ;检查地址是否有效

    .if al== FALSE                  
      ;建议加上add esp,8  
      
      ret
      
    .endif

这样的写法很危险. 当al为false的时候,未平衡堆栈直接使用了ret ,当然这个函数因为有参数不会出错
如果没有参数和变量,当al为false的时候会出错.

例:

将生成:


test1 将出错, test2 与 test3 正常
上传的附件:
2013-8-12 15:02
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
仔细的读了下,发现lz取ssdt序号的思路不错. 我以前是用内核工具查看对应函数的序号直接拿来用.受教了。

一点小建议,SYSCALL_INDEX 宏里直接使用eax就可以不用去注意保存ecx了.
2013-8-12 15:17
0
雪    币: 750
活跃值: (227)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
22
[QUOTE=AsmCoder;1208932]push [eax+ecx*4]                         ;压入原来的ServerBase                              

   lea ecx,[eax+ecx*4]                    ;取序号地址 也就是 mov e...[/QUOTE]

受教了,一直没注意这方面的问题。

我修改了下代码 ,在判断返回前就恢复堆栈。
2013-8-12 16:47
0
雪    币: 750
活跃值: (227)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
23
谢谢你的建议,已经修改。

之前是出于调用程序可能用EAX和SYSCALL_INDEX宏同时做为参数的考虑。
2013-8-12 17:03
0
游客
登录 | 注册 方可回帖
返回