WhoUseMe 驅動實現

2021-08-04 14:46:06 字數 4354 閱讀 7745

函式名

作用注意

obreferenceobjectbyhandle

在當前程序的控制代碼表或核心控制代碼表中找到相應的表項

該函式會增加物件的引用計數

obreferenceobjectbypointer

遞增物件的指標引用計數pointercount

obplookupentrydirectory

給定乙個物件名,在特定的目錄節點下面尋找目標物件

單層搜尋,找到則增加物件的引用計數

obplookupobjectname

同上,逐層搜尋

obopenobjectbyname

根據物件名開啟乙個物件

裡面會呼叫obplookupobjectname 函式,返回目標物件的控制代碼,會增加引用計數

obreferenceobjectbyname

同上,返回的是物件的指標

會增加引用計數

obdereferenceobject

遞減物件的引用計數

傳入的是物件指標

// 這是上面的作者給出的**

pvoid obquerynameinfo(in pvoid object)

else

return (pvoid)nameinfo;

}// 這是ntoskernel 逆向得到的**,互相印證

if ( *(in_object - 22) & 2 )

v9 = (signed __int64)&v7->pointercount - obpinfomasktooffset[*(in_object - 22) & 3];

setevent(threadcontext->starteventhandle);

if ((status = waitforsingleobject(threadcontext->completedeventhandle, 100)) != wait_object_0)

;sprintf(szbuffer, "%d", threadcontext->threadhandle);

messageboxa(null, szbuffer, null, 0);

得到如下截圖:

之後我們在windbg 中得到物件的內容如下。

1: kd> dt _file_object 0xfffffa8032880ca0

nt!_file_object

+0x000 type : 0n5

+0x002 size : 0n216

+0x008 deviceobject : 0xfffffa80`3151e3c0 _device_object

+0x010 vpb : (null)

+0x018 fscontext : 0x00000000

`00010101 void

+0x020 fscontext2 : 0xfffff8a0`0bc84d60 void

+0x028 sectionobjectpointer : (null)

+0x030 privatecachemap : 0x00000000

`00000001 void

+0x038 finalstatus : 0n0

+0x040 relatedfileobject : (null)

+0x048 lockoperation : 0

'' +0x049 deletepending : 0

'' +0x04a readaccess : 0

'' +0x04b writeaccess : 0

'' +0x04c deleteaccess : 0

'' +0x04d sharedread : 0

'' +0x04e sharedwrite : 0

'' +0x04f shareddelete : 0

'' +0x050 flags : 0x40082

+0x058 filename : _unicode_string "\qq_771765819_pipe"

+0x068 currentbyteoffset : _large_integer 0x0

+0x070 waiters : 0

+0x074 busy : 1

+0x078 lastlock : (null)

+0x080 lock : _kevent

+0x098 event : _kevent

+0x0b0 completioncontext : (null)

+0x0b8 irplistlock : 0

+0x0c0 irplist : _list_entry [ 0xfffffa80`32880d60 - 0xfffffa80

`32880d60 ]

+0x0d0 fileobjectextension : (null)

檢視被阻塞執行緒的呼叫堆疊如下:

// 使用的是自定義的i/o

typedef struct _device_extension device_extension, *pdevice_extension;

typedef struct struct_get_obj_name,*pstruct_get_obj_name;

ntstatus dispatchdevicecontrol(pdevice_object deviceobject,pirp irp)

__try

if (pprocess == psinitialsystemprocess)

else

referencemode = irp->requestormode;

handle

= pgetname->hobjhandle;

}// 掛載到目標程序

kestackattachprocess(pprocess, &apcstate);

// 得到控制代碼對應的物件

status = obreferenceobjectbyhandle(

handle,

0,null,

referencemode,

&object,

null

);keunstackdetachprocess(&apcstate);

if(!nt_success(status))

querynameobject(object,pgetname->punicodestring);

status = irp->iostatus.status = status_success;

break;

}__except(exception_execute_handler)

}irp->iostatus.information =

0; status = irp->iostatus.status = status_success;

break;

}default:

}iocompleterequest(irp,io_no_increment);

return status;

}void querynameobject(pvoid object,punicode_string punicodestring)

驅動python python實現事件驅動

eventmanager事件管理類實現,大概就百來行 左右。encoding utf 8 系統模組 from queue import queue,empty from threading import class eventmanager def init self 初始化事件管理器 事件物件列表...

linux mmap驅動實現

在實現驅動程式的mmap函式時,要注意對映位址的轉換問題,見 定義乙個裝置結構體 這裡面這個memsize,最小都要是4096,因為記憶體對映是以頁為單位的。在實現 remap mmap函式時,如下 注意函式開頭的vma vm pgoff u32 virt to phys leedriverp me...

linux mmap驅動實現

在實現驅動程式的mmap函式時,要注意對映位址的轉換問題,見 定義乙個裝置結構體 cpp view plain copy struct leedriver 這裡面這個memsize,最小都要是4096,因為記憶體對映是以頁為單位的。在實現 remap mmap函式時,如下 cpp view plai...