首页
社区
课程
招聘
[原创]某6789安全卫士核心功能之InfinityHook (抄,我疯狂的抄)
发表于: 2020-3-26 13:15 27287

[原创]某6789安全卫士核心功能之InfinityHook (抄,我疯狂的抄)

2020-3-26 13:15
27287
InfinityHook 核心原理 替换WmipLoggerContext[CLCK_INDEX]->GetCpuClock

原作者见 https://github.com/everdox/InfinityHook

from 6789base.sys version 5.12.0.4874

为节约版面以下只放关键内容

DriverEntry->InitializeInfinityHook()

启动两条线程,一条初始化infhook,一条保护infhook

__int64 InitializeInfinityHook()
{
  HANDLE ThreadHandle; // [rsp+40h] [rbp-58h]
  HANDLE Handle; // [rsp+48h] [rbp-50h]
  OBJECT_ATTRIBUTES ObjectAttributes; // [rsp+50h] [rbp-48h]
  unsigned int v4; // [rsp+80h] [rbp-18h]

  v4 = -1073741823;
  ThreadHandle = 0i64;
  ObjectAttributes.Length = 0;
  memset(&ObjectAttributes.RootDirectory, 0, 0x28ui64);
  if ( byte_3648C )
    return 3221225473i64;
  stru_365D0.Count = 1;
  stru_365D0.Owner = 0i64;
  stru_365D0.Contention = 0;
  KeInitializeEvent(&stru_365D0.Event, SynchronizationEvent, 0);
  sub_22980(&unk_36608);
  KeInitializeEvent(&Event, NotificationEvent, 0);
  byte_36938 = 1;
  stru_36568.Count = 1;
  stru_36568.Owner = 0i64;
  stru_36568.Contention = 0;
  KeInitializeEvent(&stru_36568.Event, SynchronizationEvent, 0);
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 512;
  ObjectAttributes.ObjectName = 0i64;
  ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.SecurityQualityOfService = 0i64;
  v4 = PsCreateSystemThread(
         &ThreadHandle,
         0x1FFFFFu,
         &ObjectAttributes,
         0i64,
         0i64,
         (PKSTART_ROUTINE)InfinityHookInitThread,
         0i64);
  if ( !v4 )
    ZwClose(ThreadHandle);
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 512;
  ObjectAttributes.ObjectName = 0i64;
  ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.SecurityQualityOfService = 0i64;
  v4 = PsCreateSystemThread(
         &Handle,
         0x1FFFFFu,
         &ObjectAttributes,
         0i64,
         0i64,
         (PKSTART_ROUTINE)InitializeInfinityHookProtectThread,
         0i64);
  if ( !v4 )
  {
    ObReferenceObjectByHandle(Handle, 0x1FFFFFu, PsThreadType, 0, &g_ThreadObject, 0i64);
    ZwClose(Handle);
  }
  return v4;
}

__int64 InitializeInfinityHook()
{
  HANDLE ThreadHandle; // [rsp+40h] [rbp-58h]
  HANDLE Handle; // [rsp+48h] [rbp-50h]
  OBJECT_ATTRIBUTES ObjectAttributes; // [rsp+50h] [rbp-48h]
  unsigned int v4; // [rsp+80h] [rbp-18h]

  v4 = -1073741823;
  ThreadHandle = 0i64;
  ObjectAttributes.Length = 0;
  memset(&ObjectAttributes.RootDirectory, 0, 0x28ui64);
  if ( byte_3648C )
    return 3221225473i64;
  stru_365D0.Count = 1;
  stru_365D0.Owner = 0i64;
  stru_365D0.Contention = 0;
  KeInitializeEvent(&stru_365D0.Event, SynchronizationEvent, 0);
  sub_22980(&unk_36608);
  KeInitializeEvent(&Event, NotificationEvent, 0);
  byte_36938 = 1;
  stru_36568.Count = 1;
  stru_36568.Owner = 0i64;
  stru_36568.Contention = 0;
  KeInitializeEvent(&stru_36568.Event, SynchronizationEvent, 0);
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 512;
  ObjectAttributes.ObjectName = 0i64;
  ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.SecurityQualityOfService = 0i64;
  v4 = PsCreateSystemThread(
         &ThreadHandle,
         0x1FFFFFu,
         &ObjectAttributes,
         0i64,
         0i64,
         (PKSTART_ROUTINE)InfinityHookInitThread,
         0i64);
  if ( !v4 )
    ZwClose(ThreadHandle);
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 512;
  ObjectAttributes.ObjectName = 0i64;
  ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.SecurityQualityOfService = 0i64;
  v4 = PsCreateSystemThread(
         &Handle,
         0x1FFFFFu,
         &ObjectAttributes,
         0i64,
         0i64,
         (PKSTART_ROUTINE)InitializeInfinityHookProtectThread,
         0i64);
  if ( !v4 )
  {
    ObReferenceObjectByHandle(Handle, 0x1FFFFFu, PsThreadType, 0, &g_ThreadObject, 0i64);
    ZwClose(Handle);
  }
  return v4;
}

__int64 InitializeInfinityHook()
{
  HANDLE ThreadHandle; // [rsp+40h] [rbp-58h]
  HANDLE Handle; // [rsp+48h] [rbp-50h]
  OBJECT_ATTRIBUTES ObjectAttributes; // [rsp+50h] [rbp-48h]
  unsigned int v4; // [rsp+80h] [rbp-18h]

  v4 = -1073741823;
  ThreadHandle = 0i64;
  ObjectAttributes.Length = 0;
  memset(&ObjectAttributes.RootDirectory, 0, 0x28ui64);
  if ( byte_3648C )
    return 3221225473i64;
  stru_365D0.Count = 1;
  stru_365D0.Owner = 0i64;
  stru_365D0.Contention = 0;
  KeInitializeEvent(&stru_365D0.Event, SynchronizationEvent, 0);
  sub_22980(&unk_36608);
  KeInitializeEvent(&Event, NotificationEvent, 0);
  byte_36938 = 1;
  stru_36568.Count = 1;
  stru_36568.Owner = 0i64;
  stru_36568.Contention = 0;
  KeInitializeEvent(&stru_36568.Event, SynchronizationEvent, 0);
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 512;
  ObjectAttributes.ObjectName = 0i64;
  ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.SecurityQualityOfService = 0i64;
  v4 = PsCreateSystemThread(
         &ThreadHandle,
         0x1FFFFFu,
         &ObjectAttributes,
         0i64,
         0i64,
         (PKSTART_ROUTINE)InfinityHookInitThread,
         0i64);
  if ( !v4 )
    ZwClose(ThreadHandle);
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 512;
  ObjectAttributes.ObjectName = 0i64;
  ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.SecurityQualityOfService = 0i64;
  v4 = PsCreateSystemThread(
         &Handle,
         0x1FFFFFu,
         &ObjectAttributes,
         0i64,
         0i64,
         (PKSTART_ROUTINE)InitializeInfinityHookProtectThread,
         0i64);
  if ( !v4 )
  {
    ObReferenceObjectByHandle(Handle, 0x1FFFFFu, PsThreadType, 0, &g_ThreadObject, 0i64);
    ZwClose(Handle);
  }
  return v4;
}



void __fastcall InfinityHookInitThread(PVOID StartContext)
{
  __int64 _RAX; // rax
  LARGE_INTEGER (*_RCX)(); // rcx
  __int64 _RCX; // rcx
  LARGE_INTEGER Interval; // [rsp+20h] [rbp-28h]
  _QWORD *getCpuClock; // [rsp+28h] [rbp-20h]
  int v6; // [rsp+30h] [rbp-18h]

  v6 = -1073741823;
  getCpuClock = 0i64;
  Interval.QuadPart = -30000000i64;
  while ( !LoadNtdll() )
    KeDelayExecutionThread(0, 0, &Interval);
  if ( (int)InitializeInfhookCore() >= 0 )
  {
    v6 = EnableEtwLogger();
    if ( v6 >= 0 )
    {
      v6 = GetCkcl(2u, (_QWORD *)infhookCore + 90115);
      if ( v6 >= 0 && *((_QWORD *)infhookCore + 90115) )
      {
        getCpuClock = (_QWORD *)(*((_QWORD *)infhookCore + 90115)
                               + (unsigned int)OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK);
        if ( (unsigned __int8)MmIsAddressValid(getCpuClock)
          && (unsigned __int8)MmIsAddressValid((char *)getCpuClock + 7) )
        {
          if ( *getCpuClock >= MmSystemRangeStart )
          {
            _RAX = *((_QWORD *)infhookCore + 90115) + (unsigned int)OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK;
            _RCX = InternalGetCpuClock;
            __asm { xchg    rcx, [rax] }
            *((_QWORD *)infhookCore + 90114) = _RCX;
            v6 = 0;
          }
          else
          {
            v6 = 0xC0000001;
          }
        }
        else
        {
          v6 = 0xC0000001;
        }
      }
      else
      {
        v6 = 0xC0000001;
      }
    }
    else
    {
      v6 = 0xC0000001;
    }
  }
  else
  {
    v6 = 0xC0000001;
  }
  PsTerminateSystemThread(0);
}

void __fastcall InfinityHookInitThread(PVOID StartContext)
{
  __int64 _RAX; // rax
  LARGE_INTEGER (*_RCX)(); // rcx
  __int64 _RCX; // rcx
  LARGE_INTEGER Interval; // [rsp+20h] [rbp-28h]
  _QWORD *getCpuClock; // [rsp+28h] [rbp-20h]
  int v6; // [rsp+30h] [rbp-18h]

  v6 = -1073741823;
  getCpuClock = 0i64;
  Interval.QuadPart = -30000000i64;
  while ( !LoadNtdll() )
    KeDelayExecutionThread(0, 0, &Interval);
  if ( (int)InitializeInfhookCore() >= 0 )
  {
    v6 = EnableEtwLogger();
    if ( v6 >= 0 )
    {
      v6 = GetCkcl(2u, (_QWORD *)infhookCore + 90115);
      if ( v6 >= 0 && *((_QWORD *)infhookCore + 90115) )
      {
        getCpuClock = (_QWORD *)(*((_QWORD *)infhookCore + 90115)
                               + (unsigned int)OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK);
        if ( (unsigned __int8)MmIsAddressValid(getCpuClock)
          && (unsigned __int8)MmIsAddressValid((char *)getCpuClock + 7) )
        {
          if ( *getCpuClock >= MmSystemRangeStart )
          {
            _RAX = *((_QWORD *)infhookCore + 90115) + (unsigned int)OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK;
            _RCX = InternalGetCpuClock;
            __asm { xchg    rcx, [rax] }
            *((_QWORD *)infhookCore + 90114) = _RCX;
            v6 = 0;
          }
          else
          {
            v6 = 0xC0000001;
          }
        }
        else
        {
          v6 = 0xC0000001;
        }
      }
      else
      {
        v6 = 0xC0000001;
      }
    }
    else
    {
      v6 = 0xC0000001;
    }
  }
  else
  {
    v6 = 0xC0000001;
  }
  PsTerminateSystemThread(0);
}

NTSTATUS __stdcall EnableEtwLogger()
{
  NTSTATUS result; // eax
  NTSTATUS v1; // [rsp+20h] [rbp-18h]
  NTSTATUS v2; // [rsp+20h] [rbp-18h]

  v1 = IfhpModifyTraceSettings(1);
  if ( v1 >= 0 )
    goto LABEL_9;
  v2 = IfhpModifyTraceSettings(0);
  if ( v2 < 0 )
    return v2;
  v1 = IfhpModifyTraceSettings(1);
  if ( v1 >= 0 )
LABEL_9:
    result = v1;
  else
    result = v1;
  return result;
}

NTSTATUS __stdcall EnableEtwLogger()
{
  NTSTATUS result; // eax
  NTSTATUS v1; // [rsp+20h] [rbp-18h]
  NTSTATUS v2; // [rsp+20h] [rbp-18h]

  v1 = IfhpModifyTraceSettings(1);
  if ( v1 >= 0 )
    goto LABEL_9;
  v2 = IfhpModifyTraceSettings(0);
  if ( v2 < 0 )
    return v2;
  v1 = IfhpModifyTraceSettings(1);
  if ( v1 >= 0 )
LABEL_9:
    result = v1;
  else
    result = v1;
  return result;
}

IfhModifyTraceSettings复制粘贴过于直球这里就不贴代码了,放个对比图:





主要流程:初始化infhookCore结构(应该是一个很大的结构体,具体成员就不逆了)

sub_2D210判断两个不明物体(无关紧要懒得逆)

寻找explorer.exe的PID

加载L"\\SystemRoot\\system32\\ntdll.dll"并搜索导出表,把nt函数全部保存进infhookcore里的一个表

NTSTATUS __stdcall InitializeInfhookCore()
{
  LARGE_INTEGER Interval; // [rsp+20h] [rbp-28h]
  NTSTATUS v2; // [rsp+28h] [rbp-20h]
  UNICODE_STRING DestinationString; // [rsp+30h] [rbp-18h]

  v2 = -1073741823;
  Interval.QuadPart = -30000000i64;
  if ( infhookCore && isZwTraceControlAvailable )
    return 0;
  while ( 1 )
  {
    if ( !infhookCore )
    {
      infhookCore = ExAllocatePoolWithTag(NonPagedPool, 720928ui64, 'hchk');
      if ( !infhookCore )
      {
        v2 = -1073741670;
        goto LABEL_26;
      }
      memset(infhookCore, 0, 0xB0020ui64);
    }
    if ( !*((_QWORD *)infhookCore + 90112) || !*((_QWORD *)infhookCore + 90113) )
    {
      v2 = sub_2D210((char *)infhookCore + 720896, (char *)infhookCore + 720904);
      if ( v2 < 0 || !*((_QWORD *)infhookCore + 90112) || !*((_QWORD *)infhookCore + 90113) )
      {
        v2 = -1073741823;
        goto LABEL_26;
      }
    }
    RtlInitUnicodeString(&DestinationString, L"explorer.exe");
    v2 = FindProcessByProcessName(&DestinationString, &g_ExplorerPID);
    if ( v2 >= 0 )
    {
      if ( g_ExplorerPID )
        break;
    }
    KeDelayExecutionThread(0, 0, &Interval);
  }
  v2 = LoadSSDTFunctionEntry();
  if ( v2 >= 0 )
  {
    v2 = LoadOffsetsVars();
    if ( v2 >= 0 )
    {
      v2 = LoadSSSDTFunctionEntry();
      if ( v2 >= 0 )
      {
        byte_3648D = 1;
        sub_2A640();
        ZwTraceControl = (__int64 (__fastcall *)(_QWORD, _QWORD, _QWORD, _QWORD, _DWORD, _QWORD))MakeZwTraceControl();
        if ( ZwTraceControl )
        {
          isZwTraceControlAvailable = 1;
          v2 = 0;
        }
        else
        {
          v2 = -1073741823;
        }
      }
      else
      {
        v2 = -1073741823;
      }
    }
    else
    {
      v2 = -1073741823;
    }
  }
  else
  {
    v2 = -1073741823;
  }
LABEL_26:
  if ( v2 )
  {
    if ( infhookCore )
    {
      ExFreePoolWithTag(infhookCore, 0x6863686Bu);
      infhookCore = 0i64;
    }
  }
  return v2;
}

NTSTATUS __stdcall InitializeInfhookCore()
{
  LARGE_INTEGER Interval; // [rsp+20h] [rbp-28h]
  NTSTATUS v2; // [rsp+28h] [rbp-20h]
  UNICODE_STRING DestinationString; // [rsp+30h] [rbp-18h]

  v2 = -1073741823;
  Interval.QuadPart = -30000000i64;
  if ( infhookCore && isZwTraceControlAvailable )
    return 0;
  while ( 1 )
  {
    if ( !infhookCore )
    {
      infhookCore = ExAllocatePoolWithTag(NonPagedPool, 720928ui64, 'hchk');
      if ( !infhookCore )
      {
        v2 = -1073741670;
        goto LABEL_26;
      }
      memset(infhookCore, 0, 0xB0020ui64);
    }
    if ( !*((_QWORD *)infhookCore + 90112) || !*((_QWORD *)infhookCore + 90113) )
    {
      v2 = sub_2D210((char *)infhookCore + 720896, (char *)infhookCore + 720904);
      if ( v2 < 0 || !*((_QWORD *)infhookCore + 90112) || !*((_QWORD *)infhookCore + 90113) )
      {
        v2 = -1073741823;
        goto LABEL_26;
      }
    }
    RtlInitUnicodeString(&DestinationString, L"explorer.exe");
    v2 = FindProcessByProcessName(&DestinationString, &g_ExplorerPID);
    if ( v2 >= 0 )
    {
      if ( g_ExplorerPID )
        break;
    }
    KeDelayExecutionThread(0, 0, &Interval);
  }
  v2 = LoadSSDTFunctionEntry();
  if ( v2 >= 0 )
  {
    v2 = LoadOffsetsVars();
    if ( v2 >= 0 )
    {
      v2 = LoadSSSDTFunctionEntry();
      if ( v2 >= 0 )
      {
        byte_3648D = 1;
        sub_2A640();
        ZwTraceControl = (__int64 (__fastcall *)(_QWORD, _QWORD, _QWORD, _QWORD, _DWORD, _QWORD))MakeZwTraceControl();
        if ( ZwTraceControl )
        {
          isZwTraceControlAvailable = 1;
          v2 = 0;
        }
        else
        {
          v2 = -1073741823;
        }
      }
      else
      {
        v2 = -1073741823;
      }
    }
    else
    {
      v2 = -1073741823;
    }
  }
  else
  {
    v2 = -1073741823;
  }
LABEL_26:
  if ( v2 )
  {
    if ( infhookCore )
    {
      ExFreePoolWithTag(infhookCore, 0x6863686Bu);
      infhookCore = 0i64;
    }
  }
  return v2;
}

根据系统版本加载一些偏移

NTSTATUS __stdcall LoadOffsetsVars()
{
  NTSTATUS v1; // [rsp+20h] [rbp-18h]
  unsigned int v2; // [rsp+24h] [rbp-14h]

  v1 = 0;
  v2 = GetBuildNumber();
  if ( v2 > 14393 )
  {
    if ( v2 != 15063 && v2 != 16299 && v2 != 17134 && v2 != 17763 && v2 != 18362 )
      goto LABEL_18;
LABEL_17:
    LODWORD(OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 40;
    offset_SystemCallNumber = 0x80i64;
    PerfGlobalGroupMask = GetPerfGlobalGroupMask();
    goto LABEL_18;
  }
  switch ( v2 )
  {
    case 14393u:
      goto LABEL_17;
    case 610u:
      LODWORD(OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 24;
      offset_SystemCallNumber = 0x1F8i64;
      PerfGlobalGroupMask = GetPerfGlobalGroupMask2();
      break;
    case 620u:
      LODWORD(OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 40;
      offset_SystemCallNumber = 0x80i64;
      PerfGlobalGroupMask = GetPerfGlobalGroupMask3();
      break;
    case 630u:
    case 10240u:
    case 10586u:
      goto LABEL_17;
  }
LABEL_18:
  if ( v2 > 18362 )
    v1 = FindOffsetsFor18383();
  return v1;
}

NTSTATUS __stdcall LoadOffsetsVars()
{
  NTSTATUS v1; // [rsp+20h] [rbp-18h]
  unsigned int v2; // [rsp+24h] [rbp-14h]

  v1 = 0;
  v2 = GetBuildNumber();
  if ( v2 > 14393 )
  {
    if ( v2 != 15063 && v2 != 16299 && v2 != 17134 && v2 != 17763 && v2 != 18362 )
      goto LABEL_18;
LABEL_17:
    LODWORD(OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 40;
    offset_SystemCallNumber = 0x80i64;
    PerfGlobalGroupMask = GetPerfGlobalGroupMask();
    goto LABEL_18;
  }
  switch ( v2 )
  {
    case 14393u:
      goto LABEL_17;
    case 610u:
      LODWORD(OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 24;
      offset_SystemCallNumber = 0x1F8i64;
      PerfGlobalGroupMask = GetPerfGlobalGroupMask2();
      break;
    case 620u:
      LODWORD(OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK) = 40;
      offset_SystemCallNumber = 0x80i64;
      PerfGlobalGroupMask = GetPerfGlobalGroupMask3();
      break;
    case 630u:
    case 10240u:
    case 10586u:
      goto LABEL_17;
  }
LABEL_18:
  if ( v2 > 18362 )
    v1 = FindOffsetsFor18383();
  return v1;
}

注意这里还会在KeReleaseSpinLock里面搜索PerfGlobalGroupMask

_int64 GetPerfGlobalGroupMask()
{
  _BYTE *v1; // [rsp+20h] [rbp-38h]
  unsigned int v2; // [rsp+28h] [rbp-30h]
  __int64 v3; // [rsp+30h] [rbp-28h]
  UNICODE_STRING DestinationString; // [rsp+40h] [rbp-18h]

  v2 = 0;
  v3 = 0i64;
  RtlInitUnicodeString(&DestinationString, L"KeReleaseSpinLock");
  v1 = MmGetSystemRoutineAddress(&DestinationString);
  if ( !v1 )
    return 0i64;
  while ( v2 < 0xA )
  {
    if ( v1[v2] == 0x40
      && v1[v2 + 1] == 0x53
      && v1[v2 + 2] == 0x48
      && (unsigned __int8)v1[v2 + 3] == 0x83
      && (unsigned __int8)v1[v2 + 6] == 0xF6
      && v1[v2 + 7] == 5 )
    {
      v3 = (__int64)&v1[*(unsigned int *)&v1[v2 + 8] + 7];
      if ( !(unsigned __int8)MmIsAddressValid(v3) || !(unsigned __int8)MmIsAddressValid(v3 + 15) )
        return 0i64;
      return v3;
    }
    ++v2;
  }
  return v3;
}

_int64 GetPerfGlobalGroupMask()
{
  _BYTE *v1; // [rsp+20h] [rbp-38h]
  unsigned int v2; // [rsp+28h] [rbp-30h]
  __int64 v3; // [rsp+30h] [rbp-28h]
  UNICODE_STRING DestinationString; // [rsp+40h] [rbp-18h]

  v2 = 0;
  v3 = 0i64;
  RtlInitUnicodeString(&DestinationString, L"KeReleaseSpinLock");
  v1 = MmGetSystemRoutineAddress(&DestinationString);
  if ( !v1 )
    return 0i64;
  while ( v2 < 0xA )
  {
    if ( v1[v2] == 0x40
      && v1[v2 + 1] == 0x53
      && v1[v2 + 2] == 0x48
      && (unsigned __int8)v1[v2 + 3] == 0x83
      && (unsigned __int8)v1[v2 + 6] == 0xF6
      && v1[v2 + 7] == 5 )
    {
      v3 = (__int64)&v1[*(unsigned int *)&v1[v2 + 8] + 7];
      if ( !(unsigned __int8)MmIsAddressValid(v3) || !(unsigned __int8)MmIsAddressValid(v3 + 15) )
        return 0i64;
      return v3;
    }
    ++v2;
  }
  return v3;
}





注意这个PerfGlobalGroupMask[2] & 0x40控制SYSTEM_CALL的etw记录是否开启

6789安全卫士为了不让自己的hook被关闭,会给这里监控并强制置位



LoadSSSDTFunctionEntry没什么可说的,和LoadSSDTFunctionEntry的唯一区别就是取entry之前先attach了explorer



从刚才获取的ssdt入口中取出ZwTraceControl(貌似6789安全卫士用的还是NtTraceControl?我没仔细看,但是如果是NtTraceControl的话我只能说这也太捞了吧,他不怕我蓝屏的吗?)

__int64 MakeZwTraceControl()
{
  __int64 result; // rax
  char *v1; // [rsp+20h] [rbp-18h]

  v1 = FindZwForSSDT("NtTraceControl");
  if ( v1 )
    result = *((_QWORD *)v1 + 42);
  else
    result = 0i64;
  return result;
}

__int64 MakeZwTraceControl()
{
  __int64 result; // rax
  char *v1; // [rsp+20h] [rbp-18h]

  v1 = FindZwForSSDT("NtTraceControl");
  if ( v1 )
    result = *((_QWORD *)v1 + 42);
  else
    result = 0i64;
  return result;
}

获取ClckLoggerContext,根据版本不同获取方法还不一样

NTSTATUS __fastcall GetCkcl(unsigned int type, _QWORD *clck)
{
  NTSTATUS result; // eax
  unsigned int v3; // [rsp+20h] [rbp-18h]
  unsigned int typee; // [rsp+40h] [rbp+8h]
  _QWORD *clck_1; // [rsp+48h] [rbp+10h]

  clck_1 = clck;
  typee = type;
  v3 = GetBuildNumber();
  if ( v3 <= 14393 )
  {
    if ( v3 != 14393 )
    {
      switch ( v3 )
      {
        case 610u:
          return GetCkclWmiLoggerContext7601(typee, clck_1);
        case 620u:
          return GetCkclWmiLoggerContext9200(typee, clck_1);
        case 630u:
          return GetCkclWmiLoggerContext9600(typee, clck_1);
      }
      if ( v3 != 10240 && v3 != 10586 )
        goto LABEL_19;
    }
    return GetCkclWmiLoggerContext(typee, clck_1);
  }
  if ( v3 == 15063 || v3 == 16299 || v3 == 17134 || v3 == 17763 || v3 == 18362 )
    return GetCkclWmiLoggerContext(typee, clck_1);
LABEL_19:
  if ( v3 <= 18362 )
    result = 0xC0000001;
  else
    result = sub_2A0A0(typee, clck_1);
  return result;
}

NTSTATUS __fastcall GetCkcl(unsigned int type, _QWORD *clck)
{
  NTSTATUS result; // eax
  unsigned int v3; // [rsp+20h] [rbp-18h]
  unsigned int typee; // [rsp+40h] [rbp+8h]
  _QWORD *clck_1; // [rsp+48h] [rbp+10h]

  clck_1 = clck;
  typee = type;
  v3 = GetBuildNumber();
  if ( v3 <= 14393 )
  {
    if ( v3 != 14393 )
    {
      switch ( v3 )
      {
        case 610u:
          return GetCkclWmiLoggerContext7601(typee, clck_1);
        case 620u:
          return GetCkclWmiLoggerContext9200(typee, clck_1);
        case 630u:
          return GetCkclWmiLoggerContext9600(typee, clck_1);
      }
      if ( v3 != 10240 && v3 != 10586 )
        goto LABEL_19;
    }
    return GetCkclWmiLoggerContext(typee, clck_1);
  }
  if ( v3 == 15063 || v3 == 16299 || v3 == 17134 || v3 == 17763 || v3 == 18362 )
    return GetCkclWmiLoggerContext(typee, clck_1);
LABEL_19:
  if ( v3 <= 18362 )
    result = 0xC0000001;
  else
    result = sub_2A0A0(typee, clck_1);
  return result;
}

7600 7601从EtwSendTraceBuffer里搜索WmipLoggerContext





9200(win8)9600(win8.1)也是同样的套路这里就不重复发了



win10上面使用经典的复制粘贴大法



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-3-26 13:16 被hzqst编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (27)
雪    币: 711
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大表哥牛逼
2020-3-26 13:33
0
雪    币: 153
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这波啊 这波是肉蛋葱鸡
2020-3-26 13:36
2
雪    币: 2345
活跃值: (3064)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
前排占位,沙发自带
2020-3-26 13:50
0
雪    币: 3475
活跃值: (7764)
能力值: ( LV4,RANK:41 )
在线值:
发帖
回帖
粉丝
5
xx卫士:下一个还真的是PG。
2020-3-26 14:02
0
雪    币: 665
活跃值: (1051)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
小飞:还是shark香吧
2020-3-26 14:12
1
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
XSJJ 这波啊 这波是肉蛋葱鸡[em_86]
这波啊,这波是CTRL+C V二连,他的一个不好的地方
2020-3-26 14:57
0
雪    币: 4006
活跃值: (726)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
好几个大佬都走了.
2020-3-26 17:51
0
雪    币: 405
活跃值: (2285)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
18950预览版已经把InfinityHook愉悦送走
最后于 2020-3-26 18:14 被wowocock编辑 ,原因:
2020-3-26 18:13
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
wowocock 18950预览版已经把InfinityHook愉悦送走
欢声笑语中打出GG,用了8年的hook点被老外一朝爆料全部升天
2020-4-4 16:15
0
雪    币: 34
活跃值: (264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
cvcvxk 欢声笑语中打出GG,用了8年的hook点被老外一朝爆料全部升天
 = =
最后于 2020-4-8 11:15 被古河面包店编辑 ,原因:
2020-4-8 11:02
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
云里雾里
2020-4-11 09:40
0
雪    币: 1420
活跃值: (2171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
精通一百种锁主页的方法
2020-4-11 10:26
2
雪    币: 4939
活跃值: (2360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
2020-4-11 14:08
0
雪    币: 1525
活跃值: (3422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
从刚才获取的ssdt入口中取出ZwTraceControl(貌似6789安全卫士用的还是NtTraceControl?我没仔细看,但是如果是NtTraceControl的话我只能说这也太捞了吧,他不怕我蓝屏的吗?)

这句话什么意思呢?为什么说使用NtTraceControl怕蓝屏? 我在7600版本上看了没有ZwTraceControl
2020-5-6 00:42
0
雪    币: 119
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
请问下,  使用 win7  7601 版本 NtTraceControl启动蓝屏, 可否告知是何原因,或者告知要往哪块分析去解决。  谢谢!
2020-8-21 05:01
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
19
星辰无大海 请问下, 使用 win7 7601 版本 NtTraceControl启动蓝屏, 可否告知是何原因,或者告知要往哪块分析去解决。 谢谢!
https://github.com/everdox/InfinityHook/issues/7  求求你们先看看原作者的github再来提问
2020-8-21 11:01
0
雪    币: 119
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
hzqst https://github.com/everdox/InfinityHook/issues/7 求求你们先看看原作者的github再来提问
谢谢表哥,问题已经得到了解决,刚入门不是很懂,以后会自己多看看
2020-8-22 21:55
0
雪    币: 7
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ybt
21

挺郁闷的,我本来想自己逆下2345安全卫士的驱动,结果在Win7 x64虚拟机下,试了三次,都是安装卡死在进度98%,并附带电脑死机。重启后,发现压根没安装。。。

最后于 2020-12-29 16:10 被ybt编辑 ,原因:
2020-12-29 16:10
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22

    WIN10以下的系统还有一种获取WmipLoggerContext的方法,
就是从已导出的nt!EtwSendTraceBuffer函数中进行特征码暴搜,找到WmipLoggerContext相对于ntoskrnl.exe的偏移(RVA)从而计算得到WmipLoggerContext的地址, WmipLoggerContext[2]->GetCpuClock就是需要替换的了。 方法不错!嗯!哪阵可以还可以再用这个方法试下WIN10以下的系统!

    多看高手分析再加以实践就能不断得到提高!感谢前辈分享!

最后于 2020-12-30 22:56 被低调putchar编辑 ,原因:
2020-12-30 22:45
0
雪    币: 49
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
表哥我虚拟机测试没事,但是主机没效果是什么问题呀,那些地址都搜到了
2022-1-30 15:39
0
雪    币: 3685
活跃值: (2312)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
mark
2022-2-11 09:57
0
游客
登录 | 注册 方可回帖
返回
//