devil209
驱动牛犊
驱动牛犊
  • 注册日期2007-01-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分732分
  • 威望94点
  • 贡献值0点
  • 好评度73点
  • 原创分0分
  • 专家分0分
阅读:1390回复:5

为什么以下hook代码在有些机器上会荡机?

楼主#
更多 发布于:2007-09-03 17:06
为什么以下hook代码在有些机器上会荡机?
__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
//宏定义
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
        HookSystemCall();
}

VOID HookSystemCall()
{
    OldZwOpenProcess = (ZW_OPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess));
    _asm cli
        (ZW_OPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess;
    _asm sti
}

而我改将hook代码修改成一下以后在荡机的机器上运行就好了?
PMDL  g_pmdlSystemCall;
PVOID *MappedSystemCallTable;
BOOLEAN MDLinit = FALSE;
#define HOOK_SYSCALL(_Function, _Hook, _Orig )  \
       _Orig = (PVOID) InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
  initMDL();
        HookSystemCall();
}
NTSTATUS initMDL()
{  
   // map memory into our domain
   g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase,
                               KeServiceDescriptorTable.NumberOfServices*4);
   if(!g_pmdlSystemCall)
      return STATUS_UNSUCCESSFUL;

   MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

   // change MDL permissions
   g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
   MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);
  
   MDLinit = TRUE;

   return STATUS_SUCCESS;
}
VOID HookSystemCall()
{
    OldZwOpenProcess = (ZW_OPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess));
    _asm cli
    HOOK_SYSCALL( ZwOpenProcess,
                NewZwOpenProcess,
                OldZwOpenProcess );
    _asm sti
}
devil209
驱动牛犊
驱动牛犊
  • 注册日期2007-01-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分732分
  • 威望94点
  • 贡献值0点
  • 好评度73点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-03 17:08
在有些机器上一运行到  
        (ZW_OPENPROCESS)(SYSTEMSERVICE(ZwOpenProcess)) = NewZwOpenProcess;
就荡掉了,只是个别机器而已.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-09-03 19:30
MS为了更好的实现核心保护,把SSDT放到了代码段,不过32位下可以通过CR0,或MDL来进行处理,不过随着64BIT系统的临近,及最新CPU技术的发展,以后的PTAHCGUARD保护将移至虚拟技术的VMM中,由于强大的RING  -1层保护,对于所有的hook来说将会是一场噩梦。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-09-03 19:54
那就自己去找MS的系统漏洞吧
devil209
驱动牛犊
驱动牛犊
  • 注册日期2007-01-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分732分
  • 威望94点
  • 贡献值0点
  • 好评度73点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-04 09:27
谢谢wowocock ,再问一下通过cr0的hook在本机上荡机,而通过mdl却没有问题是什么原因呢?本机cpu是amd 64bit 双核cpu,我记的前段时间我在32bit的机器上运行修改cr0的hook也出现过现在这种情况.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-09-04 17:19
一般修改CR0不会蓝,至少我从来没碰到过,无论是PD还是酷睿,都没问题。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部