GNU/Linux >> Belajar Linux >  >> Linux

Proses Apa yang Membuat Jendela X11 Ini?

Diberikan ID jendela X11, apakah ada cara untuk menemukan ID proses yang membuatnya?

Tentu saja ini tidak selalu memungkinkan, misalnya jika jendela datang melalui koneksi TCP. Untuk itu saya ingin IP dan port yang terkait dengan ujung jarak jauh.

Pertanyaan itu diajukan sebelumnya di Stack Overflow, dan metode yang diusulkan adalah menggunakan _NET_WM_PID Properti. Tapi itu diatur oleh aplikasi. Apakah ada cara untuk melakukannya jika aplikasi tidak berfungsi dengan baik?

Jawaban yang Diterima:

Kecuali X-server Anda mendukung XResQueryClientIds dari ekstensi X-Resource v1.2 saya tahu tidak mudah cara untuk terpercaya ID proses permintaan. Namun ada cara lain.

Jika Anda hanya memiliki jendela di depan Anda dan belum mengetahui ID-nya — mudah untuk menemukannya. Cukup buka terminal di sebelah jendela yang dimaksud, jalankan xwininfo di sana dan klik pada jendela itu. xwininfo akan menunjukkan id jendela.

Jadi mari kita asumsikan Anda tahu id jendela, mis. 0x1600045, dan ingin mencari, bagaimana proses memilikinya.

Cara termudah untuk memeriksa milik siapa jendela itu adalah dengan menjalankan XKillClient untuk itu, yaitu:

xkill -id 0x1600045

dan lihat proses mana yang baru saja mati. Tetapi hanya jika Anda tidak keberatan membunuhnya tentu saja!

Cara lain yang mudah tetapi tidak dapat diandalkan adalah dengan memeriksa _NET_WM_PID dan WM_CLIENT_MACHINE properti:

xprop -id 0x1600045

Itulah alat-alat seperti xlsclients dan xrestop lakukan.

Sayangnya informasi ini mungkin salah bukan hanya karena prosesnya jahat dan mengubahnya, tetapi juga karena buggy. Misalnya setelah beberapa firefox crash/restart saya telah melihat jendela yatim (dari plugin flash, saya kira) dengan _NET_WM_PID menunjuk ke sebuah proses, yang sudah lama mati.

Cara alternatif adalah dengan menjalankan

xwininfo -root -tree

dan periksa properti orang tua dari jendela yang dimaksud. Itu mungkin juga memberi Anda beberapa petunjuk tentang asal jendela.

Tetapi! Meskipun Anda mungkin tidak menemukan proses apa yang membuat jendela itu, masih ada cara untuk menemukan dari mana proses itu terhubung ke server-X. Dan cara itu adalah untuk peretas sejati.

Window-id 0x1600045 yang Anda ketahui dengan bit nol yang lebih rendah (yaitu 0x1600000) adalah "basis klien". Dan semua ID sumber daya, yang dialokasikan untuk klien itu "berdasarkan" padanya (0x1600001, 0x1600002, 0x1600003, dll). X-server menyimpan informasi tentang kliennya dalam larik klien[], dan untuk setiap klien "basisnya" disimpan dalam variabel klien[i]->clientAsMask. Untuk menemukan X-socket, yang sesuai dengan klien itu, Anda harus melampirkan ke X-server dengan gdb , berjalan di atas array klien[], temukan klien dengan clientAsMask dan cetak deskriptor soketnya, disimpan di ((OsCommPtr)(clients[i]->osPrivate))->fd.

Mungkin ada banyak klien X yang terhubung, jadi agar tidak memeriksa semuanya secara manual, mari gunakan fungsi gdb:

define findclient
  set $ii = 0
  while ($ii < currentMaxClients)
    if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
      print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
    end
    set $ii = $ii + 1
  end
end

Saat Anda menemukan soket, Anda dapat memeriksa, siapa yang terhubung, dan akhirnya menemukan prosesnya.

Terkait:Bagaimana cara mengunduh aplikasi dari window 10 store untuk melakukan sideload?

PERINGATAN :JANGAN lampirkan gdb ke X-server dari DALAM X-server. gdb menangguhkan proses yang dilampirkannya, jadi jika Anda melampirkannya dari dalam sesi-X, Anda akan membekukan server-X Anda dan tidak akan dapat berinteraksi dengan gdb. Anda harus beralih ke terminal teks (Ctrl+Alt+F2 ) atau sambungkan ke mesin Anda melalui ssh.

Contoh:

  1. Temukan PID server-X Anda:

    $ ps ax | grep X
     1237 tty1     Ssl+  11:36 /usr/bin/X :0 vt1 -nr -nolisten tcp -auth /var/run/kdm/A:0-h6syCa
    
  2. Id jendela adalah 0x1600045, jadi basis klien adalah 0x1600000. Lampirkan ke X-server dan temukan deskriptor soket klien untuk basis klien itu. Anda memerlukan informasi debug
    yang diinstal untuk X-server (paket -debuginfo untuk distribusi rpm atau paket -dbg untuk deb).

    $ sudo gdb
    (gdb) define findclient
    Type commands for definition of "findclient".
    End with a line saying just "end".
    >  set $ii = 0
    >  while ($ii < currentMaxClients)
     >   if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
      >     print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
      >     end
     >   set $ii = $ii + 1
     >   end
    >  end
    (gdb) attach 1237
    (gdb) findclient 0x1600000
    $1 = 31
    (gdb) detach
    (gdb) quit
    
  3. Sekarang Anda tahu bahwa klien terhubung ke soket server 31. Gunakan lsof untuk menemukan apa soket itu:

    $ sudo lsof -n | grep 1237 | grep 31
    X        1237    root   31u   unix 0xffff810008339340       8512422 socket
    

    (di sini "X" adalah nama proses, "1237" adalah pid-nya, "root" adalah pengguna yang menjalankannya, "31u" adalah deskriptor soket)

    Di sana Anda mungkin melihat bahwa klien terhubung melalui TCP, kemudian Anda dapat pergi ke mesin yang terhubung darinya dan memeriksa netstat -nap sana untuk menemukan prosesnya. Tapi kemungkinan besar Anda akan melihat soket unix di sana, seperti yang ditunjukkan di atas, yang berarti itu adalah klien lokal.

  4. Untuk menemukan pasangan soket unix tersebut, Anda dapat menggunakan teknik MvG (Anda juga memerlukan informasi debug untuk kernel yang Anda instal):

    $ sudo gdb -c /proc/kcore
    (gdb) print ((struct unix_sock*)0xffff810008339340)->peer
    $1 = (struct sock *) 0xffff810008339600
    (gdb) quit
    
  5. Sekarang setelah Anda mengetahui soket klien, gunakan lsof untuk menemukan PID memegangnya:

    $ sudo lsof -n | grep 0xffff810008339600
    firefox  7725  username  146u   unix 0xffff810008339600       8512421 socket
    

Itu dia. Proses menjaga jendela itu adalah "firefox" dengan process-id 7725

Edit 2017 :Ada lebih banyak opsi sekarang seperti yang terlihat di Who's got the end of this unix socketpair?. Dengan Linux 3.3 atau lebih tinggi dan dengan lsof 4.89 atau lebih, Anda dapat mengganti poin 3 hingga 5 di atas dengan:

lsof +E -a -p 1237 -d 31

untuk mengetahui siapa yang ada di ujung soket pada fd 31 dari proses X-server dengan ID 1237.


Linux
  1. Apa itu proses yang tidak terputus?

  2. Bagaimana cara mengetahui proses apa yang mengunci file di Linux?

  3. Proses apa yang menggunakan semua IO disk saya

  1. Apa window manager Linux favorit Anda?

  2. Temukan proses apa yang ada di ujung lain pipa

  3. Apa perintah untuk menemukan prioritas proses di Linux?

  1. Apa Proses Zombie Dan Bagaimana Menemukan &Membunuh Proses Zombie?

  2. Apakah Mungkin Untuk Mengetahui Program Atau Script Apa yang Membuat File Yang Diberikan?

  3. Apa Penyebab Berbagai Sinyal Terkirim?