;名称:MyKmd.asm
;功能:一个很简单的WDM(KDM)驱动程序,为自己的程序提供Ring0。
;说明:需要由“LoadMyKmd.exe”来安装。
;>>>>>>>>>>>>>>>STRUCT>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CALLGATE STRUCT
OFFSETL DW 0
SELECTOR DW 0
DCOUNT DB 0
GTYPE DB 0
OFFSETH DW 0
CALLGATE ENDS
DESCRIPTOR STRUCT
LIMITL DW 0
BASEL DW 0
BASEM DB 0
ATTRIBUTES DW 0
BASEH DB 0
DESCRIPTOR ENDS
;>>>>>>>>>>>>>>>>>equ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CODES_SEL = 3E8H
CODE_TYPE = 0CF9AH
GATE_TYPE = 0ECH
;>>>>>>>>>>>>>>>>>Code>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
DriverEntry:
pushfd
pushad
;取得GDTR内容
push edx ;压栈edx,esp-4,构建4字节空间
sgdt [esp-2] ;GDTR是48位,这里利用了技巧,在栈中构建了6字节空间,同时读出GDTR内容
;而且还不破坏堆栈指针,巧巧巧!
pop edx ;全局描述符表基地址——这里只关心基址(在高双字,高址),所以出栈即是
mov eax,edx ;存放全局描述符开始地址
;在全句描述符表开始地址存放retn指令机器码, 全句描述符表第一个描述符为空
;表述符,被保留,没被用书上说这个描述符应该全为0这里看出 可以写东西进去。
mov BYTE ptr [edx],0C3H
mov ecx,3E0h ;定位自己的门描述符,
add edx,ecx ;
assume edx:ptr CALLGATE ;让描述符符位置在全局描述符的3E0这个位置
cmp [edx].SELECTOR,CODES_SEL
jz _ToEnd
mov [edx].OFFSETL,ax ;创建门描述符
mov [edx].SELECTOR,CODES_SEL
mov [edx].DCOUNT,0
mov [edx].GTYPE,GATE_TYPE
shr eax,16
mov [edx].OFFSETH,ax
;描述符的偏移地址其实就是上面说到的那个retn指令地址,当call 这个门的时候
;只从堆栈弹出EIP地址,所以CS寄存器没被覆盖,所以还是ring0权限
add edx,8
assume edx:ptr DESCRIPTOR
mov [edx].LIMITL,0FFFFH ;创建自己的代码段描述符
mov [edx].BASEL,0
mov [edx].BASEM,0
mov [edx].ATTRIBUTES,CODE_TYPE
mov [edx].BASEH,0
_ToEnd:
popad
popfd
mov eax,0C0000182h
ret 8
end DriverEntry
;名称:LoadMyKmd.asm
;功能:安装驱动程序“MyKmd.sys”使用。
;说明:必须生成“MyKmd.sys”之后才能正确运行。
;编译方式——见程序尾部
.data
szError db '装载驱动失败',0
szOK1 db '驱动安装成功',0
szOK db 'OH YEAH.~~!',0
szMyWdm db 'MyKmd.sys',0
szMyWdnName db 'MyKmd',0
szBuffer db MAX_PATH dup (0)
hSCManager dd ?
hService dd ?
.code
start:
invoke OpenSCManager,NULL,NULL,SC_MANAGER_CREATE_SERVICE
.if !eax
invoke MessageBox,0,addr szError,0,MB_ICONERROR or MB_OK
jmp _Err
.endif
mov hSCManager,eax
push ecx
invoke GetFullPathName,addr szMyWdm,sizeof szBuffer,addr szBuffer,esp
pop ecx
invoke CreateService,hSCManager,addr szMyWdnName,addr szMyWdm, \
SERVICE_START or DELETE,SERVICE_KERNEL_DRIVER, \
SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE, \
addr szBuffer,0,0,0,0,0
.if !eax
invoke MessageBox,0,addr szError,0,MB_ICONERROR
jmp _Err
.endif
mov hService,eax
invoke StartService, hService, 0, NULL
invoke DeleteService, hService
invoke CloseServiceHandle, hService
invoke CloseServiceHandle, hSCManager
invoke MessageBox,0,addr szOK1,addr szOK,0
_Err:
invoke ExitProcess,0
end start
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!