第三部分 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...