冰楓論壇

標題: source code for 多開 [打印本頁]

作者: ITE8591    時間: 2012-12-11 14:55
標題: source code for 多開
看了懂了 就修改下列function 即可

  1.         bool EnableMultiMS()
  2.         {
  3.                 int handleCount = 1024;

  4.                 HMODULE ntdll = GetModuleHandle(L"ntdll");
  5.                 if (ntdll == NULL)
  6.                 {
  7.                         Log(L"Couldn't get ntdll handle\n");
  8.                         return false;
  9.                 }

  10.                 NtQueryObject_t ntQO = (NtQueryObject_t)GetProcAddress(ntdll, "NtQueryObject");
  11.                 NtQuerySystemInformation_t ntQSI = (NtQuerySystemInformation_t)GetProcAddress(ntdll, "NtQuerySystemInformation");
  12.                 if (ntQO == NULL || ntQSI == NULL)
  13.                 {
  14.                         Log(L"Couldn't find procedures for MultiMS (%x / %x)\n", ntQO, ntQSI);
  15.                         return false;
  16.                 }

  17.                 struct HandleInfoSet
  18.                 {
  19.                         unsigned int count;
  20.                         SYSTEM_HANDLE_INFORMATION handles[1];
  21.                 };

  22.                 HandleInfoSet *infoSet = (HandleInfoSet *)malloc(4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount);
  23.                 DWORD length;

  24.                 NTSTATUS status = ntQSI((SYSTEM_INFORMATION_CLASS)16, infoSet, 4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount, &length);

  25.                 Log(L"alloc with %i // %i\n", handleCount, handleCount * sizeof(SYSTEM_HANDLE_INFORMATION) + 4);

  26.                 while (status == 0xc0000004 /*STATUS_INFO_LENGTH_MISMATCH*/)
  27.                 {
  28.                         free(infoSet);

  29.                         handleCount *= 2;

  30.                         Log(L"alloc with %i // %i\n", handleCount, handleCount * sizeof(SYSTEM_HANDLE_INFORMATION) + 4);
  31.                         infoSet = (HandleInfoSet *)malloc(4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount);
  32.                         status = ntQSI((SYSTEM_INFORMATION_CLASS)16, infoSet, 4 + sizeof(SYSTEM_HANDLE_INFORMATION) * handleCount, &length);
  33.                 }

  34.                 if (status != 0 /*STATUS_SUCCESS*/)
  35.                 {
  36.                         Log(L"Failed to enumerate handles open by this process (errorcode %x)\n", status);
  37.                         free(infoSet);
  38.                         return false;
  39.                 }

  40.                 for (unsigned int i = 0; i < infoSet->count; i++)
  41.                 {
  42.                         wchar_t nameBuffer[1024];
  43.                         if (infoSet->handles[i].handle == 0x0012019F) continue;        // some buggy thing we need to skip
  44.                         status = ntQO((HANDLE)infoSet->handles[i].handle, (OBJECT_INFORMATION_CLASS)1, nameBuffer, 1024, &length);
  45.                         if (status != 0 /*STATUS_SUCCESS*/)
  46.                                 continue;

  47.                         if (wcsstr(nameBuffer + 4, L"WvsClientMtx") != NULL)
  48.                         {
  49.                                 HANDLE handle;
  50.                                 DuplicateHandle(GetCurrentProcess(), (HANDLE)infoSet->handles[i].handle, 0, &handle, 0, FALSE, DUPLICATE_CLOSE_SOURCE);
  51.                                 CloseHandle(handle);
  52.                                 Log(L"Mutex closed, MultiMS is ok\n");
  53.                                 break;
  54.                         }
  55.                 }

  56.                 free(infoSet);
  57.                 return true;
  58.         }

複製代碼

作者: cxxxx    時間: 2012-12-11 16:06
很明顯現在的版本沒有那麼簡單了。。。
作者: q28814028    時間: 2012-12-13 22:09
提示: 作者被禁止或刪除 內容自動屏蔽
作者: ggc0131    時間: 2013-1-31 23:05
提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓