?好久沒有寫博客了,最近抽時(shí)間把這些雜碎零散的知識(shí)梳理下來,分享給更多朋友去找樂子,在草稿箱里面仍了好幾天忘發(fā)了。
接下來談?wù)劚酒黝},隱藏兩字。
一、隱藏意味著什么?
不想被人發(fā)現(xiàn)唄,人性如此,亦是如此。
二、為什么要隱藏?
其實(shí)個(gè)人覺著這是根本,好好寫個(gè)程序你為什么要隱藏自己的進(jìn)程、線程?為啥?無非你不想讓別人知道,或者不該讓別人知道。windwos下有很多未公開的東西,這是隱藏。面對(duì)對(duì)象程序設(shè)計(jì)封裝性,這也是隱藏。有些病毒,其實(shí)叫惡意代碼更為親切一些,更喜歡隱藏或者依附正常的進(jìn)程來達(dá)到欺騙電腦,欺騙殺毒軟件,這都是隱藏。對(duì)有些不可告人的秘密。
三、對(duì)于進(jìn)程隱藏能欺騙殺毒軟件?或者系統(tǒng)監(jiān)控工具?
至少目前我沒有見過靠隱藏進(jìn)程就可以瞞天過海,不代表沒有,格局有限.....,隱藏進(jìn)程后,windows系統(tǒng)自帶的任務(wù)管理器已經(jīng)看不到進(jìn)程的身影,但是隨便找一個(gè)ARK就可以看到隱藏的進(jìn)程,還可以使用procexp或者火絨劍等工具去查看,為什么隱藏了進(jìn)程這些工具仍然可以找到?
四、淺談隱藏進(jìn)程
因?yàn)閣indows用戶層,就是任務(wù)管理器是依賴于鏈表結(jié)構(gòu)(_LIST_ENTRY)遍歷操作系統(tǒng)下有哪些進(jìn)程,其實(shí)早些時(shí)候不懂widnows下鏈表重要性(當(dāng)時(shí)自己學(xué)數(shù)據(jù)結(jié)構(gòu)都說windows下雙向鏈表、樹很重要),后來才知道,嗯其實(shí)不依賴winAPI來做自己想做的事情,真的很重要。雙向鏈表請(qǐng)看以前的博客雙向鏈表:https://blog.51cto.com/13352079/2128624
創(chuàng)建進(jìn)程的時(shí)候會(huì)填充結(jié)構(gòu)體_EPROCESS(看雪論壇搜索一下有詳細(xì)的創(chuàng)建過程),這樣我們_EPROCESS里面就有數(shù)據(jù)與內(nèi)容了,關(guān)于這個(gè)結(jié)構(gòu)體不同操作系統(tǒng)數(shù)據(jù)有可能會(huì)不一樣,windbg里面輸入: dt _EPROCESS 即可查看結(jié)構(gòu)體內(nèi)容與偏移。
windows內(nèi)核分為、執(zhí)行體、微內(nèi)核、HAL(最底層),_EPROCESS是屬于執(zhí)行體層,包含進(jìn)程創(chuàng)建信息、I/O、安全、句柄表、虛擬內(nèi)存等等,有意思的是里面內(nèi)嵌了一個(gè)(偏移0)_KPROCESS,他屬于微內(nèi)核層,用來線程配額、調(diào)用還有優(yōu)先級(jí)等信息。
我們重點(diǎn)來說一下_EPROCESS中的ActiveProcessLink,光看名字就知道活動(dòng)進(jìn)程鏈,如下圖所示。
這個(gè)就是隱藏進(jìn)程的關(guān)鍵,他是一個(gè)雙向循環(huán)鏈表,我們可以通過鏈表去遍歷整個(gè)系統(tǒng)進(jìn)程,對(duì)就是呢么簡(jiǎn)單,如下圖所示:
更多結(jié)構(gòu)體信息請(qǐng)看(我非常喜歡的一位筆者,他翻譯國外一些文章很嚴(yán)謹(jǐn)且詳細(xì)),貼下地址:https://bbs.pediy.com/thread-223858.htm 里面有對(duì)EPROCESS等常用的結(jié)構(gòu)體詳細(xì)介紹,強(qiáng)烈推薦,也許你有些疑惑,如果你認(rèn)真看完上面鏈接知識(shí),你的疑惑將在他的文章里找到答案。
五、實(shí)現(xiàn)?為什么要實(shí)現(xiàn)?
其實(shí)我以前也這思考、這些東西你為什么要去學(xué)?為什么要去做?我無從答案。好奇心?專研?熱愛?但是不可否認(rèn)當(dāng)你認(rèn)真的做了這些事情之后,你有所收獲,有所進(jìn)步。也許當(dāng)你再一次看到procexp或者火絨劍可以把那些隱藏的進(jìn)程遍歷出來的時(shí)候,你心里知道可以暴力枚舉或者檢測(cè)恢復(fù)斷鏈自己也可以實(shí)現(xiàn),原來這些都是可能的,這樣做都是可以的。
如果你會(huì)雙向鏈表,刪除一個(gè)節(jié)點(diǎn)對(duì)你來說不值一提,如果不會(huì)我希望你們?nèi)ズ煤脤W(xué)習(xí)一下,學(xué)而用,這才是知識(shí)。如果你想恢復(fù)隱藏的進(jìn)程(原來的節(jié)點(diǎn)位置),記得保存“鄰居的指針地址”。
最后2019年,祝大家新的一年新生活,19年愿世人都能喝上一碗熱粥。
10年積累的成都網(wǎng)站制作、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有廣水免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
源代碼展示如下:
用戶層與驅(qū)動(dòng)層頭文件都需要包含:
#define CTL_PROCESS_HIDE \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS)
#define CTL_PROCESS_REST \
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_NEITHER, FILE_ANY_ACCESS)
以上是定義的控制碼,用于3環(huán)到零環(huán)內(nèi)核編程功能控制
驅(qū)動(dòng)層:
#include "HideHeader.h"
VOID UnLoadDriver(PDRIVER_OBJECT pDriverObj);
/*----------------聲明---------------------*/
NTSTATUS DefualtFunCtion(DEVICE_OBJECT* pDeviceObj, IRP* irp);
NTSTATUS ControlCode(DEVICE_OBJECT* pDeviceObj, IRP *irp);
NTSTATUS HideProcess(char* HideName);
NTSTATUS RestoreProcess(char* RestorName);
/*---------------入口點(diǎn)---------------------*/
NTSTATUS DriverEntry(DRIVER_OBJECT* pDriverObj, UNICODE_STRING* RegistryPath)
{
UNREFERENCED_PARAMETER(RegistryPath);
// DbgBreakPoint();
// 初始化設(shè)備對(duì)象與符號(hào)對(duì)象(暴露給3環(huán)使用)
UNICODE_STRING DeviceName;
UNICODE_STRING SymbolicLinkName;
DEVICE_OBJECT* pDeviceObj = NULL;
NTSTATUS nStatus = STATUS_SUCCESS;
RtlInitUnicodeString(&DeviceName, L"\\Device\\HideProcess");
RtlInitUnicodeString(&SymbolicLinkName, L"\\DosDevices\\SymbolicLinkName");
// 創(chuàng)建設(shè)備對(duì)象
nStatus = IoCreateDevice(pDriverObj, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, 0, &pDeviceObj);
if (FALSE == NT_SUCCESS(nStatus))
{
KdPrint(("IoCreateDevice Failuer!"));
return nStatus;
}
// 設(shè)置通訊方式(0~3環(huán)),這里使用直接IO
pDriverObj->Flags = DO_DIRECT_IO;
// 創(chuàng)建符號(hào)對(duì)象
nStatus = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);
if (FALSE == NT_SUCCESS(nStatus))
{
KdPrint(("IoCreateSymboLicLink failuer!"));
return nStatus;
}
// 初始化派遣函數(shù)
for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
pDriverObj->MajorFunction[i] = DefualtFunCtion;
}
// 處理派遣函數(shù)及卸載
pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlCode;
pDriverObj->DriverUnload = UnLoadDriver;
return STATUS_SUCCESS;
}
/*----------------實(shí)現(xiàn)---------------------*/
NTSTATUS ControlCode(DEVICE_OBJECT* pDeviceObj, IRP *irp)
{
DbgBreakPoint();
UNREFERENCED_PARAMETER(pDeviceObj);
NTSTATUS nStatus = STATUS_SUCCESS;
// 獲取irp棧信息
PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(irp);
DbgBreakPoint();
// 獲取控制碼
ULONG uControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
// 獲取Out緩沖區(qū)
// pOutBuffer = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
switch (uControlCode)
{
case CTL_PROCESS_HIDE:
{
/*兼容性有欠缺,因?yàn)闆]有檢測(cè)當(dāng)前運(yùn)行環(huán)境,PEPROCESS結(jié)構(gòu)體偏移可能不準(zhǔn)確*/
HideProcess("notepad.exe");
}
break;
case CTL_PROCESS_REST:
{
RestoreProcess("notepad.exe");
}
break;
default:
break;
}
irp->IoStatus.Information = 0;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(irp, IO_NO_INCREMENT);
return nStatus;
}
NTSTATUS DefualtFunCtion(DEVICE_OBJECT* pDeviceObj, IRP* irp)
{
UNREFERENCED_PARAMETER(pDeviceObj);
// 完成狀態(tài)
irp->IoStatus.Status = STATUS_SUCCESS;
// 完成字節(jié)
irp->IoStatus.Information = 0;
// 處理irp
IoCompleteRequest(irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
VOID UnLoadDriver(PDRIVER_OBJECT pDriverObj)
{
// 寫成PDRIVER_OBJECT 強(qiáng)轉(zhuǎn)的時(shí)候方便
UNICODE_STRING DeleteSymName;
PDEVICE_OBJECT NextDriverObj = NULL;
PDEVICE_OBJECT CurrDriverObj = NULL;
// 先刪除符號(hào)對(duì)象刪除設(shè)備對(duì)象
RtlInitUnicodeString(&DeleteSymName, L"\\DosDevices\\SymbolicLinkName");
// 刪除符號(hào)對(duì)象
IoDeleteSymbolicLink(&DeleteSymName);
CurrDriverObj = pDriverObj->DeviceObject;
// 可能有多個(gè)設(shè)備對(duì)象
while (CurrDriverObj != NULL) {
NextDriverObj = CurrDriverObj->NextDevice;
IoDeleteDevice(CurrDriverObj);
CurrDriverObj = NULL;
CurrDriverObj = NextDriverObj;
}
return;
}
// 隱藏進(jìn)程
NTSTATUS HideProcess(char* HideName)
{
// 用到的變量
LIST_ENTRY* ListCurrProc = NULL;
LIST_ENTRY* LinkListTemp = NULL;
PEPROCESS pEprocess = NULL;
// 獲取到EPROCESS結(jié)構(gòu)體中ActiveProcessLink 本機(jī)環(huán)境win7 x64 偏移為0xb8
// 其實(shí)調(diào)用的IoGetCurrentProcess
pEprocess = PsGetCurrentProcess();
// 獲取ActiveProcessLinks
ListCurrProc = (LIST_ENTRY *)((ULONG)pEprocess + 0xb8);
// 下一個(gè)指針賦值
LinkListTemp = ListCurrProc;
// ULONG Te = 0; 測(cè)試使用臨時(shí)變量
// 循環(huán)找到隱藏進(jìn)程
while (ListCurrProc != LinkListTemp->Flink)
{
// 調(diào)試信息輸出
// Te = ((ULONG)LinkListTemp - 0xb8 + 0x16c);
// KdPrint(("%s\n\n\n", Te));
// 本該是0x16c是ImageFileName 但是用的鏈表位置 所以是 0x16c - 0xb8
if (0 == strcmp((char *)((ULONG)LinkListTemp - 0xb8 + 0x16c), HideName))
{
// DbgBreakPoint();
// 雙向鏈表應(yīng)該很熟悉了 Previous <--> Curr <--> Next 變成 Previous <--> Next
(LinkListTemp->Blink)->Flink = ListCurrProc->Flink;
(LinkListTemp->Flink)->Blink = ListCurrProc->Blink;
LinkListTemp->Blink = NULL;
LinkListTemp->Flink = NULL;
KdPrint(("Sucess Hide Process!"));
break;
}
LinkListTemp = LinkListTemp->Flink;
}
return STATUS_SUCCESS;
}
// 恢復(fù)進(jìn)程(沒有去實(shí)現(xiàn))
NTSTATUS RestoreProcess(char* RestorName)
{
UNREFERENCED_PARAMETER(RestorName);
// 枚舉當(dāng)前進(jìn)程名稱,獲取到進(jìn)程,判斷鏈表中是否存在(循環(huán)),否則插入鏈表之中
return STATUS_SUCCESS;
}
用戶層:
int main()
{
HANDLE hDriver = INVALID_HANDLE_VALUE;
hDriver = CreateFile(L"\\??\\SymbolicLinkName",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hDriver == INVALID_HANDLE_VALUE)
{
if (GetLastError() == 2)
printf("錯(cuò)誤碼(2):系統(tǒng)找不到指定的文件\n");
}
else
printf("驅(qū)動(dòng)成功加載\n");
DWORD dSize = 0;
// 發(fā)送隱藏進(jìn)程信息到零環(huán) 這里可以三環(huán)控制因?yàn)闇y(cè)試方便就不進(jìn)行測(cè)試,所以參數(shù)為NULL
// 如果使用控制碼 第三個(gè)參數(shù)傳入驅(qū)動(dòng)層的緩沖區(qū)指針(需要傳入什么),第四個(gè)參數(shù)是傳入大小
// 第5個(gè)參數(shù)是接收(0環(huán)發(fā)來的信息),大小,dSize是0環(huán)返回的大小
DeviceIoControl(hDriver, CTL_PROCESS_HIDE, NULL, 0, NULL, 0, &dSize, NULL);
system("pause");
CloseHandle(hDriver);
return 0;
}
網(wǎng)站題目:說說windows內(nèi)核中為什么要隱藏進(jìn)程?
地址分享:http://chinadenli.net/article10/gsgjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)、外貿(mào)建站、云服務(wù)器、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)