ZT R3使用呼叫門切R0

2021-07-23 19:50:41 字數 4896 閱讀 7503

找了個例子,可以從r3通過"呼叫門"切到r0.

人家r0的**用masm寫的, 用c寫也行.

r0中判斷未用的選擇子,從第一項開始(不是從第0項開始)

//

// #include "stdafx.h"

#include #include #include #include dword g_dwarypagedirbk[1024];//儲存頁表的全域性變數陣列

int main(int argc, char* argv)

; dword* pr0pagedir = (dword*)0xae100000;

int i = 0;

/**段選擇子是段暫存器的內容。

雖然386處理器中段暫存器還是16位的,但是在保護模式下,其內容的意義已經發生了變化,不再是表示段基位址,而是表示段描述符在描述符表中的位置。

其中第0位和第1位是rpl(request privilege level 請求特權級),用以進行訪問許可權檢查;

第2位是ti(task indication,任務指示),其值為0表示使用gdt,為1表示使用ldt;

第3至15位是段描述符在相應的描述符表中的索引。

*//** 呼叫門選擇子在驅動中已經新增了, 現在構造r3用的選擇子.

設驅動中呼叫門選擇子gdt索引為x

新選擇子值 = gdt索引值 | ti0 | rpl3

= (x << 3) | 0 | 3

驅動中列印的是 gdt index = 8

呼叫門的選擇子 = (x << 3) | 0 | 3

= (8 << 3) | 0 | 3

= 64 | 0 | 3

= 0x43

*/word farcall = ;

printf(">> call gate\r\n");

strcpy(szbuf, "after call gate, must use r0's function, crt function invalid\r\n");

outputdebugstring(szbuf);

_asm

// 現在已經是r0了, crt函式不好使了

// 這下面要呼叫r0的函式

printf("<< call gate\r\n"); ///< 不好使了

_asm

// 從呼叫門返回後,許可權是r0, 可以訪問r0的資源

for (i = 0; i < 1024; i++)

_asm

sprintf(szbuf, "page directory for the process, pid=%x\n", getcurrentprocessid());

outputdebugstring(szbuf); ///< 不好使了

for (i = 0; i < 1024; i++)

}outputdebugstring("end\r\n");

system("pause");

return0;}

; mycallgate.inc

include w2k\ntstatus.inc

include w2k\ntddk.inc

include w2k\ntoskrnl.inc

includelib d:\radasm

\masm32\lib

\w2k\ntoskrnl.lib

include d:\radasm

\masm32\macros

\strings.mac

callgate struct

offsetl dw 0

selector dw 0

dcount db 0

gtype db 0

offseth dw 0

callgate ends

; mycallgate.asm

.386

.model flat, stdcall

option casemap:none

include mycallgate.inc

.const

ccounted_unicode_string "\\device\\mycallgate",g_usdevicename,4

ccounted_unicode_string "\\??\\mycallgate",g_ussymboliclinkname,4

gdt_limit = 03ffh

gate_type = 0ech

.code

ring0fun proc

pushad

pushfd

cliinvoke dbgprint, $cta0("mycallgate function executed\n")

;add your code here, you can do anything if you like.

stipopfd

popad

retf

ring0fun endp

addcallgate proc funcaddr:ulong

pushfd

pushad

push esi

sgdt [esp-2]

pop esi

mov eax,8

xor ecx, ecx ; 插入的新選擇子 gdt表索引

.while eax < gdt_limit

lea edx,[esi+eax]

assume edx:ptr callgate

test [edx].gtype,80h

.if zero?

mov ebx,funcaddr

mov [edx].offsetl,bx

mov [edx].selector,08h

mov [edx].dcount,0

mov [edx].gtype,gate_type

shr ebx,16

mov [edx].offseth,bx

invoke dbgprint, $cta0("gdt index : [%d]\n"), ecx

.break

.endif

assume edx:nothing

add eax,8

inc ecx

.endw

popad

popfd

retaddcallgate endp

dispatchcontrol proc uses esi edi pdeviceobject:pdevice_object,pirp:pirp

mov esi,pirp

assume esi:ptr _irp

mov [esi].iostatus

.status ,status_success

and [esi].iostatus

.information,0

invoke iocompleterequest,pirp,0

mov eax,[esi].iostatus

.status

assume esi:nothing

retdispatchcontrol endp

driverunload proc pdriverobject:pdriver_object

invoke iodeletesymboliclink,addr g_ussymboliclinkname

mov eax,pdriverobject

invoke iodeletedevice,(driver_object ptr[eax]).deviceobject

retdriverunload endp

driverentry proc pdriverobject:pdriver_object,pusregistrypath:punicode_string

local status:ntstatus

local pdeviceobject:pdevice_object

mov status,status_device_configuration_error

invoke iocreatedevice,pdriverobject,0,addr g_usdevicename,file_device_unknown,0,false,addr pdeviceobject

.if eax == status_success

invoke iocreatesymboliclink ,addr g_ussymboliclinkname,addr g_usdevicename

.if eax == status_success

mov eax,pdriverobject

assume eax:ptr driver_object

mov ecx,irp_mj_maximum_function + 1

.while ecx

dec ecx

mov [eax].majorfunction[ecx * (sizeof pvoid)],offset dispatchcontrol

.endw

mov [eax].driverunload,offset driverunload

assume eax:nothing

invoke addcallgate,offset ring0fun

mov status,status_success

.else

invoke iodeletedevice,pdeviceobject

.endif

.endif

mov eax,status

retdriverentry endp

end driverentry

使用OutputDebugString除錯視窗程式

學程式設計是從dos下開始的,用了一定時間的tc2.0,使得養成了用printf輸出變數值進行除錯的壞習慣。到了寫視窗程式時,就遇到了些麻煩。視窗程式沒有方便的進行控制台輸出的方法 其實是我不知道 於是,用了幾年的用messagebox進行輸出的除錯手段,太麻煩了,因為messagebox會打斷程式...

Task3 模型調優

使用網格搜尋法對7個模型進行調優 調參時採用五折交叉驗證的方式 並進行模型評估 import pandas as pd import numpy as np from sklearn.model selection import gridsearchcv from sklearn.model sel...

jvm調優工具使用

要使用 visualgc 必須在遠端機上啟動jstatd 程式,否則會顯示 not supported for this jvm 錯誤 jstatd could not create remote object access denied j a.util.propertypermission j ...