首页
社区
课程
招聘
[求助]hook PsLookupProcessByProcessId 蓝屏
发表于: 2011-2-17 16:43 9596

[求助]hook PsLookupProcessByProcessId 蓝屏

2011-2-17 16:43
9596
前几天 HOOK  PsLookupProcessByProcessId ,inline hook IAT hook不蓝屏 调用正常,但是EAT hook 蓝屏,没办法想到别的方法 HOOK MmGetSystemRoutineAddress,发现调用PsLookupProcessByProcessId ,让其返回PsLookupProcessByProcessId 地址,但是还是蓝屏,调试输出查看下没有问题上代码大家帮忙看看
NTSTATUS NewPsLookupProcessByProcessId(
                                                     HANDLE ProcessId,
                                                     PEPROCESS *Process
                                                                 )
{
        __asm
        {  
                _emit 0x90
                _emit 0x90
                _emit 0x90
                _emit 0x90
                _emit 0x90  // 前5字节实现原函数的头5字节功能
                _emit 0x90  // 这个填充jmp
                _emit 0x90
                _emit 0x90
                _emit 0x90
                _emit 0x90  // 这4字节保存原函数+5处的地址
                _emit 0x90  
                _emit 0x90  // 因为是长转移,所以必须是 0x0080
        }
}
NTSTATUS MyPsLookupProcessByProcessId(
                                                                           HANDLE ProcessId,
                                                                           PEPROCESS *Process
                                                                           )
{
        return NewPsLookupProcessByProcessId(ProcessId,Process);
}

PVOID MyNewMmGetSystemRoutineAddress (
                                                   __in PUNICODE_STRING SystemRoutineName
                                                   )
{

        PVOID MmReturn = NULL;
        __asm
        {
                push SystemRoutineName
                Call [NewMmGetSystemRoutineAddress]
                mov  MmReturn,eax
        }
       
        if((DWORD)MmReturn == oldPsLookupProcessByProcessId)
        {
            (DWORD)MmReturn = (DWORD)MyPsLookupProcessByProcessId;
                DbgPrint("函数名称:%wZ 函数地址:0x%08X\n",SystemRoutineName,MmReturn);
                return oldPsLookupProcessByProcessId;//返回MyPsLookupProcessByProcessId就蓝屏,返回oldPsLookupProcessByProcessId 正常
        }//*/

       
        return MmReturn;
}
DebugView:
00000198        71.40333557        NewPsLookupProcessByProcessId:0xf440e260       
00000199        71.40335083        MyPsLookupProcessByProcessId:0xf440e280       
00000200        71.40379333        ###############################################       
00000201        71.40381622        #                   创建设备                  #       
00000202        71.40383911        ###############################################       
00000203        71.40979004        函数名称:PsLookupProcessByProcessId 函数地址:0xF440E280          这里是HOOK MmGetSystemRoutineAddress的输出
00000204        283.88659668        watchdog!WdUpdateRecoveryState: Recovery enabled.
WinDbg:
lkd> u f440e280
f440e280 8bff            mov     edi,edi
f440e282 55              push    ebp
f440e283 8bec            mov     ebp,esp
f440e285 83ec0c          sub     esp,0Ch
f440e288 c745f800000000  mov     dword ptr [ebp-8],0
f440e28f c745fc00000000  mov     dword ptr [ebp-4],0
f440e296 c745f49c030000  mov     dword ptr [ebp-0Ch],39Ch
f440e29d 8d45fc          lea     eax,[ebp-4]
lkd> u f440e260
f440e260 8bff            mov     edi,edi
f440e262 55              push    ebp
f440e263 8bec            mov     ebp,esp
f440e265 e9e946168c      jmp     nt!PsLookupProcessByProcessId+0x5 (80572953)
f440e26a 90              nop
f440e26b 90              nop
f440e26c 90              nop
f440e26d 90              nop
按照打印的输出结果和windbg里的内容 都是正确的。。。。。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
2
NewPsLookupProcessByProcessId是做什么的,没说清楚……
MyPsLookupProcessByProcessId的内容没有给全……
总之……不明真相……
2011-2-17 18:20
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
刚填写上去了,就这个样子 其实看汇编代码就知道个差不多了,
2011-2-17 18:39
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
4
MyPsLookupProcessByProcessId贴出来的代码和反汇编结果不服啊,而且反汇编代码不完整……

lkd> u f440e280
用uf命令或者加上L参数
ps:刚注意到,你这是本机调试?!!
2011-2-17 18:49
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
5
代码让我改了,但是结果都是一样的。现在奇怪是 我把PsLookupProcessByProcessId 整个函数复制一份到一个新函数,然后在MyNewMmGetSystemRoutineAddress  直接返回新函数地址 结果正常。
但是 我直接赋值给0xf440e260 地址,他就蓝屏,按照汇编的情况,不应该蓝屏,不解。。。。
2011-2-17 19:10
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
函数地址:0xF440E280
2011-2-17 20:39
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
你到底是280还是260  我没搞明白
2011-2-17 20:39
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
8
说了半天都没说到重点上,直接返回0xf440e260是不会有问题的,关键是MyPsLookupProcessByProcessId的实现里面有问题,而你有不把MyPsLookupProcessByProcessId全部的反汇编代码贴出来,这样纯粹是浪费时间……

ps:最好导入符号表,直接用地址描述起来很乱……
2011-2-17 20:53
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
9
lkd> uf f43a5280   对应 0xf440e280
f43a5280 8bff            mov     edi,edi
f43a5282 55              push    ebp
f43a5283 8bec            mov     ebp,esp
f43a5285 8b450c          mov     eax,dword ptr [ebp+0Ch]
f43a5288 50              push    eax
f43a5289 8b4d08          mov     ecx,dword ptr [ebp+8]
f43a528c 51              push    ecx
f43a528d e8ceffffff      call    f43a5260
f43a5292 5d              pop     ebp
f43a5293 c20800          ret     8

lkd> u f43a5260   对应0xf440e260  
f43a5260 8bff            mov     edi,edi
f43a5262 55              push    ebp
f43a5263 8bec            mov     ebp,esp
f43a5265 e9e9d61c8c      jmp     nt!PsLookupProcessByProcessId+0x5 (80572953)
f43a526a 90              nop
f43a526b 90              nop
f43a526c cc              int     3
f43a526d cc              int     3
代码改了我也懒得改回来了,我就是返回的0xf440e260  地址 他就是有问题。这个是刚刚弄的
inline 没有问题
2011-2-17 23:19
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
10
有码有真相啊.
2011-2-20 14:55
0
游客
登录 | 注册 方可回帖
返回
//