Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд [Reverse] Valorant Анализ Vanguard Restrictions Messager

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
251
Реакции
6
Приветствую, коллеги.

Наткнулся тут на любопытную механику работы Vanguard Restrictions Messager. Если кто-то копает в сторону обхода уведомлений или взаимодействия с античитом, этот дамп может быть полезен для понимания того, как именно он отрабатывает вызовы.

Суть в том, что сам месседжер можно обойти через хуки:
  1. WTSSendMessageW
  2. WaitForSingleObject
  3. CreateProcessAsUserW

Ну или реализовать свой метод, если есть другие наработки. Для удобства прикладываю основной фрагмент кода для анализа:

Код:
Expand Collapse Copy
__int64 __fastcall sub_D7BA0(unsigned __int64 a1, unsigned __int64 a2, __int64 a3)
{
  HANDLE v4; // rax
  void *v5; // rbx
  DWORD CurrentProcessId; // eax
  HMODULE LibraryW; // rdi
  FARPROC ProcAddress; // rbx
  FARPROC v9; // rax
  void (*v10)(void); // rsi
  HANDLE CurrentProcess; // rax
  __int64 v12; // r8
  DWORD active; // eax
  __int128 *v14; // rcx
  __int64 v15; // rbx
  __int128 *v16; // r9
  __m128 *p_Parameter; // rcx
  __m128 *v18; // r8
  WCHAR LibFileName[8]; // [rsp+60h] [rbp-A0h] BYREF
  __m128 v21; // [rsp+70h] [rbp-90h]
  CHAR ProcName[16]; // [rsp+80h] [rbp-80h] BYREF
  __m128 v23; // [rsp+90h] [rbp-70h]
  CHAR v24[16]; // [rsp+A0h] [rbp-60h] BYREF
  __m128 v25; // [rsp+B0h] [rbp-50h]
  __m128 Parameter; // [rsp+C0h] [rbp-40h] BYREF
  __m128 v27; // [rsp+D0h] [rbp-30h]
  _BYTE ProcessInformation[32]; // [rsp+E0h] [rbp-20h] BYREF
  HANDLE hToken; // [rsp+100h] [rbp+0h] BYREF
  void *TokenHandle; // [rsp+108h] [rbp+8h] BYREF
  LPVOID lpEnvironment; // [rsp+110h] [rbp+10h] BYREF
  DWORD pSessionId; // [rsp+118h] [rbp+18h] BYREF
  __int128 v33; // [rsp+120h] [rbp+20h] BYREF
  __m128i si128; // [rsp+130h] [rbp+30h]
  struct _STARTUPINFOW StartupInfo; // [rsp+140h] [rbp+40h] BYREF
 
  hToken = 0LL;
  lpEnvironment = 0LL;
  v33 = 0LL;
  si128 = _mm_load_si128((const __m128i *)&xmmword_4EAC20);
  LOWORD(v33) = 0;
  Parameter.m128_u64[0] = a1;
  Parameter.m128_u64[1] = a2;
  v27.m128_u64[0] = 30LL;
  v27.m128_i32[2] = 0;
  v4 = CreateThread(0LL, 0LL, (LPTHREAD_START_ROUTINE)StartAddress, &Parameter, 0, 0LL);// WTSSendMessageW
  v5 = v4;
  if ( v4 )
  {
    WaitForSingleObject(v4, 0x7918u);
    CloseHandle(v5);
    if ( v27.m128_i32[2] )
    {
      if ( v27.m128_i32[1] == 1 )
      {
        if ( a3 )
        {
          pSessionId = 0;
          CurrentProcessId = GetCurrentProcessId();
          ProcessIdToSessionId(CurrentProcessId, &pSessionId);
          *(_QWORD *)ProcessInformation = 0x3CBF9C9FFF72D2DLL;
          *(_QWORD *)&ProcessInformation[8] = 0x6A1932D85C1EE862LL;
          *(_QWORD *)&ProcessInformation[16] = 0xDE2087BD6B2BC7FLL;
          *(_QWORD *)&ProcessInformation[24] = 0x69CFA552E40CE5D4LL;
          Parameter.m128_u64[0] = 0x3B9F9ACFF842D78LL;
          Parameter.m128_u64[1] = 0x6A3732AE5C70E807LL;
          v27.m128_u64[0] = 0xDE20817D6DEBC1BLL;
          v27.m128_u64[1] = 0x69CFA552E40CE5D4LL;
          *(__m128 *)LibFileName = _mm_xor_ps(Parameter, *(__m128 *)ProcessInformation);
          v21 = _mm_xor_ps(v27, *(__m128 *)&ProcessInformation[16]);
          LibraryW = LoadLibraryW(LibFileName);
          if ( LibraryW )
          {
            *(_QWORD *)ProcessInformation = 0x3CBF9C9FFF72D2DLL;
            *(_QWORD *)&ProcessInformation[8] = 0x6A1932D85C1EE862LL;
            *(_QWORD *)&ProcessInformation[16] = 0xDE2087BD6B2BC7FLL;
            *(_QWORD *)&ProcessInformation[24] = 0x69CFA552E40CE5D4LL;
            Parameter.m128_u64[0] = 0x6D8E9CBD9E925F6ELL;
            Parameter.m128_u64[1] = 0x47C5FB6336C8114LL;
            v27.m128_u64[0] = 0xDE26318B9DEFE0BLL;
            v27.m128_u64[1] = 0x69CFA552E40CE5D4LL;
            *(__m128 *)ProcName = _mm_xor_ps(Parameter, *(__m128 *)ProcessInformation);
            v23 = _mm_xor_ps(v27, *(__m128 *)&ProcessInformation[16]);
            ProcAddress = GetProcAddress(LibraryW, ProcName);
            *(_QWORD *)ProcessInformation = 0x3CBF9C9FFF72D2DLL;
            *(_QWORD *)&ProcessInformation[8] = 0x6A1932D85C1EE862LL;
            *(_QWORD *)&ProcessInformation[16] = 0xDE2087BD6B2BC7FLL;
            *(_QWORD *)&ProcessInformation[24] = 0x69CFA552E40CE5D4LL;
            Parameter.m128_u64[0] = 0x46B296BB8B844869LL;
            Parameter.m128_u64[1] = 0xF745CB72E779E0CLL;
            v27.m128_u64[0] = 0xD896B14BAF0C811LL;
            v27.m128_u64[1] = 0x69CFA552E40CE5D4LL;
            *(__m128 *)v24 = _mm_xor_ps(Parameter, *(__m128 *)ProcessInformation);
            v25 = _mm_xor_ps(v27, *(__m128 *)&ProcessInformation[16]);
            v9 = GetProcAddress(LibraryW, v24);
            v10 = (void (*)(void))v9;
            if ( ProcAddress && v9 )
            {
              if ( pSessionId )
                goto LABEL_32;
              TokenHandle = 0LL;
              CurrentProcess = GetCurrentProcess();
              if ( OpenProcessToken(CurrentProcess, 0xF01FFu, &TokenHandle) )
              {
                *(_QWORD *)ProcessInformation = 0x3CBF9C9FFF72D2DLL;
                *(_QWORD *)&ProcessInformation[8] = 0x6A1932D85C1EE862LL;
                *(_QWORD *)&ProcessInformation[16] = 0xDE2087BD6B2BC7FLL;
                *(_QWORD *)&ProcessInformation[24] = 0x69CFA552E40CE5D4LL;
                Parameter.m128_u64[0] = 0x3A8F99DFF922D7ELL;
                Parameter.m128_u64[1] = 0x6A7032AA5C4EE800LL;
                v27.m128_u64[0] = 0xD870817D6DBBC09LL;
                v27.m128_u64[1] = 0x69CFA552E469E5B3LL;
                Parameter = _mm_xor_ps(Parameter, *(__m128 *)ProcessInformation);
                v27 = _mm_xor_ps(v27, *(__m128 *)&ProcessInformation[16]);
                LOBYTE(v12) = 1;
                sub_F8AA0(TokenHandle, &Parameter, v12);
                CloseHandle(TokenHandle);
              }
              active = WTSGetActiveConsoleSessionId();
              if ( (unsigned int)QueryUserToken(active, &hToken) )
              {
LABEL_32:
                if ( ((unsigned int (__fastcall *)(LPVOID *, HANDLE, __int64))ProcAddress)(&lpEnvironment, hToken, 1LL)
                  && (unsigned __int8)sub_D7740(hToken, &v33) )
                {
                  v14 = &v33;
                  if ( si128.m128i_i64[1] > 7uLL )
                    v14 = (__int128 *)v33;
                  v15 = (int)sub_E21B0(v14, a3);
                  Parameter = 0LL;
                  v27 = (__m128)_mm_load_si128((const __m128i *)&xmmword_4EAC20);
                  Parameter.m128_i16[0] = 0;
                  sub_CD860(&Parameter, v15 + 1);
                  v16 = &v33;
                  if ( si128.m128i_i64[1] > 7uLL )
                    LODWORD(v16) = v33;
                  p_Parameter = &Parameter;
                  if ( v27.m128_u64[1] > 7 )
                    LODWORD(p_Parameter) = Parameter.m128_i32[0];
                  sub_E2140((_DWORD)p_Parameter, v15 + 1, si128.m128i_i32[0], (_DWORD)v16, a3);
                  memset(&StartupInfo.cb + 1, 0, 100);
                  StartupInfo.cb = 104;
                  memset(ProcessInformation, 0, 24);
                  v18 = &Parameter;
                  if ( v27.m128_u64[1] > 7 )
                    v18 = (__m128 *)Parameter.m128_u64[0];
                  if ( CreateProcessAsUserW(
                         hToken,
                         0LL,
                         (LPWSTR)v18,
                         0LL,
                         0LL,
                         0,
                         0x420u,
                         lpEnvironment,
                         0LL,
                         &StartupInfo,
                         (LPPROCESS_INFORMATION)ProcessInformation) )
                  {
                    CloseHandle(*(HANDLE *)ProcessInformation);
                    CloseHandle(*(HANDLE *)&ProcessInformation[8]);
                  }
                  VGC_WStr_Destroy(&Parameter);
                }
              }
            }
            if ( lpEnvironment )
              v10();
            FreeLibrary(LibraryW);
            if ( hToken )
              CloseHandle(hToken);
          }
        }
      }
    }
  }
  return VGC_WStr_Destroy(&v33);
}

Также, для тех, кто ищет способы легитимизации или просто изучает сигнатуры, вот актуальный список вайтлистед хешей:

Код:
Expand Collapse Copy
"6b3b4992ac7003797b25510e2142e68cde4c762b","83fa0fb4bfb2eafcb60b2213a521f9cb66368e27","0027bb9f956056b469b1dfd7cebd23c53b8f6f79","97b52574e15ef740531fca85e1cae85b5a2a81da","672499b0d7c7681aa42cebf22eb4368813d7d4b3","5a3ab2cac8775a050d8dd38d56cf28871a95db8d","92e520459e7f93d8d91ec5d78d0fe1bdefdb0e06","38c7b3846244f87b702fad14a7f54fe5a29ad34e","824bdcff868a17043ccd8909299650b5ad5c9dee","d686c8d1c7bc340ccaabf2a23b7fb74ce9fe178b","7f530281c5ba86b81ae4230dab1617cb55260d9e","13516890a00a9b004ef8b2e9a9901504b8c84dae","f45c326eb377ab9667e0d0d3ec72c4417dbb2286","48b2f27c3468a11a693a115a510c96c32468c734","c521025c55687c1f29b1f3a3c69b3d152ce84981","2bbb5e521ca92fd885873b76af07d58053e39067","e1b50088ed92b60a1400cd60c2afae9808ea15b3","fbfef415104e20b86d86c051653d5ed61e003943","0ef4679521b05f40eba025ef063d8061b49c93e8","92de6eafef2a0fad235b69f1f1a00d8c50a121d1","e9a35d72ad9c0f35c77912d454915d5f76356c41","91180ed89976d16353404ac982a422a707f2ae37","42c3957e46997d88b257315be61c1c9c7cda5bf1","1f15ac2ba806275afa35ab9373bacd5f5f8533d2","234e3ed163f6d1f9b93368d83112d4340ceafe2f","dd7195ffa375b3e2b6d32bfae755f474641f049a","3f64c98f22da277a07cab248c44c56eedb796a81","3d824f6aa75611478e56f4f56d0a6f6db8cb1c9b","e4e3f6bbad17b41a42687b3d75ade4a10b0870ec","ddb988b23c7516d2accfcd1796aceb2de705fbe1","660e47d00af463cdb615026565f06d9edb896fee","1b199e0dc32b76eca078f2878f1880f8ef330799","6c8be217856ca0378fb0e0a62c24a62771fce049","4568aff6010b4eabde4e141e7eebc4b53deb7ba0","3d26b0dc519e04999118f4a02ea8acd5f1db8feb","4f58be64ebff5be3132122612cbd3983cf7d05f7","341af85b4fe8b55c6f9875abd76dfea3a0e1f29d","8b9c5f448f8c08f3162638ce455a3a52ba6d9ee7","07d0249357b792bd35cdc0d23a2b2fa2b1fdbd4b","e3ce7157dc3334a1d95f2aad137d9ca66160b71c","73ccf556516c5e8a450f4d9b44b004dfad57d7b1","953fb3d50404336d9e3b220fd15f770e90a369a0","06395febb61b01844e23f42eec0a01b3bd4f65a8","944bb7170090377d57b65aa3aedb4068f474184e","2c33d4573e21c7d18de1d3f337bacd7c4e58fe87","e88efd65b405e1821c6e427500d78b57fe9ef20b","b74c93f07fa1bfe70950f0f71f5fbcb7cfd2bb98","026123af200ca87911e62b46a578afcf7479d6c4","f948a4c5e01a74b17d0f966615834ba76dc1badc","c2342aadac5b6dc6c9d2ff2e6ba5af0c40ed329c","73569b302c7811efdaa387b24d7bf4ad28e6d687","def9de1a7310f464ddd6b770e34de0205d650b45","200055b8a095a51e7d1604865d32f458ff72d540","098ad48e3787adbcda57c4e39a45ac8a6ca35359","964c42a4b15f0456d21673129a30fb9e78f219cb","a44b02c5c4750258566f0709b2ec8063802d5037","0811c39fd76395ed47646310bf5ecf57a0ac8ce4"

Вопрос к знающим: кто-то уже пробовал полноценно дергать эти функции через перехват в рантайме? Есть ли смысл упарываться в хуки, или проще идти через кастомный драйвер и прямой манипуляцией с объектами сессий?

Разбираем, обсуждаем, делимся опытом.
 
не пытался ничего из этого хукать, но для обхода сообщений об рестрикте я отрезал права у vgk + чистил callback's (process + system) и в итоге он не может закрыть валорант когда вылетает рестрикт и не может сканировать память. но до конца не дорабатывал поэтому вылезает van 1067 скорее всего из за того что vgk не может отправить heartbeat.
 
Назад
Сверху Снизу