Bagaimana Runescape menangkap bot, dan mengapa dia tidak menangkap saya



Mengotomatiskan tindakan pemain selalu menjadi masalah utama dalam MMORPG seperti World of Warcraft dan Runescape . Jenis peretasan permainan ini sangat berbeda dari tipuan tradisional, misalnya, dalam penembak.



Suatu akhir pekan saya memutuskan untuk melihat sistem deteksi yang digunakan Jagex untuk mencegah Runescape mengotomatiskan tindakan pemain.



Botanikultur



Selama beberapa bulan terakhir, akun tersebut telah sch0u



diputar sepanjang waktu di 67 server dunia, melakukan tugas-tugas monoton seperti membunuh massa dan mengumpulkan sumber daya. Sekilas, akun ini terlihat seperti pemain lain, tetapi ada satu perbedaan penting: ini adalah bot .





Saya meluncurkan bot ini pada bulan Oktober untuk menguji kemampuan sistem pengenalan bot. Setelah mencoba mencari informasi tentang bagaimana Jagex melawan bot bot, saya hanya menemukan video bot berbayar, yang pengembangnya membual bahwa sistem pergerakan mouse mereka tidak dapat dibedakan dari tindakan manusia.



Oleh karena itu, satu-satunya hal yang dapat saya pahami adalah pentingnya gerakan mouse , tetapi benarkah demikian?



Heuristik!



Untuk mengonfirmasi teori ini, saya mulai dengan memeriksa klien Runescape dan segera melihat variabel global hhk



disetel segera setelah peluncuran.



const auto module_handle = GetModuleHandleA(0);
hhk = SetWindowsHookExA(WH_MOUSE_LL, rs::mouse_hook_handler, module_handle, 0);
      
      





Kode ini memasang pencegat tingkat rendah pada mouse yang terpasang pada rantai penyergap sistem . Ini memungkinkan aplikasi Windows untuk mencegat semua kejadian mouse, bahkan jika mereka tidak terkait dengan aplikasi tertentu. Interceptors tingkat rendah (hook) sering digunakan oleh keylogger , tetapi juga dapat digunakan untuk tujuan damai, misalnya, dalam heuristik, seperti interseptor mouse yang disebutkan di atas.



Faktanya, penangan mouse Runescape cukup sederhana (kodesemu di-tweak untuk kecantikan dengan tangan):



LRESULT __fastcall rs::mouse_hook_handler(int code, WPARAM wParam, LPARAM lParam)
{
  if ( rs::client::singleton )
  {
      // Call the internal logging handler
      rs::mouse_hook_handler_internal(rs::client::singleton->window_ctx, wParam, lParam);
  }
  // Pass the information to the next hook on the system
  return CallNextHookEx(hhk, code, wParam, lParam);
}
      
      





void __fastcall rs::mouse_hook_handler_internal(rs::window_ctx *window_ctx, __int64 wparam, _DWORD *lparam)
{
  // If the mouse event happens outside of the Runescape window, don't log it.
  if (!window_ctx->event_inside_of_window(lparam))
  {
    return;
  }

  switch (wparam)
  {
    case WM_MOUSEMOVE:
      rs::heuristics::log_movement(lparam);
      break;
    
    case WM_LBUTTONDOWN:
    case WM_LBUTTONDBLCLK:
    case WM_RBUTTONDOWN:
    case WM_RBUTTONDBLCLK:
    case WM_MBUTTONDOWN:
    case WM_MBUTTONDBLCLK:
      rs::heuristics::log_button(lparam);
      break;
  }
}
      
      





untuk mengurangi beban pada tautan, fungsi ini rs::heuristics::log_*



menggunakan algoritme sederhana untuk melewati data kejadian yang menyerupai kejadian yang direkam sebelumnya.



Nanti, data peristiwa ini diurai oleh fungsi rs::heuristics::process



yang disebut setiap bingkai dari perulangan render utama.



void __fastcall rs::heuristics::process(rs::heuristic_engine *heuristic_engine)
{
  // Don't process any data if the player is not in a world
  auto client = heuristic_engine->client;
  if (client->state != STATE_IN_GAME)
  {
    return;
  }

  // Make sure the connection object is properly initialised
  auto connection = client->network->connection;
  if (!connection || connection->server->mode != SERVER_INITIALISED)
  {
    return;
  }

  // The following functions parse and pack the event data, and is later sent
  // by a different component related to networking that has a queue system for
  // packets.

  // Process data gathered by internal handlers
  rs::heuristics::process_source(&heuristic_engine->event_client_source);

  // Process data gathered by the low level mouse hook
  rs::heuristics::process_source(&heuristic_engine->event_hook_source);
}
      
      





Jauh dari keyboard?



Selama proses rekayasa terbalik, saya mencoba mencari tahu pentingnya setiap fungsi yang saya pelajari, biasanya dengan membuat kait atau tambalan untuk fungsi tersebut. Anda biasanya dapat mengetahui apakah suatu fitur relevan dengan menjadikannya tidak berguna dan memantau status perangkat lunak. Metodologi penelitian ini menghasilkan pengamatan yang menarik.



Setelah melarang permainan untuk memanggil fungsi tersebut rs::heuristics::process



, pada awalnya saya tidak melihat apa-apa, tetapi setelah tepat lima menit server mengeluarkan saya. Jelas, Runescape menentukan ketidakaktifan pemain hanya dengan data heuristik yang dikirimkan oleh klien ke server, bahkan jika Anda dapat bermain dengan normal. Ini menimbulkan pertanyaan baru: jika server berpikir bahwa saya tidak bermain, apakah menurutnya saya bermain sebagai bot? ...



Setelah itu, saya menghabiskan beberapa hari lagi merekayasa balik lapisan jaringan game, sehingga bot saya sekarang dapat melakukan hampir semua hal menggunakan paket jaringan saja .



Untuk memvalidasi teori saya, saya bekerja sepanjang waktu, tujuh hari seminggu, bahkan tanpa menggerakkan mouse saya. Setelah menghabiskan ribuan jam seperti ini, dengan yakin saya dapat mengatakan bahwa sistem deteksi bot hanya menggunakan data peristiwa heuristik yang dikirim ke server oleh klien, atau hanya berfungsi saat pemain tidak "afk". Setiap pemain yang berhasil bermain tanpa menggerakkan kursor harus segera di banned, yaitu developer harus memperhatikan kekurangan ini.






All Articles