通過ActiveProcessLinks遍歷程序

2021-08-14 02:41:24 字數 1943 閱讀 3195

程序的遍歷有多種方法。在應用程式裡可以使用createtoolhelp32snapshot函式先做個程序快照(snapshot),然後通過返回的資料進行遍歷。在核心程式設計裡可以通過核心資料結構來實現。

核心結構eprocess(執行體程序塊 executive process)是乙個不透明(opaque)的結構體,大概意思就是這個結構不對外公開,但是還是可以通過windbg獲取它的各成員名和型別。在win7 32上,eprocess結構體在偏移為0xb8處成員是activeprocesslinks,從字面意思就可以看出來是關於活動程序的鍊錶。核心中常常使用迴圈雙鏈表將相同型別的物件(object)串在一起,便於管理。在了解迴圈雙鏈表之後就可以通過該鍊錶來遍歷程序。

lkd> dt nt!_list_entry

+0x000 flink : ptr32 _list_entry

+0x004 blink : ptr32 _list_entry

list_entry使用時應注意,當該表項是頭節點時,flink指第乙個,blink指最後乙個;當該表項是中間節點時,flink指向下乙個,blink指向前乙個。

lkd> dt nt!_eprocess

+0x000 pcb : _kprocess

+0x098 processlock : _ex_push_lock

+0x0a0 createtime : _large_integer

+0x0a8 exittime : _large_integer

+0x0b0 rundownprotect : _ex_rundown_ref

+0x0b4 uniqueprocessid : ptr32 void

+0x0b8 activeprocesslinks : _list_entry 這個結構裡儲存了兩個eprocess結構裡,activeprocesslinks的位址,有張類似的圖,可以對照看一看。

....(後面還有一大塊沒copy_paste)

實現遍歷的主要**:

ulong addrofthecurrentprocess=

0,addrofthefirstprocess=

0; addrofthefirstprocess=addrofthecurrentprocess=(ulong)iogetcurrentprocess();

dowhile(addrofthecurrentprocess!=addrofthefirstprocess);

iogetcurrentprocess()返回乙個型別為eprocess的指標,該指標指向當前程序的eprocess結構,並用ulong轉換一下。eprocess結構的0x16c偏移出時imagefilename,乙個長度為16的字串陣列,用來存放程序名(如果名字過長怎麼辦呢?還沒發現怎麼辦:))。接下來就是從當前程序的位址到下乙個程序的位址轉換操作:(ulong )(addrofthecurrentprocess+0xb8),得到下乙個eprocess裡activeprocesslinks位址,然後再減去該成員的偏移就是結構體的首位址。(ulong )(addrofthecurrentprocess+0xb8)看上去不對勁呀?怎麼感覺前面的(ulong )抵消呢?來看看,假如addrofthecurrentprocess+0xb8=0x00400100,該位址,儲存另乙個物件的位址。先把它變成指標(實際上都是位址好吧!),(ulong )就得到想要的位址。可能沒講那麼明白,可以去編一編,看看對不對,加深理解。

關於遍歷的結果,因為是在核心第乙個列出的是system,最後乙個列印的亂碼。實際上在命令列下使用tasklist命令得到的結果第乙個是system idle process,它好像沒有名字(悲哀呀)。

通過RestHighLevelClient操作ES

一 查詢相關 在es查詢中,must相當於sql語句中的and,should相當於or。當想要實現類似於 select from table where a and b or c or d 的功能時可以借助於es中的bool。即resthighlevelclient中的boolquerybuilde...

IEEE PDF eXpress 通過方法

ieee pdf express這個東西比較煩人 文章是用latex寫的,生成pdf後始終是不能通過 原因是有些文字無法嵌入到pdf中的,本人之前的解決方法是把所有檔案打包生成zip後上傳,讓ieee來生成pdf 但這次一直不行,不過最後找到了乙個非常簡單的方法 安裝pdfcreater,之後列印生...

如何通過dba hist active sess

背景 在很多情況下,當資料庫發生效能問題的時候,我們並沒有機會來收集足夠的診斷資訊,比如system state dump或者hang analyze,甚至問題發生的時候dba根本不在場。這給我們診斷問題帶來很大的困難。那麼在這種情況下,我們是否能在事後收集一些資訊來分析問題的原因呢?在oracle...