隱藏程序通常出現在惡意程式中,隱藏的程序能讓任務管理器、procexp等3環的程式無法找到它,那麼如何實現隱藏程序呢?
由於對這方面還是很感興趣,今天就來研究一下核心層的隱藏程序,首先在使用者層3環,如任務管理器、procexp遍歷程序都是使用createtoolhelp32snapshot()api建立快照遍歷查詢的,使用快照的api在核心中就是通過訪問乙個雙向鍊錶的資料結構來得到每乙個程序的資訊的,那麼我們只要把需要隱藏的程序資訊從這個鍊錶中乾掉,就能完成隱藏的目的。
每個程序在核心中都有乙個核心物件,核心物件的資訊被儲存在乙個名為_eprocess的結構體中,首先進行雙機除錯,在這我除錯的是win7虛擬機器,在windbg偵錯程式中輸入dt _eprocess指令即可檢視_eprocess結構體
在這裡要注意的是偏移0xb8的乙個字段:
+0x0b8 activeprocesslinks : _list_entry
這個字段記錄的就是當前系統上的活動程序鍊錶, 通過遍歷這條鍊錶就能得到當前系統上的所有程序。
在隱藏程序時還需要關注的乙個欄位是在偏移為0x16c處的乙個字段:
+0x16c imagefilename : [15] uchar
這個字段記錄的當前程序的名稱字串的位址。
當然上面這兩個的字段的偏移並不是固定的,在不同版本的系統中偏移有可能不同,所以使用時要檢視該系統的字段偏移。
_list_entry是乙個雙向鍊錶,分別指向下一節點和上一節點
系統通過這個鍊錶把每個程序都鏈結在了一起,假設現在系統中只有3個程序,那麼鏈結關係大體如下圖
那麼從上圖中可以看出只要操作_list_entry這個雙向鍊錶,我們就可以遍歷系統上的全部程序。在隱藏程序中,我們只要通過鍊錶操作,對比程序名稱,找到我們想隱藏的程式,把它從這個鍊錶中刪除。
在這通過乙個巨集:
psgetcurrentprocess()
作用是可獲取當前程序的核心物件,可得到當前第乙個節點。主要**如下
//程序名稱
char* procname = null;
procname = (char*)pinputbuff;
//獲取當前程序物件
peprocess nowproc = psgetcurrentprocess();
//獲取程序物件內的當前活動程序鍊錶
list_entry* pnowlist = (list_entry*)((ulong)nowproc + 0xb8);
//臨時鍊錶
list_entry* ptemplist = pnowlist;
//遍歷鍊錶
while (pnowlist != ptemplist->flink)
ptemplist = ptemplist->flink;
}
親測有效,我隱藏的是記事本notepad.exe,在任務管理器中確實找不到這個程序,在procexp也沒有,見圖
使用核心級工具pchunter檢視程序
上圖pchunter中notepad.exe確實存在,還把該程式標稱紅色,說明是危險程式,因為pchunter檢測出他是隱藏的程式所以標紅,這也說明pchunter功能非常強大!
到此核心版隱藏程序就成功了,但它並不就是無敵了,pchunter能找到隱藏的程序的因為它遍歷程序方法與任務管理器的方式不同,它是通過核心級api進行暴力列舉,通過pslookupprocessbyprocessid這個api,其原理是輸入乙個pid返回該程序的eprocess結構的引用指標,那麼for迴圈假設給定pid是遍歷0~10萬,那麼pid只要在這個範圍的的程序就無所遁形都會被找出來,這就是傳說中的暴力列舉程序!
核心層:
#include #define ioctl_base 0x800
#define my_ctl_code(code) \
ctl_code( \
file_device_unknown, \
ioctl_base+(code), \
method_out_direct, \
0 \)#define df_get_proc_hide my_ctl_code(7)
//解除安裝驅動
void unload(driver_object* obj)
ntstatus increate(device_object *device, irp *irp);
ntstatus inclose(device_object *device, irp *irp);
ntstatus devicectrl(device_object* device, irp* irp);
//驅動入口
ntstatus driverentry(driver_object* driver, unicode_string* path)
ntstatus increate(device_object *device, irp *irp)
ntstatus inclose(device_object *device, irp *irp)
//通過控制碼方式通訊
ntstatus devicectrl(device_object* device, irp* irp)
ptemplist = ptemplist->flink;
} }break;
irp->iostatus.status = status_success;
irp->iostatus.information = inputsize;
iocompleterequest(irp, io_no_increment);
return status;
}
使用者層:
#include #define ioctl_base 0x800
#define my_ctl_code(code) \
ctl_code( \
file_device_unknown, \
ioctl_base+(code), \
method_out_direct, \
0 \)#define df_get_proc_hide my_ctl_code(7)
//隱藏程序
void hideproc(handle hsys, dword size)
; int inputsize = strlen("notepad.exe") + 1;
memcpy(pbuff, "notepad.exe", inputsize);
//呼叫裝置控制碼函式
bool nret = deviceiocontrol(
hsys,
df_get_proc_hide,
(lpvoid)pbuff,
inputsize,
null,
0,&size,
null);
if (!nret)
printf("隱藏程式成功!\n");}
int main()
else printf("開啟驅動成功\n");
dword size = 0;
//呼叫隱藏程序函式
hideproc(hsys, size);
getchar();
closehandle(hsys);
}
Linux程序隱藏問題 顯示隱藏程序
阿里云云監控到有兩台redis伺服器cpu被某程序消耗400 cpu資源 系統檢視top 情況並未找到高消耗程序x7但cpu100 ni netstat 查詢到了一些異常請求,初步判斷出元件被提權入侵了 嘗試查詢異常程序x7關聯的檔案,排查還在 etc hosts發現增加了如下異常對映,檢視相關異常...
修改linux核心達到隱藏程序目的 2 6 28
修改linux核心達到隱藏程序目的 2.6.28 要求 高階作業系統與分布式系統作業 ps和top 命令列出了 unix 中當前所有程序的相關資訊,作業要求在linux中增加兩個系統呼叫,功能如下 hide 執行此系統呼叫後,隱藏當前程序,即當前程序不能夠被ps和top命令檢視到。unhide 執行...
WinNT下 真正隱藏程序
面對眾多的計算機高手,考慮許久,終於還是決定出來獻醜一下,文章內盡量使用最簡潔易懂的詞彙及例子來介紹,希望能夠對一些初學與高階者有所幫助。關於程序的隱藏,98下的例子數不勝數。winnt win2k下的隱藏方法,西祠的高手shotgun在去年的6月就已經在網上發布出例項 揭開木馬的神秘面紗 四 我也...