找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6006|回复: 2

关于x64 hook ShadowSSDT NtUserBuildHwndList问题求大神帮望解决下

[复制链接]

1

主题

146

回帖

0

精华

贵宾会员

积分
2836
发表于 2014-7-7 18:50:22 | 显示全部楼层 |阅读模式
{:soso_e136:}
//这些代码到是抄TA大神的
其他3个函数HOOK没问题就是NtUserBuildHwndList有点问题
代码代码

//替换函数
NTSTATUS   NtUserBuildHwndListHook(
                                                                                 HDESK hdesk,
                                                                                 HWND hwndNext,
                                                                                 ULONG fEnumChildren,
                                                                                 DWORD idThread,
                                                                                 UINT cHwndMax,
                                                                                 HWND *phwndFirst,
                                                                                 ULONG *pcHwndNeeded)
{
         NTSTATUS   status;

         
         DbgPrint("NTUSERBUILDHWNDLISTHook: %llx %llx %llx %llx %llx %llx %llx %llx\n",hdesk,hwndNext,fEnumChildren,idThread,cHwndMax,phwndFirst,pcHwndNeeded,g_NtUserBuildHwndList);
        status = g_NtUserBuildHwndList(hdesk,
                         hwndNext,
                         fEnumChildren,
                         idThread,
                         cHwndMax,
                         phwndFirst,
                         pcHwndNeeded); //调用真正的NtUserBuildHwndList这里出了问题//返回值错误是0xc0000008或者0xc0000023
         DbgPrint("NTUSERBUILDHWNDLISTHook: %llx %llx\n",status,hdesk);
       


         return status;
}

VOID ModifySSSDT(ULONG64 Index, ULONG64 Address)
{
       
        ULONGLONG                                W32pServiceTable=0, qwTemp=0;
        LONG                                         dwTemp=0;
        PSYSTEM_SERVICE_TABLE        pWin32k;
        KIRQL                                        irql;
        DbgPrint("ModifySSSDTAddress: %llx %llx",Address,Index);
        pWin32k = (PSYSTEM_SERVICE_TABLE)((ULONG64)KeServiceDescriptorTableShadow + sizeof(SYSTEM_SERVICE_TABLE));        //4*8
        W32pServiceTable=(ULONGLONG)(pWin32k->ServiceTableBase);
        qwTemp = W32pServiceTable + 4 * (Index);
        dwTemp = (LONG)(Address - W32pServiceTable);
        DbgPrint("ModifySSSDTAddress: %llx %llx",dwTemp,Address - W32pServiceTable);
        dwTemp = dwTemp << 4;        //DbgPrint("*(PLONG)qwTemp: %x, dwTemp: %x",*(PLONG)qwTemp,dwTemp);
        DbgPrint("ModifySSSDTAddress: %llx %llx",dwTemp,qwTemp);
        irql=WPOFFx64();
        *(PLONG)qwTemp = dwTemp;
        WPONx64(irql);
}

VOID HOOK_SSdtFun(ULONG64 X_hookAddress,ULONG64 Index,ULONGLONG MyFun)
{

        KIRQL irql;
       
        ULONG64 myfun;
        UCHAR jmp_code[]="\xFF\x25\x00\x00\x00\x00\x90\x90\x90\x90\x90\x90\x90\x90";        //需要14字节+4字节(jmp [我的函数])
        //代理函数地址
        myfun=MyFun;//取函数地址
        DbgPrint("HOOK_SSSDTmyfun: %llx",myfun);
        //填充shellcode
        memcpy(jmp_code+6,&myfun,8);
        irql=WPOFFx64();
        memcpy((PVOID)(X_hookAddress),jmp_code,14);
        DbgPrint("HOOK_SSSDTmyfun: %s %llx",jmp_code,X_hookAddress);
        WPONx64(irql);
       
        ModifySSSDT(Index, X_hookAddress);
        DbgPrint("HOOK_SSSDT OK!");
}

856

主题

2630

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36108
发表于 2014-7-8 00:15:29 | 显示全部楼层
坑爹的>>4问题,自己研究下{:soso_e113:}

0

主题

27

回帖

0

精华

铜牌会员

积分
45
发表于 2020-5-12 09:15:11 | 显示全部楼层
我也遇见这个问题了,请问这问题具体错在哪呢……
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表