Win32k 3 R0 to R3,鍵盤滑鼠輸入

2021-06-06 23:49:54 字數 3693 閱讀 7670

第三部分 r0 to r3

這部分有教主非常精彩和實用的分析,我就不瞎說了。

r3 to r0 是常規系統呼叫倒過來

中斷或者sysenter的東西:

ntstatus

keusermodecallback (

inulongapinumber,

inpvoidinputbuffer,

inulonginputlength,

outpvoid *outputbuffer,

inpulongoutputlength

)這個函式設定好棧的布局後呼叫kicallusermode

kicallusermode呼叫_kiserviceexit

返回到ring3的_keusercallbackdispatcher

keusercallbackdispatcher從_peb.kernelcallbacktable取得函式,執行,ntcallbackreturn返回

_peb.kernelcallbacktable是函式表,apinumber是服務呼叫號

這些函式傳遞的引數可以參考windows_2000_source_code\win2k\private\ntos\w32\ntuser\inc\ntcb.h

不同版本不一定一樣~

kd>dds 0x77d12970

77d12970 77d27f3c user32!__fncopydata

77d12974  77d587b3user32!__fncopyglobaldata

77d12978 77d28ec8 user32!__fndword

77d1297c 77d2b149 user32!__fnncdestroy

77d12980 77d5876c user32!__fndwordoptinlpmsg

77d12984 77d5896d user32!__fninoutdrag

77d12988 77d3b84d user32!__fngettextlengths

等等。。。

這個地方可以hook,xt也提供了檢測這個位置的功能,不過hook這裡的樣本倒是沒見過~這個欄位在應用層是唯讀的~~

hook wndproc的話倒是可以直接hook __fninoutlppoint5。不過太麻煩了,只是引數過濾的話就在keusermodecallback過濾了。

我看到過直接替換windows object裡面wndproc引數的東東。

kd> k

childebp retaddr 

0012f738 77d18734 4may!wndproc+0x18[c:\users\shendi\desktop\梅亞飛監視u盤拷貝ppt_src\4may_src\4may.cpp @167]

0012f764 77d18816user32!internalcallwinproc+0x28

0012f7cc 77d28ea0user32!usercallwinproccheckwow+0x150

0012f820 77d2d08auser32!dispatchclientmessage+0xa3

0012f848 7c92e453 user32!__fninoutlppoint5+0x27

0012f848 805026fcntdll!kiusercallbackdispatcher+0x13

b162b920 805a2d55 nt!kicallusermode+0x4

b162b97c bf83b414 nt!keusermodecallback+0x87

b162ba2c bf813f04 win32k!sfninoutlppoint5+0xbf

b162ba74 bf8140f6win32k!***sendmessagetoclient+0x176

b162bac0 bf80ec99 win32k!***sendmessagetimeout+0x1a6

b162bae4 bf83b194 win32k!***sendmessage+0x1b

b162bb44 bf826c4cwin32k!***initsendvalidateminmaxinfo+0x1b9

b162bb88 bf83a93c win32k!***adjustsize+0x22

b162bc6c bf83967e win32k!***createwindowex+0x8fe

b162bd20 8054267c win32k!ntusercreatewindowex+0x1c1

b162bd20 7c92e4f4 nt!kifastcallentry+0xfc

0012f848 7c92e453 ntdll!kifastsystemcallret

0012f890 77d2e389ntdll!kiusercallbackdispatcher+0x13

0012fd34 77d2e442user32!ntusercreatewindowex+0xc

0012fde0 77d2e4dc user32!_createwindowex+0x1ed

0012fe1c 00401451 user32!createwindowexa+0x33

0012fea4 004010e8 4may!initinstance+0x51[c:\users\shendi\desktop\梅亞飛監視u盤拷貝ppt_src\4may_src\4may.cpp @142]

0012ff20 00401fe3 4may!winmain+0x58[c:\users\shendi\desktop\梅亞飛監視u盤拷貝ppt_src\4may_src\4may.cpp @48]

0012ffc0 7c817077 4may!winmaincrtstartup+0x1b3[crtexe.c @ 330]

0012fff0 00000000 kernel32!baseprocessstart+0x23

第四部分 鍵盤滑鼠輸入

中斷服務把鍵盤碼發給鍵盤驅動,csrss開乙個執行緒win32k!rawinput迴圈read  irp給鍵盤驅動~

ros最新的0.3.14  csrss呼叫ntusercalloneparam,進入核心執行緒rawinputthreadmain,應該說這是更接近於windows的

看一下這個執行緒做了什麼,鍵盤按鍵操作中的時候會pending,等待pending的操作沒貼出來

for(;;)

keyboard_input_data這個結構是鍵盤驅動上傳資料標準結構

userprocesskeyboardinput這個函式

//得到目前的焦點,這個實在desktop的結構裡

pfocusqueue= intgetfocusmessagequeue();

if (pfocusqueue)

//鍵盤布局

if (!pkl)

pkl= w32kgetdefaultkeylayout();

將掃瞄碼轉換成虛擬按鍵,最後呼叫

usersendkeyboardinput(&kbdinput,false);

最終processkeyevent在處理完hook以及其他特殊情況以後

msqpostmessage(pfocusqueue,&msg, true, qs_key);傳送給焦點視窗

所以說要攔截鍵盤訊息太底層就要自己處理掃瞄碼了~~當然也不是不行

軟體可以模擬鍵盤輸入,就是ntusersendinput啦

Win32k 4 視窗鉤子

第五部分 視窗鉤子 一 ros下的流程 win2000版本有人分析過了 訊息鉤子是一種官方支援鉤子 可以攔截某乙個視窗或者全域性的訊息。訊息本應直接發到對應視窗的wndproc,現在要先傳送到我們設定的訊息 由我們的hook函式進行引數的收取 截獲 過濾 hhooksetwindowshookex ...

Win32 SDK學習筆記3

1 思考一下,視窗程式中為什麼要註冊視窗類?你想建立什麼樣的視窗呢?那麼,建立什麼樣的視窗呢?建立前,window系統可不知道你要的是什麼型別的視窗啊 比如標題欄上顯示什麼圖示,滑鼠形狀是什麼,視窗背景顏色等等 這些型別資訊應在你建立前事先告訴window系統。可以採用這種方法 就是我們事先寫乙份要...

Win32 對話方塊 3

onctlcolor ctlcolor dlg hbrush cdemodlg onctlcolor cdc pdc,cwnd pwnd,uint nctlcolor return hbr 根據控制項id更改,這個事件一直觸發 hbrush cdemodlg onctlcolor cdc pdc,c...