日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hook KiUserExceptionDispatcher参数指针错误的问题

發布時間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hook KiUserExceptionDispatcher参数指针错误的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

跟了一個晚上,終于解決了

大概要實現的是用這個函數替換ntdll中的KiUserExceptionDispatcher,實現方法如下:

?VOID NTAPI KiUserExceptionDispatcher(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { DWORD retValue; if (RtlDispatchException(pExcptRec,pContext)) { retValue=::ZwContinue( pContext,0); }else{ retValue=::ZwRaiseException(pExcptRec,pContext,0); } /*略過.............*/ }

參考:http://www.longene.org/techdoc/0359381001224576966.html

這樣看著只是通過KiUserExceptionDispatcher來調用ZwContinue與Zw...函數,看著很正常,幾乎網上所有代碼都是這個形式來寫的(不知道他們是怎么通過的- -!)

運行時就出問題了,當有異常發生時 要么就是在RtlDispatchException里面不出來也沒反應,要么就是一直循環的調用他,這個函數是R3異常處理的入口點,只要這里面發生異常還是調用他 - -!

在正常情況下,進入函數第一條指令時:

ESP=返回地址,ESP+X才是參數

..........................................................................

跟到剛剛才發現,跑到函數入口點時[ESP]=第一個參數,[ESP+4]=第二個參數,根本沒有返回地址

而自己寫的這個函數,永遠是[ESP+4]=第一個參數,[ESP+8]=第二個參數.. - -! 這樣不錯才慘了...

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

這是KiUserExceptionDispatcher,異常無數,但從沒見過執行到77C7014A, ZwContinue直接進入內核了,而進ZwRaiseException后,估計程序就崩了,RtlRaiseException這里也是沒見執行過的,- - 都擺設..

-----------------------------------------------------------------------------------------------------

問題點找著了,翻遍了GG BING也沒見有說無返回地址參數問題,最后為了省事把他當作跳板轉到其它函數中處理(沒有匯編基礎的感覺這方法是最簡單*_*-)

VOID NTAPI KiUserExceptionDispatcher_BT(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { DWORD retValue; if (RtlDispatchException(pExcptRec,pContext)) { ::AfxMessageBox("ZwContinue"); retValue=::ZwContinue( pContext,0); }else{ ::AfxMessageBox("ZwRaiseException"); retValue=::ZwRaiseException(pExcptRec,pContext,0); } } VOID NTAPI KiUserExceptionDispatcher(PEXCEPTION_RECORD pExcptRec,PCONTEXT pContext) { __asm { /* -_-! 這里入棧看著有些不順似的-如果真不會執行到RETN貌似不用壓棧也得 */ push [esp+4] push [esp+4] call KiUserExceptionDispatcher_BT /* 看著不順眼,問題解決就成 - -! */ /*補充:需Release下,Debug棧是亂的*/ } }

?

哎,真走了不少彎路,當時以為是參數順序錯了..結果_估計_是該函數是由內核空間轉入用戶空間入口,則無返回地址入棧,網上文章也沒細看,問題解決百歲!

---------------------------------------------------------------------------------------------------------------------

注:

RtlDispatchException在Ntdll中未導出,需按各個版本處理該函數地址

處理如下:

typedef NTSTATUS(NTAPI *pRtlDispatchException)(PEXCEPTION_RECORD pExcptRec,CONTEXT * pContext); pRtlDispatchException RtlDispatchException=NULL; /*這是WIN7 64位旗艦版下的地址,也就是在反匯編中看到的第一個Call地址*/ RtlDispatchException=(pRtlDispatchException)0x77CB865B;

經過上面的函數處理,能夠捕捉到的異常貌似都能夠通過了,然后就能在程序中制造出種種異常,一一奸殺,=_=

轉載于:https://www.cnblogs.com/SilenceRet/archive/2010/12/04/6805047.html

總結

以上是生活随笔為你收集整理的Hook KiUserExceptionDispatcher参数指针错误的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。