__declspec(naked) test()
{

  _asm
  {
    ret
    jmp oldaddr
  }
}

DWORD * KernelCallbackTable = NULL;
_asm
{
     push eax
     mov eax,dword ptr fs:[0x18]
     mov eax,dword ptr ds:[eax+0x30]
     mov eax,dword ptr ds:[eax+0x2C]
     mov KernelCallbackTable, eax
     pop eax
}
DWORD old = 0;
if(VirtualProtect(&KernelCallbackTable[40], sizeof(PVOID),PAGE_EXECUTE_READWRITE, &old))
{
  oldaddr = KernelCallbackTable[40];
  KernelCallbackTable[40] = (DWORD)test;
}

前几天研究windows的消息机制时偶尔发现。
通过修改KernelCallbackTable内供ring3回调用ring0的函数分派表实现