首页
社区
课程
招聘
[旧帖] [原创]搞了半天,终于Hook了KiUserExceptionDispatcher 0.00雪花
发表于: 2013-8-4 14:37 5519

[旧帖] [原创]搞了半天,终于Hook了KiUserExceptionDispatcher 0.00雪花

2013-8-4 14:37
5519
网上找的方法要么不全,要么不靠谱,还是要自己动手,现贴上源码
有不对的地方,还请指正
typedef NTSTATUS (__stdcall *pRtlDispatchException) (PEXCEPTION_RECORD pExcptRec, CONTEXT *pContext);
pRtlDispatchException RtlDispatchException = (pRtlDispatchException)0x7700B51A;        //win764下的地址

typedef NTSTATUS (NTAPI *pKiUserExceptionDispatcher) (PEXCEPTION_RECORD pExcptRec, CONTEXT *pContext);
pKiUserExceptionDispatcher old_KiUserExceptionDispatcher = NULL;

typedef NTSTATUS (NTAPI *pZwContinue) (PCONTEXT pContext, int num);
pZwContinue ZwContinue = NULL;

typedef NTSTATUS (NTAPI *pZwRaiseException) (PEXCEPTION_RECORD pExcptRec, CONTEXT *pContext, int num);
pZwRaiseException ZwRaiseException = NULL;

VOID NTAPI KiUserExceptionDispatcher_My(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
        {
                cld
                push [esp+4]
                push [esp]
                call KiUserExceptionDispatcher_My;
                ret 8
        }
}

void InLineHook_KiUserExceptionDispatcher()
{
        HMODULE h = LoadLibraryA("ntdll.dll");
        //PLONG newaddr = (PLONG)&KiUserExceptionDispatcher;

        //KiUserExceptionDispatcher = (pKiUserExceptionDispatcher)(GetProcAddress(h, "KiUserExceptionDispatcher"));
        old_KiUserExceptionDispatcher = (pKiUserExceptionDispatcher)(GetProcAddress(h, "KiUserExceptionDispatcher"));

        ZwContinue = (pZwContinue)(GetProcAddress(h, "ZwContinue"));
        ZwRaiseException = (pZwRaiseException)(GetProcAddress(h, "ZwRaiseException"));
        //KiUserExceptionDispatcher = (pKiUserExceptionDispatcher)My_KiUserExceptionDispatcher;
        TRACE("old_Ki: %x \n", old_KiUserExceptionDispatcher);

        WriteProcessMemory(GetCurrentProcess(), old_KiUserExceptionDispatcher, &KiUserExceptionDispatcher, 4, NULL);
        if (h)
        {
                CloseHandle(h);
        }
}

void CKiUEDDlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码
        InLineHook_KiUserExceptionDispatcher();
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
CPU Disasm
Address                            Hex dump            Command                                       Comments
76FC0100 KiUserExceptionDispatcher     E9              db      E9                                    ; ntdll.KiUserExceptionDispatcher(pExceptionRecord,pContext)
76FC0101                               FB              db      FB
76FC0102                               FE              db      FE
76FC0103                               2C              db      2C                                    ; char ','
76FC0104                               8C              db      8C
76FC0105                               8B              db      8B
76FC0106                               1C              db      1C
76FC0107                               24              db      24                                    ; char '$'
76FC0108                               51              db      51                                    ; char 'Q'
76FC0109                               53              db      53                                    ; char 'S'
76FC010A                               E8              db      E8
76FC010B                               0B              db      0B
Hook后是这样,试了一下内存断点,可以正常运行
2013-8-4 14:38
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很厉害。。。。。。学习+收藏
2013-8-7 10:17
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
这种做法不推荐 :
1. 程序编译时如果启用了ASLR,则此方法会失效。
2.此方法仅仅工作于导出函数(E9跳转)间接调用,如果用户使用直接调用(E8 call)此方法直接失效。
3 .此方法使用WriteProcessMemory前没有读取内存保护值(protect flag),事后未恢复,中间没有flushinstrcutionmemory,存在执行缺陷和时序bug。
4. 局限于x86构架。

hook 的方法不外乎两类 : 导出函数hook (E9 jmp)和用户函数hook (E8 call),导出函数也可以直接call的(从而避开了楼主的方法)。
楼主使用的是E9 jmp HOOK方法,建议使用E8 call HOOK, E8 call HOOK任何情况下都不会失效,反HOOK者避无可避,除非反HOOK者直接核对该函数的二进制指令来反HOOK。


2019-11-27 10:33
0
游客
登录 | 注册 方可回帖
返回
//