這篇文章比較特殊,是一篇穿插答疑文章,由于剛好在前一篇教程《驅動開發:內核列舉PspCidTable句柄表》整理了列舉句柄表的知識點,正好這個知識點能解決一個問題,事情是這樣的有一個粉絲求助了一個問題,想要列舉出驅動中活動的執行緒資訊,此功能我并沒有嘗試過當時也只是說了一個大致思路,今天想具體聊一聊這個話題,也想聊一聊自己對粉絲們的想法,

首先因為我的人生經歷比較特殊,我經歷過無法求知的困境,深知一個人在沒有任何人指點的情況下去研究技術是多么的折磨人,所以在某些情況下只要你關注了我,我也會盡自己最大可能去幫助大家,即便是當時沒有解決這個問題我也會記下來,只要能被解決我一定會第一時間告訴粉絲,但也希望大家不要遇到困難關注我,解決困難取消關注,這樣我覺得很不地道,
好了步入正題,這個列舉驅動內的執行緒我們無法用傳統的API去列舉,原因很簡單你拿不到行程的EPROCESS結構,或者說他這個驅動程式本身就是系統的一部分根本就沒有行程ID的概念,由于我一直沒有嘗試這個需求,所以當時對粉絲說的是通過PEB來拿到,但這個方法其實關鍵就在于,以我目前的知識儲備無法拿到驅動的EPROCESS結構,

然后干脆就直接列舉出整個系統所有的行程與執行緒資訊,例如上一篇文章中提到的列舉句柄表,打開ARK工具找到所需查詢的執行緒,會發現他有一個ETHREAD結構,

我們直接在列舉串列中查詢以下看看,你會發現所有句柄表執行緒中是存在這個ETHREAD結構,

但是這個是全域的,無法得到它屬于哪個驅動模塊,這就很尷尬了,
你或許靈機一動,我直接得到ETHREAD資訊,從里面找EPROCESS,再從里面找行程名,但跟到最后你會發現它顯示的是SYSTEM行程,小丑竟是你自己,
這里只能用笨辦法,首先執行緒ETHREAD地址是0xFFFF9C02B2DCC540抹掉最后三位0xFFFF9C02B2DCC000,

然后看看驅動串列中的0xFFFF9C02B2DCC060同樣抹掉最后三位是0xFFFF9C02B2DCC000,這兩個地址相差不大甚至說就是一摸一樣,

我不知道別人的ARK工具是怎么實作的,但是我目前能想到的辦法只能是這一種笨辦法,兩者作比較相差在一個誤差以內就說明是行程內的子執行緒,
這樣我們首先列舉的是驅動完整資訊,然后在和執行緒作比較,從而判斷或者說歸檔,將某一些子執行緒歸類到某個驅動程式上面,代碼我就不寫了,再寫也是重復的東西,前面的文章中都有代碼,自己拼湊一下就可以實作的功能,
文章作者:lyshark (王瑞)文章出處:https://www.cnblogs.com/LyShark/p/16796956.html
著作權宣告:本博客文章與代碼均為學習時整理的筆記,文章 [均為原創] 作品,轉載請 [添加出處] ,您添加出處是我創作的動力!
轉載文章請遵守《中華人民共和國著作權法》相關法律規定或遵守《署名CC BY-ND 4.0國際》規范,合理合規攜帶原創出處轉載!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514987.html
標籤:C++
上一篇:The Semantics of Constructors
下一篇:C++ Null 指標的使用
