日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

64位内核第二讲,进程保护之对象钩子

發(fā)布時間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 64位内核第二讲,进程保护之对象钩子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

         64位內(nèi)核第二講,進(jìn)程保護(hù).

一丶什么是保護(hù).

什么是保護(hù).?比如我們安裝了xxx殺毒軟件.那么此時你用任務(wù)管理器關(guān)閉.是關(guān)閉不了的.原因是內(nèi)核已經(jīng)做了保護(hù).

那么去掉保護(hù)的前提就是你要給自己的軟件做保護(hù).

比如我們給計算器做保護(hù).?例如下圖.

做保護(hù).以前的病毒作者.都是想要退出xxx殺毒軟件.?什么方法都能做.?所以殺軟為了防止這一情況發(fā)生,直接把打開進(jìn)程的API進(jìn)行HOOK即可.

但是別忘了.還可以拷貝句柄.所以殺軟防不住.只能在內(nèi)核做保護(hù).

二丶給軟件添加保護(hù)熟悉API和結(jié)構(gòu)體

給軟件添加保護(hù)很簡單.?也是調(diào)用API進(jìn)行操作.

API:

  ObRegisterCallbacks? 注冊進(jìn)程和線程處理回調(diào)

NTSTATUS ObRegisterCallbacks(IN POB_CALLBACK_REGISTRATION CallBackRegistration,OUT PVOID *RegistrationHandle);

第一個是個結(jié)構(gòu)體,我們想要進(jìn)行的操作都放在這個結(jié)構(gòu)中

第二個是個二級指針,我們給一個即可

?

結(jié)構(gòu)體:

typedef struct _OB_CALLBACK_REGISTRATION {__in USHORT Version;                  //版本號__in USHORT OperationRegistrationCount;       //回調(diào)個數(shù). 可以一次蹙著多個回調(diào). 和最后一個參數(shù)綁定的. 如果一次注冊多個.則最后一個參數(shù)需要給數(shù)組保存,最后參數(shù)是一個結(jié)構(gòu)體.__in UNICODE_STRING Altitude;            // 指定的驅(qū)動程序的Uncode字符串. 可以看WDK文檔給.__in PVOID RegistrationContext;           // 回調(diào)函數(shù)的參數(shù).如果你給可以在這里給.__in OB_OPERATION_REGISTRATION *OperationRegistration;//回調(diào)函數(shù)信息結(jié)構(gòu)體,如果個數(shù)有多個,你需要定義為數(shù)組. } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;

?

結(jié)構(gòu)體中回調(diào)函數(shù)結(jié)構(gòu)體.

typedef struct _OB_OPERATION_REGISTRATION {__in POBJECT_TYPE *ObjectType;        //對象的類型.你注冊回調(diào)函數(shù)的類型 PsProcessType 和 PsThreadType 分別是進(jìn)程回調(diào)和線程回調(diào).__in OB_OPERATION Operations;         //注冊回調(diào)的操作方式, 一個是創(chuàng)建進(jìn)程. 一個是拷貝進(jìn)程句柄. OB_OPERATION_HANDLE_CREATEA ,OB_OPERATION_HANDLE_DUPLICATE?__in POB_PRE_OPERATION_CALLBACK PreOperation;//創(chuàng)建之前回調(diào)函數(shù)的地址,在這里給. 每一個回調(diào)都包含什么信息在這個結(jié)構(gòu)體中給出.__in POB_POST_OPERATION_CALLBACK PostOperation;//創(chuàng)建之后回調(diào)函數(shù)的地址. 和上面不一樣,一個是創(chuàng)建之前,你的回調(diào)回來,一個是創(chuàng)建之后你的回調(diào)函數(shù)回來. } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;

?

回調(diào)函數(shù)原型

?

OB_PREOP_CALLBACK_STATUS ObjectPreCallback(__in PVOID RegistrationContext,    //回調(diào)函數(shù)的參數(shù),上面通過結(jié)構(gòu)體給的.__in POB_PRE_OPERATION_INFORMATION OperationInformation //進(jìn)程或者線程創(chuàng)建的信息結(jié)構(gòu)體);

  

進(jìn)程或者線程信息結(jié)構(gòu)體.

typedef struct _OB_PRE_OPERATION_INFORMATION {__in OB_OPERATION Operation;    //句柄的操作類型, 是上面我們給的.union {__in ULONG Flags;struct {__in ULONG KernelHandle:1;__in ULONG Reserved:31;};};__in PVOID Object;        //對象指針,如果你給的是監(jiān)控進(jìn)程,那么這個對象就是EPROCESS,如果是線程,那么這個對象就是ETHREAD__in POBJECT_TYPE ObjectType; //對象類型. 可能是PsThreadType 也可能是 PsProcessType__out PVOID CallContext;__in POB_PRE_OPERATION_PARAMETERS Parameters; //創(chuàng)建或者創(chuàng)建之后的參數(shù)信息結(jié)構(gòu)體. } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;

?

參數(shù)信息結(jié)構(gòu)體

typedef union _OB_PRE_OPERATION_PARAMETERS {__inout OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;        //創(chuàng)建句柄,則成員會給這個賦值__inout OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;    //拷貝句柄,則給這個成員賦值.} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;

  

創(chuàng)建句柄結(jié)構(gòu)體

typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {__inout ACCESS_MASK DesiredAccess;                        //創(chuàng)建的權(quán)限是什么. 如果我們給 0則沒有任何權(quán)限,則進(jìn)程不能創(chuàng)建.__in ACCESS_MASK OriginalDesiredAccess;                     //原始的權(quán)限. } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;

 

拷貝句柄結(jié)構(gòu)體信息

__inout ACCESS_MASK DesiredAccess;                      //權(quán)限,我們自己控制__in ACCESS_MASK OriginalDesiredAccess;                   //原始權(quán)限__in PVOID SourceProcess;                           //拷貝句柄的時候,源對象指針.__in PVOID TargetProcess;                           //目的對象指針. } OB_PRE_DUPLICATE_HANDLE_INFORMATION, * POB_PRE_DUPLICATE_HANDLE_INFORMATION;

?

結(jié)構(gòu)體看著挺多,其實挺簡單的.

?

三丶給軟件添加權(quán)限保護(hù)代碼.

代碼直接拷貝編譯就可以.我是使用的 WDK7600. 因為沒有硬編碼的方式.所以高版本W(wǎng)DK只要支持這些函數(shù).就可以編譯.

?

#include <ntddk.h> //很多驅(qū)動的結(jié)構(gòu)體函數(shù)的聲明呀.都包含在這里面 #include <ntdef.h>#include <wdm.h>NTKERNELAPI NTSTATUS PsLookupProcessByProcessId( __in HANDLE ProcessId, __deref_out PEPROCESS *Process );PVOID g_pRegistrationHandle;NTKERNELAPI UCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);EXTERN_C void InstallHook(); OB_PREOP_CALLBACK_STATUS ObjectPreCallback(__in PVOID RegistrationContext, __in POB_PRE_OPERATION_INFORMATION OperationInformation);OB_PREOP_CALLBACK_STATUS ObjectPreCallback(__in PVOID RegistrationContext, __in POB_PRE_OPERATION_INFORMATION OperationInformation) {PEPROCESS Process; UCHAR *pszImageName = NULL;#define PROCESS_PROTECT 0x1 Process = (PEPROCESS)OperationInformation->Object; pszImageName = PsGetProcessImageFileName(Process);if (strstr(pszImageName, "calc") != NULL) {if (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE){if((OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess &PROCESS_PROTECT) == PROCESS_PROTECT){OperationInformation->Parameters->CreateHandleInformation.DesiredAccess&= ~PROCESS_PROTECT;}}if (OperationInformation->Operation == OB_OPERATION_HANDLE_DUPLICATE){if((OperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess &PROCESS_PROTECT) == PROCESS_PROTECT){OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &=~PROCESS_PROTECT;}}} return OB_PREOP_SUCCESS; }void InstallHook() {NTSTATUS status;OB_CALLBACK_REGISTRATION obReg;OB_OPERATION_REGISTRATION obOper;DbgPrint("begin protect calc");obOper.ObjectType = PsProcessType;obOper.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;obOper.PreOperation = NULL;obOper.PostOperation = NULL;RtlInitUnicodeString(&obReg.Altitude, L"60000");obReg.Version = OB_FLT_REGISTRATION_VERSION;obReg.OperationRegistrationCount = 1;obReg.RegistrationContext = NULL;obOper.PreOperation = (POB_PRE_OPERATION_CALLBACK)&ObjectPreCallback; obReg.OperationRegistration = &obOper;status = ObRegisterCallbacks(&obReg, &g_pRegistrationHandle);DbgPrint("begin protect calc end"); }VOID DriverUnLoad(PDRIVER_OBJECT pDriverObject); NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) {pDriverObject->DriverUnload = DriverUnLoad;DbgPrint("Load Driver Sucess");//InstallHook(); InstallHook();//設(shè)置通訊的方式return STATUS_SUCCESS; }//驅(qū)動卸載 VOID DriverUnLoad(PDRIVER_OBJECT pDriverObject) {ObUnRegisterCallbacks(g_pRegistrationHandle);DbgPrint("Unload MyDrive\n"); }

?

?

通過上面的代碼,我們的計算器則會被保護(hù).那么此時我們編譯之后安裝驅(qū)動那么軟件就和剛開始那樣,不能進(jìn)行關(guān)閉進(jìn)程了.

你如果關(guān)閉計算器,重新打開則打開不了了,?

如果你啟動計算器之后,在安驅(qū)動,那么計算機(jī)就同上圖所示,關(guān)閉不了了.

?

?

?四丶去掉保護(hù).

去掉保護(hù),那么我們就要逆向?設(shè)置對象回調(diào)的這個API了.

那么簡單的演示則是用PChunter去掉.我們的程序就可以關(guān)閉了.

如果有時間,則逆向一下,找到數(shù)組.?找到表,抹掉即可.

去掉之后則可以退出了.?包括xxx殺毒.

?

代碼下載地址: WDK7600 + Notepad++ +x64Check編譯. 你可以使用Free編譯.我沒用.

鏈接:https://pan.baidu.com/s/1JDBnsznailhCw513pKsbsQ
提取碼:3uhq

轉(zhuǎn)載于:https://www.cnblogs.com/iBinary/p/8401469.html

總結(jié)

以上是生活随笔為你收集整理的64位内核第二讲,进程保护之对象钩子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。