PEB 0x2C 中的 KernelCallbackTable 非常有意思,WIN是基于消息驱动的从某种迹象上来看确实是这样如CRSS的LPC通信,IRP I/O 与 设备的通信。
kernel32!OpenProcess -> ntdll!ZwOpenProcess -> ntdll!KiFastSystemCall -> sysenter -> nt!KiFastCallEntry -> nt!NtOpenProcess -> nt!KiFastCallEntry(返回后)-> nt!KiServiceExit -> sysexit -> ntdll!KiFastSystemCallRet -> kernel32!OpenProcess
这是一个普通的系统调用过程 ring3->ring0->ring3
而有些时候情况并不是这样,系统有时需要一个回调,程序使用Int 2B KiCallbackReturn 把一条消息抛给系统(如WM_CHAR、WM_PAINT),系统并不会在内核中直接处理而是给了用户hook的机会,KiCallbackReturn -> nt!KeUserModeCallback -> nt!KiCallUserMode -> nt!KiServiceExit -> ntdll!KiUserCallbackDispatcher -> 回调函数 -> int2B 循环
可以看到KiServiceExit后回到Ntdll Ring3层 调用 KiUserCallbackDispatcher 此函数是可以断下来的分析之。- 77546FC0 > 64:8B0D 0000000>MOV ECX,DWORD PTR FS:[0]
- 77546FC7 BA A06F5477 MOV EDX,ntdll.KiUserCallbackExceptionHandler
- 77546FCC 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
- 77546FD0 894C24 10 MOV DWORD PTR SS:[ESP+10],ECX
- 77546FD4 895424 14 MOV DWORD PTR SS:[ESP+14],EDX ; ntdll.KiUserCallbackDispatcher
- 77546FD8 64:A3 00000000 MOV DWORD PTR FS:[0],EAX
- 77546FDE 83C4 04 ADD ESP,4
- 77546FE1 5A POP EDX ; ntdll.KiUserCallbackDispatcher
- 77546FE2 64:A1 30000000 MOV EAX,DWORD PTR FS:[30]
- 77546FE8 8B40 2C MOV EAX,DWORD PTR DS:[EAX+2C]
- 77546FEB FF1490 CALL DWORD PTR DS:[EAX+EDX*4]
- 77546FEE 50 PUSH EAX
- 77546FEF 6A 00 PUSH 0
- 77546FF1 6A 00 PUSH 0
- 77546FF3 E8 70E4FFFF CALL ntdll.ZwCallbackReturn
- 77546FF8 8BF0 MOV ESI,EAX
- 77546FFA 56 PUSH ESI
- 77546FFB E8 05010000 CALL ntdll.RtlRaiseStatus
- 77547000 ^ EB F8 JMP SHORT ntdll.77546FFA
复制代码- 77546FE2 64:A1 30000000 MOV EAX,DWORD PTR FS:[30]
- 77546FE8 8B40 2C MOV EAX,DWORD PTR DS:[EAX+2C]
复制代码 很果断的取 KernelCallbackTable 的地址
KernelCallbackTable 存在User32中 贴一段- 76F6D568 >76F564EB user32.__fnCOPYDATA
- 76F6D56C 76F9F0BC user32.__fnCOPYGLOBALDATA
- 76F6D570 76F64F59 user32.__fnDWORD
- 76F6D574 76F5B2A1 user32.__fnNCDESTROY
- 76F6D578 76F801A6 user32.__fnDWORDOPTINLPMSG
- 76F6D57C 76F9F196 user32.__fnINOUTDRAG
- 76F6D580 76F86BFD user32.__fnGETTEXTLENGTHS
- 76F6D584 76F9F3EA user32.__fnINCNTOUTSTRING
- 76F6D588 76F5AC7A user32.__fnPOUTLPINT
- 76F6D58C 76F9F2F5 user32.__fnINLPCOMPAREITEMSTRUCT
- 76F6D590 76F5E921 user32.__fnINLPCREATESTRUCT
- 76F6D594 76F6F057 user32.__fnINLPDELETEITEMSTRUCT
- 76F6D598 76F8629A user32.__fnINLPDRAWITEMSTRUCT
- 76F6D59C 76F9F333 user32.__fnINLPHLPSTRUCT
- 76F6D5A0 76F9F333 user32.__fnINLPHLPSTRUCT
- 76F6D5A4 76F9F1D6 user32.__fnINLPMDICREATESTRUCT
- .........
- .........
复制代码 |