Kecuali X-server Anda mendukung XResQueryClientIds
dari ekstensi X-Resource v1.2, saya tidak tahu cara mudah untuk meminta ID proses dengan andal . Namun ada cara lain.
Jika Anda hanya memiliki jendela di depan Anda dan belum tahu ID-nya - mudah untuk menemukannya. Cukup buka terminal di sebelah jendela yang dimaksud, jalankan di xwininfo
sana dan klik pada jendela itu. xwininfo
akan menunjukkan kepada Anda window-id.
Jadi mari kita asumsikan Anda tahu id-jendela, misalnya 0x1600045, dan ingin mencari, apa 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
propertinya:
xprop -id 0x1600045
Itulah yang disukai xlsclients
dan xrestop
dilakukan alat .
Sayangnya informasi ini mungkin salah bukan hanya karena prosesnya jahat dan mengubah itu, tetapi juga karena itu buggy. Sebagai contoh setelah beberapa firefox crash / restart saya telah melihat windows yatim (dari plugin flash, saya kira) dengan _NET_WM_PID
menunjuk ke suatu proses, yang sudah lama meninggal.
Cara alternatif adalah dengan menjalankan
xwininfo -root -tree
dan periksa properti orang tua dari jendela yang bersangkutan. Itu juga dapat memberi Anda beberapa petunjuk tentang asal jendela.
Tapi! Meskipun Anda mungkin tidak menemukan proses apa yang telah membuat jendela itu, masih ada cara untuk menemukan dari mana proses itu terhubung ke X-server. Dan itu untuk peretas sejati. :)
Window-id 0x1600045 yang Anda tahu dengan bit yang lebih rendah memusatkan perhatian (yaitu 0x1600000) adalah "basis klien". Dan semua ID sumber daya, dialokasikan untuk klien itu "berdasarkan" di atasnya (0x1600001, 0x1600002, 0x1600003, dll). X-server menyimpan informasi tentang kliennya dalam larik klien [], dan untuk setiap klien "basis" -nya disimpan di klien [i] -> variabel clientAsMask. Untuk menemukan X-socket, yang sesuai dengan klien itu, Anda harus melampirkan ke X-server dengan gdb
, walk over clients [] array, menemukan klien dengan itu clientAsMask
dan mencetak deskriptor socketnya, disimpan dalam ((OsCommPtr) (klien [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
Ketika Anda menemukan soket, Anda dapat memeriksa, siapa yang terhubung, dan akhirnya menemukan prosesnya.
PERINGATAN : JANGAN pasang gdb ke server-X dari DALAM server-X. gdb menunda proses yang dilampirkannya, jadi jika Anda melampirkannya dari dalam sesi-X, Anda akan membekukan X-server Anda dan tidak akan dapat berinteraksi dengan gdb. Anda harus beralih ke terminal teks ( Ctrl+Alt+F2
) atau terhubung ke mesin Anda melalui ssh.
Contoh:
Temukan PID X-server 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
Window id adalah 0x1600045, jadi basis klien adalah 0x1600000. Lampirkan ke server-X dan temukan deskriptor soket klien untuk basis klien itu. Anda perlu menginstal informasi debug untuk X-server (paket -debuginfo untuk distribusi-rpm atau paket -dbg untuk deb's).
$ 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
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 pidnya, "root" adalah tempat pengguna menjalankannya, "31u" adalah deskriptor soket)
Di sana Anda mungkin melihat bahwa klien terhubung melalui TCP, maka Anda dapat pergi ke mesin yang terhubung dari dan memeriksa di netstat -nap
sana untuk menemukan prosesnya. Tetapi kemungkinan besar Anda akan melihat soket unix di sana, seperti yang ditunjukkan di atas, yang berarti itu adalah klien lokal.
Untuk menemukan pasangan untuk soket unix itu, Anda dapat menggunakan teknik MvG
(Anda juga akan memerlukan informasi debug untuk kernel Anda terpasang):
$ sudo gdb -c /proc/kcore
(gdb) print ((struct unix_sock*)0xffff810008339340)->peer
$1 = (struct sock *) 0xffff810008339600
(gdb) quit
Sekarang Anda tahu 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 proses-id 7725
Sunting 2017 : Ada lebih banyak pilihan sekarang seperti yang terlihat di Siapa yang memiliki ujung lain dari soket unix ini? . 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 mencari tahu siapa yang ada di ujung soket pada fd 31 dari proses X-server dengan ID 1237.