X-sunucu destekliyorsa sürece XResQueryClientIds
gelen X-Kaynak v1.2 uzantısı hiçbir biliyorum kolay yol güvenilir bir süreç kimliği isteyin. Bununla birlikte başka yollar da var.
Önünüzde bir pencere varsa ve henüz kimliğini bilmiyorsanız, onu bulmak kolaydır. Sadece, söz konusu pencerenin yanındaki bir terminali açın, xwininfo
orada çalıştırın ve o pencereye tıklayın. xwininfo
size pencere kimliğini gösterecektir.
Öyleyse, bir pencere kimliği bildiğinizi varsayalım; örneğin, 0x1600045 ve bulmak istediğiniz, ona sahip olan sürecin ne olduğunu.
Bu pencerenin kime ait olduğunu kontrol etmenin en kolay yolu, bunun için XKillClient'i çalıştırmaktır:
xkill -id 0x1600045
ve hangi sürecin yeni öldüğünü görün. Ama sadece onu öldürmeyi sakıncası yoksa elbette!
Kolay ve güvenilmez bir başka yol da özelliklerini _NET_WM_PID
ve WM_CLIENT_MACHINE
özelliklerini kontrol etmektir :
xprop -id 0x1600045
Araçlar böyle yapar xlsclients
ve xrestop
yapar.
Ne yazık ki, bu bilgi yalnızca süreç kötüye gittiği ve bunları değiştirdiği için değil, aynı zamanda buggy nedeniyle de yanlış olabilir. Örneğin, bazı firefox çökmelerinden / yeniden başlattıktan sonra _NET_WM_PID
, uzun zaman önce ölen bir sürece işaret eden artık pencereleri (flash eklentisinden sanırım) gördüm .
Alternatif yol çalıştırmaktır
xwininfo -root -tree
ve söz konusu pencerenin ebeveynlerinin özelliklerini kontrol edin. Bu ayrıca pencere kökenleri hakkında bazı ipuçları verebilir.
Fakat! Bu pencerede hangi işlemin yaratıldığını bulamıyor olsanız da, bu işlemin X-sunucusuna nereden bağlandığını bulmanın bir yolu var. Ve bu şekilde gerçek hackerlar için. :)
Alt bitlerle bildiğiniz pencere kimliği 0x1600045, sıfırlanmış (yani 0x1600000) bir "müşteri tabanı" dır. Ve bu müşteri için tahsis edilen tüm kaynak kimlikleri buna "dayanmaktadır" (0x1600001, 0x1600002, 0x1600003, vb.). X-server müşterileri hakkındaki bilgileri client [] dizisinde saklar ve her istemci için "base" client [i] -> clientAsMask değişkeninde saklanır. Bu müşteriye karşılık gelen X soketini bulmak için, X-sunucuya eklemeniz gdb
, istemciler [] dizisinin üzerinden geçmeniz, bununla istemciyi bulmanız clientAsMask
ve ((OsCommPtr) (istemciler [i) - içinde saklanan soket tanımlayıcısını yazdırmanız gerekir) > osPrivate)) -> fd.
Bağlı birçok X istemcisi olabilir, bu yüzden hepsini manuel olarak kontrol etmemek için bir gdb işlevi kullanalım:
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
Soketi bulduğunuzda, kimin bağlı olduğunu kontrol edebilir ve sonunda işlemi bulabilirsiniz.
UYARI : Gdb'yi X-sunucusuna INSIDE'dan X-server'a bağlamayın. gdb bağlı olduğu işlemi askıya alır, böylece X oturumunun içinden eklerseniz, X sunucunuzu dondurursunuz ve gdb ile etkileşime giremezsiniz. Metin terminaline ( Ctrl+Alt+F2
) geçmeli veya ssh üzerinden makinenize bağlanmalısınız.
Örnek:
X sunucunuzun PID'sini bulun:
$ ps ax | grep X
1237 tty1 Ssl+ 11:36 /usr/bin/X :0 vt1 -nr -nolisten tcp -auth /var/run/kdm/A:0-h6syCa
Pencere kimliği 0x1600045, bu nedenle istemci tabanı 0x1600000. X sunucusuna ekleyin ve bu müşteri tabanı için istemci soketi tanımlayıcısını bulun. X sunucusu için hata ayıklama bilgisine ihtiyacınız olacak (rpm dağıtımları için -debugin paketi veya deb'ler için -dbg paketi).
$ 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
Artık istemcinin bir sunucu soketine 31 bağlı olduğunu biliyorsunuz. Bu soketin lsof
ne olduğunu bulmak için kullanın :
$ sudo lsof -n | grep 1237 | grep 31
X 1237 root 31u unix 0xffff810008339340 8512422 socket
(burada "X", işlem adıdır, "1237", pid, "root", çalıştığı kullanıcı, "31u", soket tanımlayıcısıdır)
Burada istemcinin TCP üzerinden bağlı olduğunu görebilir, daha sonra bağlı olduğu makineye gidebilir netstat -nap
ve işlemi bulmak için orada kontrol edebilirsiniz . Fakat büyük olasılıkla yukarıda gösterildiği gibi orada bir unix soketi göreceksiniz, bu da yerel bir müşteri olduğu anlamına geliyor.
Bu unix soketine bir çift bulmak için MvG'nin tekniğini kullanabilirsiniz
(takılı çekirdeğiniz için hata ayıklama bilgisine de ihtiyacınız olacaktır):
$ sudo gdb -c /proc/kcore
(gdb) print ((struct unix_sock*)0xffff810008339340)->peer
$1 = (struct sock *) 0xffff810008339600
(gdb) quit
Artık müşteri soketini bildiğinize göre, lsof
onu tutan PID'yi bulmak için kullanın :
$ sudo lsof -n | grep 0xffff810008339600
firefox 7725 username 146u unix 0xffff810008339600 8512421 socket
Bu kadar. Bu pencereyi tutan işlem 7725 işlem kimliğiyle "firefox" dur.
2017 Düzenleme : Şimdi bu görüldüğü gibi daha fazla seçenek var. . Linux 3.3 veya üzeri ve lsof
4.89 veya üzeri ile, yukarıdaki 3 ila 5 arasındaki noktaları değiştirebilirsiniz:
lsof +E -a -p 1237 -d 31
Soketin diğer ucunda, X-server işleminin 31. kimliği ile kimliği bulmak için, ID 1237.