Posting ini didasarkan pada saya menyegarkan pengetahuan saya tentang proses di Windows dan terutama didasarkan pada
. Sementara posting itu berfokus pada Windows 32 bit, saya lebih melihat Windows 10 64 bit saya.
Untuk mulai berjalan di daftar proses Windows, kita harus memulai dengan terlebih dahulu mengaktifkan mode kernel debugging pada host kita. Untuk mengaktifkan debugging mode kernel pada Windows 10, saya melakukan hal berikut dalam prompt perintah “Administrator” (cmd.exe).
Setelah komputer di-boot ulang dan saya memulai WinDbg, hal berikutnya adalah melihat seperti apa struktur daftar tertaut ganda.
lkd> dt _LIST_ENTRY nt!_LIST_ENTRY +0x000 Flink : Ptr64 _LIST_ENTRY +0x008 Blink : Ptr64 _LIST_ENTRY
Catatan: untuk mendapatkan bantuan tentang perintah yang saya gunakan, di bilah input jendela “perintah” WinDbg, jalankan “.hh” dan ini akan memunculkan layar bantuan. Setelah di sana, cari perintah Anda untuk mempelajari apa yang mereka lakukan.
Di atas, kita melihat bahwa daftar memiliki dua entri. Salah satunya adalah “Flink” dan yang kedua adalah “Blink”. Untuk memahami bagaimana ini digunakan, kita dapat melihat posting blog berikut tentang “Dasar-dasar Mode Kernel: Daftar Tertaut Windows” dari orang-orang di OSR Online.
Untuk mulai menjalankan daftar, kita perlu menemukan kepala daftar ini. Kita dapat melakukan ini dengan melihat “nt!PsActiveProcessHead”.
lkd> x nt!PsActiveProcessHead fffff800`625ad3b0 nt!PsActiveProcessHead = <no type information>
Dari atas, kita melihat bahwa Active Process Head kita dapat ditemukan di alamat “fffff800`625ad3b0”.
Sekarang kita memiliki penunjuk ke daftar, mari kita lihat apa yang ditunjukkan Flink dan Blink:
lkd> dt _LIST_ENTRY fffff800`625ad3b0 nt!_LIST_ENTRY [ 0xffff998b`c62cb328 - 0xffff998b`e9ae9368 ] +0x000 Flink : 0xffff998b`c62cb328 _LIST_ENTRY [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x008 Blink : 0xffff998b`e9ae9368 _LIST_ENTRY [ 0xfffff800`625ad3b0 - 0xffff998b`e636d368 ]
Baik! Dari atas kita melihat beberapa nilai yang dikembalikan untuk Flink dan Blink. Sekarang mari kita pelajari di mana dalam struktur EPROCESS _LIST_ENTRY untuk “ActiveProcessLinks” ditemukan. Daripada membuat daftar seluruh struktur EPROCESS, saya telah mengambil sedikit jalan pintas dengan menentukan opsi “-y” untuk mendapatkan bidang tertentu.
lkd> dt nt!_EPROCESS -y ActiveProcessLinks +0x2e8 ActiveProcessLinks : _LIST_ENTRY
Untuk membantu mendapatkan kejelasan lebih lanjut, mari kita pilih proses yang sedang berjalan. Untuk melihat daftar proses yang saat ini dikenal oleh Kernel, mari gunakan ekstensi “!process”.
lkd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS ffff998bc62cb040 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001aa002 ObjectTable: ffffd605aca14040 HandleCount: 6914. Image: System .... PROCESS ffff998bd5c3b080 SessionId: 1 Cid: 1858 Peb: baa6893000 ParentCid: 13d8 DirBase: 31d200002 ObjectTable: 00000000 HandleCount: 0. Image: notepad.exe PROCESS ffff998bd6303080 SessionId: 1 Cid: 234c Peb: e97bb99000 ParentCid: 198c DirBase: 3dc400002 ObjectTable: 00000000 HandleCount: 0. Image: firefox.exe ....
Di atas, kita melihat snapshot dari beberapa proses yang dikembalikan dari penggunaan “!process 0 0” saya. Mari kita pilih “notepad.exe” di alamat “ffff998bd5c3b080”
lkd> !process 0xffff998bd5c3b080 0 PROCESS ffff998bd5c3b080 SessionId: 1 Cid: 1858 Peb: baa6893000 ParentCid: 13d8 DirBase: 31d200002 ObjectTable: 00000000 HandleCount: 0. Image: notepad.exe
Sekarang kita memiliki proses di alamat dan mengkonfirmasi itu adalah “notepad.exe”, sekarang mari kita lihat struktur EPROCESS-nya.
lkd> dt nt!_EPROCESS ffff998bd5c3b080 -y ActiveProcessLinks +0x2e8 ActiveProcessLinks : _LIST_ENTRY [ 0xffff998b`d6303368 - 0xffff998b`d3d2c868 ]
Dari atas, seperti yang kita lihat sebelumnya “ActiveProcessLinks” dapat ditemukan di +0x2e8. Oleh karena itu, untuk mengkonfirmasi jika kita mengurangi 0x2e8 dari ffff998bd5c3b080, kita akan sampai ke kepala struktur EPROCESS, mari kita uji teori itu.
lkd> dt nt!_EPROCESS ffff998bd5c3b080-0x2e8 +0x000 Pcb : _KPROCESS +0x2d8 ProcessLock : _EX_PUSH_LOCK +0x2e0 UniqueProcessId : 0xffffd605`b6216ea6 Void +0x2e8 ActiveProcessLinks : _LIST_ENTRY [ 0x00000001`00b60003 - 0xffff998b`d5c3b088 ] +0x2f8 RundownProtect : _EX_RUNDOWN_REF +0x300 Flags2 : 0xd5c3b098 +0x300 JobNotReallyActive : 0y0 +0x300 AccountingFolded : 0y0 +0x300 NewProcessReported : 0y0 .....
Dari atas kita melihat kita berada di puncak struktur EPROCESS. Mari kita lanjutkan untuk melihat bagaimana kita dapat memetakan proses lainnya. Untuk melakukannya, mari kita lakukan seperti Ami dan kembali ke sesuatu yang kita lakukan sebelumnya. Artinya, sekali lagi, cari tahu kepala daftar dengan melihat alamat “PSActiveProcessHead”.
lkd> x nt!PsActiveProcessHead fffff800`625ad3b0 nt!PsActiveProcessHead = <no type information>
Sekali lagi, kita mendapatkan nilai yang kita miliki sebelumnya di “fffff800`625ad3b0”. Sekarang kita memiliki ini, mari kita lihat _LIST_ENTRY sekali lagi.
lkd> dt nt!_LIST_ENTRY fffff800`625ad3b0 [ 0xffff998b`c62cb328 - 0xffff998b`ea802568 ] +0x000 Flink : 0xffff998b`c62cb328 _LIST_ENTRY [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x008 Blink : 0xffff998b`ea802568 _LIST_ENTRY [ 0xfffff800`625ad3b0 - 0xffff998b`e7b2b868 ]
Sekali lagi, nilainya terlihat mirip dengan apa yang kita lihat sebelumnya. Mari gunakan nilai Flink “0xffff998b`c62cb328” untuk mulai menjalankan daftar. Ingat, kita perlu mengurangi “0x2e8” untuk sampai ke awal struktur EPROCESS berikutnya. Mari kita lakukan itu dan ambil “ImageFileName” dan “ActiveProcessLinks” dari proses selanjutnya.
lkd> dt nt!_EPROCESS 0xffff998b`c62cb328-0x2e8 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x000 Flink : 0xffff998b`c636b328 _LIST_ENTRY [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x008 Blink : 0xfffff800`625ad3b0 _LIST_ENTRY [ 0xffff998b`c62cb328 - 0xffff998b`ea78e468 ] +0x450 ImageFileName : [15] "System"
Dari atas kita lihat proses pertama adalah “System”. Kami juga melihat “ActiveProcessLinks.Flink” itu adalah proses selanjutnya, itu di “0xffff998b`c636b328” sedangkan “ActiveProcessLinks.Blink” ada di “0xffffff800`625ad3b0”. Mari kita gunakan logika yang sama yang kita lakukan sebelumnya untuk mempelajari apa proses selanjutnya yang dilihat oleh Kernel setelah proses “Sistem”. Ingatlah untuk sekali lagi mengurangi “0x2e8” dari nilai “ActiveProcessLinks.Flink” yang Anda terima di atas.
lkd> dt nt!_EPROCESS 0xffff998b`c636b328-0x2e8 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x000 Flink : 0xffff998b`d0e97868 _LIST_ENTRY [ 0xffff998b`da09e868 - 0xffff998b`c636b328 ] +0x008 Blink : 0xffff998b`c62cb328 _LIST_ENTRY [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x450 ImageFileName : [15] "Registry"
Di atas, kita melihat proses selanjutnya adalah “Registry”. Mari lakukan dua contoh lagi untuk melihat apakah pola ini berlanjut.
lkd> dt nt!_EPROCESS 0xffff998b`d0e97868-0x2e8 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`da09e868 - 0xffff998b`c636b328 ] +0x000 Flink : 0xffff998b`da09e868 _LIST_ENTRY [ 0xffff998b`d085b868 - 0xffff998b`d0e97868 ] +0x008 Blink : 0xffff998b`c636b328 _LIST_ENTRY [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x450 ImageFileName : [15] "smss.exe"
… dan akhirnya untuk Flink …
lkd> dt nt!_EPROCESS 0xffff998b`da09e868-0x2e8 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`d085b868 - 0xffff998b`d0e97868 ] +0x000 Flink : 0xffff998b`d085b868 _LIST_ENTRY [ 0xffff998b`d0859868 - 0xffff998b`da09e868 ] +0x008 Blink : 0xffff998b`d0e97868 _LIST_ENTRY [ 0xffff998b`da09e868 - 0xffff998b`c636b328 ] +0x450 ImageFileName : [15] "csrss.exe"
Terlihat bagus sejauh ini. Mari kita verifikasi ini dengan melihat ekstensi “!process”.
kd> !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS ffff998bc62cb040 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 DirBase: 001aa002 ObjectTable: ffffd605aca14040 HandleCount: 7052. Image: System PROCESS ffff998bc636b040 SessionId: none Cid: 0060 Peb: 00000000 ParentCid: 0004 DirBase: 1e0c00002 ObjectTable: ffffd605aca28c00 HandleCount: 0. Image: Registry PROCESS ffff998bd0e97580 SessionId: none Cid: 01d4 Peb: 65129c2000 ParentCid: 0004 DirBase: 296d10002 ObjectTable: ffffd605af644540 HandleCount: 52. Image: smss.exe PROCESS ffff998bda09e580 SessionId: 0 Cid: 02a8 Peb: 705bc80000 ParentCid: 028c DirBase: 199900002 ObjectTable: ffffd605ae720c00 HandleCount: 756. Image: csrss.exe PROCESS ffff998bd085b580 SessionId: 0 Cid: 0304 Peb: 3aa038000 ParentCid: 028c DirBase: 45bc00002 ObjectTable: ffffd605af212380 HandleCount: 155. Image: wininit.exe PROCESS ffff998bd0859580 SessionId: 1 Cid: 030c Peb: 5e45a62000 ParentCid: 02f8 DirBase: 334200002 ObjectTable: ffffd605aea12680 HandleCount: 1213. Image: csrss.exe PROCESS ffff998bda3ea480 SessionId: 0 Cid: 0354 Peb: a3794a6000 ParentCid: 0304 DirBase: 19a00002 ObjectTable: ffffd605afc25e80 HandleCount: 847. Image: services.exe PROCESS ffff998bd85e8580 SessionId: 0 Cid: 0368 Peb: 6c5042e000 ParentCid: 0304 DirBase: 107a00002 ObjectTable: ffffd605afd3b8c0 HandleCount: 1749. Image: lsass.exe PROCESS ffff998bd8e25080 SessionId: 1 Cid: 03a4 Peb: 35e2b86000 ParentCid: 02f8 DirBase: 46a800002 ObjectTable: ffffd605b091f600 HandleCount: 256. Image: winlogon.exe .... PROCESS ffff998bea2e4580 SessionId: 1 Cid: 26cc Peb: 1002d1000 ParentCid: 0f34 DirBase: 4a700002 ObjectTable: ffffd605b9b0a040 HandleCount: 142. Image: SystemIdleCheck.exe PROCESS ffff998bf5ea0380 SessionId: 0 Cid: 27ac Peb: ce9260a000 ParentCid: 0354 DirBase: 61900002 ObjectTable: ffffd605c637b680 HandleCount: 192. Image: WmiApSrv.exe
Cuplikan di atas terlihat cocok dengan apa yang telah kita pelajari sejauh ini. Saya percaya jika kita melanjutkan pola ini, kita akan dapat berjalan di atas pohon dan mengidentifikasi semua proses melalui Flink. Namun, kami tidak memverifikasi Blink. Mari kita uji beberapa di antaranya sebelum kita melanjutkan.
Percaya atau tidak, itu sama seperti yang kami lakukan di atas. Satu-satunya perbedaan adalah alih-alih menggunakan alamat di Flink, kami malah menggunakan alamat di Blink.
Mari kita lihat proses “Registry” untuk melihat apa yang ditunjuknya melalui Blink-nya.
lkd> !process ffff998bc636b040 0 PROCESS ffff998bc636b040 SessionId: none Cid: 0060 Peb: 00000000 ParentCid: 0004 DirBase: 1e0c00002 ObjectTable: ffffd605aca28c00 HandleCount: 0. Image: Registry
Mari kita lihat “ActiveProcessLinks.Flink” dan “ActiveProcessLinks.Blink” -nya.
lkd> dt nt!_EPROCESS ffff998bc636b040 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x000 Flink : 0xffff998b`d0e97868 _LIST_ENTRY [ 0xffff998b`da09e868 - 0xffff998b`c636b328 ] +0x008 Blink : 0xffff998b`c62cb328 _LIST_ENTRY [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x450 ImageFileName : [15] "Registry"
Jika sekarang kita melihat nilai Blink untuk melihat di mana ia menunjuk, kita melihat bahwa kita mendapatkan:
lkd> dt nt!_EPROCESS 0xffff998b`c62cb328-0x2e8 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x000 Flink : 0xffff998b`c636b328 _LIST_ENTRY [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x008 Blink : 0xfffff800`625ad3b0 _LIST_ENTRY [ 0xffff998b`c62cb328 - 0xffff998b`ea5a35a8 ] +0x450 ImageFileName : [15] "System"
Bagus!!! Seperti yang diharapkan, “Registry” Blink menunjuk ke proses sebelumnya dalam daftar yaitu “System”. Mari kita lihat satu lagi. Sekali lagi, mengingat apa yang kita lihat sebelumnya, mari kita lihat proses “smss.exe” untuk melihat di mana titik itu. Jika semua berjalan sesuai rencana, Blink-nya harus menunjuk ke “Registry”. Mari kita lihat apakah ini benar.
lkd> !process ffff998bd0e97580 0 PROCESS ffff998bd0e97580 SessionId: none Cid: 01d4 Peb: 65129c2000 ParentCid: 0004 DirBase: 296d10002 ObjectTable: ffffd605af644540 HandleCount: 52. Image: smss.exe
Mari kita lihat “ActiveProcessLinks.Flink” dan “ActiveProcessLinks.Blink” -nya.
lkd> dt nt!_EPROCESS ffff998bd0e97580 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`da09e868 - 0xffff998b`c636b328 ] +0x000 Flink : 0xffff998b`da09e868 _LIST_ENTRY [ 0xffff998b`d085b868 - 0xffff998b`d0e97868 ] +0x008 Blink : 0xffff998b`c636b328 _LIST_ENTRY [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x450 ImageFileName : [15] "smss.exe"
Sekarang mari kita uji nilai Blink dari “0xffff998b`c636b328” untuk melihat di mana ia menunjuk.
lkd> dt nt!_EPROCESS 0xffff998b`c636b328-0x2e8 -y ActiveProcessLinks.Flink -y ActiveProcessLinks.Blink -y ImageFileName +0x2e8 ActiveProcessLinks : [ 0xffff998b`d0e97868 - 0xffff998b`c62cb328 ] +0x000 Flink : 0xffff998b`d0e97868 _LIST_ENTRY [ 0xffff998b`da09e868 - 0xffff998b`c636b328 ] +0x008 Blink : 0xffff998b`c62cb328 _LIST_ENTRY [ 0xffff998b`c636b328 - 0xfffff800`625ad3b0 ] +0x450 ImageFileName : [15] "Registry"
Bagus!! Sangat bagus!!! Jadi kami mengonfirmasi bahwa Flink dan Blink masing-masing menunjuk ke struktur proses selanjutnya dan struktur sebelumnya.
Sekarang untuk gambar di bawah ini. Gambar di bawah ini merupakan snapshot dari apa yang kita lihat di atas. Namun, saya tidak memetakan semua proses tetapi konsepnya tetap sama.
Yah harap Anda menikmati posting ini.
Seperti biasa, tinggalkan komentar jika menurut Anda saya melewatkan sesuatu.
Referensi:
http://jumpdollar.blogspot.com/2014/09/windbg-walking-windows-linked-lists.html
http://www.osronline.com/article.cfm?article=499
https://www.blackhat.com/presentations/win-usa-04/bh-win-04-butler.pdf