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参数指针错误的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [摘记]数值方法04——函数求值
- 下一篇: Adobe称Flash技术遭排斥 呼吁政