主頁 > 企業開發 > 驅動開發:摘除InlineHook內核鉤子

驅動開發:摘除InlineHook內核鉤子

2023-06-25 07:59:01 企業開發

在筆者上一篇文章《驅動開發:內核層InlineHook掛鉤函式》中介紹了通過替換函式頭部代碼的方式實作Hook掛鉤,對于ARK工具來說實作掃描與摘除InlineHook鉤子也是最基本的功能,此類功能的實作一般可在應用層進行,而驅動層只需要保留一個讀寫位元組的函式即可,將復雜的流程放在應用層實作是一個非常明智的選擇,與《驅動開發:內核實作行程反匯編》中所使用的讀寫驅動基本一致,本篇文章中的驅動只保留兩個功能,控制信號IOCTL_GET_CUR_CODE用于讀取函式的前16個位元組的記憶體,信號IOCTL_SET_ORI_CODE則用于設定前16個位元組的記憶體,

之所以是前16個位元組是因為一般的行內Hook只需要使用兩條指令就可實作劫持,如下是通用ARK工具掃描到的被掛鉤函式的樣子,

首先將內核驅動程式代碼放到如下,內核驅動程式沒有任何特別的,僅僅只是一個通用驅動模板,在其基礎上使用CR3讀寫,如果不理解CR3讀寫的原理您可以去看《驅動開發:內核CR3切換讀寫記憶體》這一篇中的詳細介紹,

// 署名權
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: [email protected]

#include <ntifs.h>
#include <intrin.h>
#include <windef.h>

#define	DEVICE_NAME			L"\\Device\\WinDDK"
#define LINK_NAME			L"\\DosDevices\\WinDDK"
#define LINK_GLOBAL_NAME	L"\\DosDevices\\Global\\WinDDK"

// 控制信號 IOCTL_GET_CUR_CODE 用于讀 | IOCTL_SET_ORI_CODE 用于寫
#define IOCTL_GET_CUR_CODE	CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_ORI_CODE	CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)

// 參考__readcr0等函式必須增加
#pragma intrinsic(_disable)
#pragma intrinsic(_enable)

// 定義讀寫結構體
typedef struct
{
	PVOID Address;
	ULONG64 Length;
	UCHAR data[256];
} KF_DATA, *PKF_DATA;

KIRQL g_irql;

// 關閉寫保護
void WPOFFx64()
{
	ULONG64 cr0;
	g_irql = KeRaiseIrqlToDpcLevel();
	cr0 = __readcr0();
	cr0 &= 0xfffffffffffeffff;
	__writecr0(cr0);
	_disable();
}

// 開啟寫保護
void WPONx64()
{
	ULONG64 cr0;
	cr0 = __readcr0();
	cr0 |= 0x10000;
	_enable();
	__writecr0(cr0);
	KeLowerIrql(g_irql);
}

// 設備創建時觸發
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;

	DbgPrint("[LyShark] 設備已創建 \n");
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;
}

// 設備關閉時觸發
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	pIrp->IoStatus.Information = 0;

	DbgPrint("[LyShark] 設備已關閉 \n");
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;
}

// 主派遣函式
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
	NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
	PIO_STACK_LOCATION pIrpStack;
	ULONG uIoControlCode;
	PVOID pIoBuffer;
	ULONG uInSize;
	ULONG uOutSize;

	// 獲取當前設備堆疊
	pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
	uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

	// 獲取緩沖區
	pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;

	// 獲取緩沖區長度
	uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;

	// 輸出緩沖區長度
	uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

	switch (uIoControlCode)
	{
		// 讀記憶體
	case IOCTL_GET_CUR_CODE:
	{
		KF_DATA dat = { 0 };

		// 將緩沖區格式化為KF_DATA結構體
		RtlCopyMemory(&dat, pIoBuffer, 16);
		WPOFFx64();

		// 將資料寫回到緩沖區
		RtlCopyMemory(pIoBuffer, dat.Address, dat.Length);
		WPONx64();
		status = STATUS_SUCCESS;
		break;
	}
	// 寫記憶體
	case IOCTL_SET_ORI_CODE:
	{
		KF_DATA dat = { 0 };

		// 將緩沖區格式化為KF_DATA結構體
		RtlCopyMemory(&dat, pIoBuffer, sizeof(KF_DATA));
		WPOFFx64();

		// 將資料寫回到緩沖區
		RtlCopyMemory(dat.Address, dat.data, dat.Length);
		WPONx64();
		status = STATUS_SUCCESS;
		break;
	}
	}

	if (status == STATUS_SUCCESS)
		pIrp->IoStatus.Information = uOutSize;
	else
		pIrp->IoStatus.Information = 0;

	pIrp->IoStatus.Status = status;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	return status;
}

// 驅動卸載
VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{
	UNICODE_STRING strLink;

	// 洗掉符號鏈接卸載設備
	RtlInitUnicodeString(&strLink, LINK_NAME);
	IoDeleteSymbolicLink(&strLink);
	IoDeleteDevice(pDriverObj->DeviceObject);
}

// 驅動程式入口
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
	NTSTATUS status = STATUS_SUCCESS;
	UNICODE_STRING ustrLinkName;
	UNICODE_STRING ustrDevName;
	PDEVICE_OBJECT pDevObj;

	// 初始化派遣函式
	pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
	pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
	pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;

	DbgPrint("hello lysahrk.com \n");

	// 初始化設備名
	RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);

	// 創建設備
	status = IoCreateDevice(pDriverObj, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj);
	if (!NT_SUCCESS(status))
	{
		return status;
	}

	// 創建符號鏈接
	RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
	status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);
	if (!NT_SUCCESS(status))
	{
		IoDeleteDevice(pDevObj);
		return status;
	}

	pDriverObj->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}

接著來分析下應用層做了什么,首先GetKernelBase64函式的作用,該函式內部通過GetProcAddress()函式動態尋找到ZwQuerySystemInformation()函式的記憶體地址(此函式未被到處所以只能動態找到),找到后呼叫ZwQuerySystemInformation()直接拿到系統中的所有模塊資訊,通過pSystemModuleInformation->Module[0].Base得到系統中第一個模塊的基地址,此模塊就是ntoskrnl.exe,該模塊也是系統運行后的第一個啟動的,此時我們即可拿到KernelBase也就是系統記憶體中的基地址,

此時通過LoadLibraryExA()函式動態加載,此時加載的是磁盤中的被Hook函式的所屬模塊,獲得映射地址后將此地址裝入hKernel變數內,此時我們擁有了記憶體中的KernelBase以及磁盤中加載的hKernel,接著呼叫RepairRelocationTable()讓兩者的重定位表保持一致,

此時當用戶呼叫GetSystemRoutineAddress()則執行如下流程,想要獲取當前記憶體地址,則需要使用當前記憶體中的KernelBase模塊基址加上通過GetProcAddress()動態獲取到的磁盤基址中的函式地址減去磁盤中的基地址,將記憶體中的KernelBase加上磁盤中的相對偏移就得到了當前記憶體中加載函式的實際地址,

  • address1 = KernelBase + (ULONG64)GetProcAddress(hKernel, "NtWriteFile") - (ULONG64)hKernel
  • address2 = KernelBase - (ULONG64)hKernel + (ULONG64)GetProcAddress(hKernel, "NtWriteFile")

呼叫GetOriginalMachineCode()則用于獲取相對偏移地址,該地址的獲取方式如下,用戶傳入一個Address當前地址,該地址減去KernelBase記憶體中的基址,然后再加上hKernel磁盤加載的基址來獲取到相對偏移,

  • OffsetAddress = Address - KernelBase + hKernel

有了這兩條資訊那么功能也就實作了,通過GetOriginalMachineCode()得到指定記憶體地址處原始機器碼,通過GetCurrentMachineCode()得到當前記憶體機器碼,兩者通過memcmp()函式比對即可知道是否被掛鉤了,如果被掛鉤則可以通過CR3切換將原始機器碼覆寫到特定位置替換即可,這段程式的完整代碼如下;

// 署名權
// right to sign one's name on a piece of work
// PowerBy: LyShark
// Email: [email protected]
#include <stdio.h>
#include <Windows.h>

#pragma comment(lib,"user32.lib")
#pragma comment(lib,"Advapi32.lib")

#ifndef NT_SUCCESS
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#endif

#define BYTE_ARRAY_LENGTH 16
#define SystemModuleInformation 11
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)

typedef long(__stdcall *ZWQUERYSYSTEMINFORMATION)
(
	IN ULONG SystemInformationClass,
	IN PVOID SystemInformation,
	IN ULONG SystemInformationLength,
	IN PULONG ReturnLength OPTIONAL
);

typedef struct
{
	ULONG Unknow1;
	ULONG Unknow2;
	ULONG Unknow3;
	ULONG Unknow4;
	PVOID Base;
	ULONG Size;
	ULONG Flags;
	USHORT Index;
	USHORT NameLength;
	USHORT LoadCount;
	USHORT ModuleNameOffset;
	char ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;

typedef struct
{
	ULONG Count;
	SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;

typedef struct
{
	PVOID Address;
	ULONG64 Length;
	UCHAR data[256];
} KF_DATA, *PKF_DATA;

HANDLE hDriver = 0;
HMODULE	hKernel = 0;
ULONG64	KernelBase = 0;
CHAR NtosFullName[260] = { 0 };

// 生成控制信號
DWORD CTL_CODE_GEN(DWORD lngFunction)
{
	return (FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (lngFunction * 4) | METHOD_BUFFERED;
}

// 發送控制信號的函式
BOOL IoControl(HANDLE hDrvHandle, DWORD dwIoControlCode, PVOID lpInBuffer, DWORD nInBufferSize, PVOID lpOutBuffer, DWORD nOutBufferSize)
{
	DWORD lDrvRetSize;
	return DeviceIoControl(hDrvHandle, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, &lDrvRetSize, 0);
}

// 動態獲取ntdll.dll模塊的基地址
ULONG64 GetKernelBase64(PCHAR NtosName)
{
	ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation;
	PSYSTEM_MODULE_INFORMATION pSystemModuleInformation;
	ULONG NeedSize, BufferSize = 0x5000;
	PVOID pBuffer = NULL;
	NTSTATUS Result;

	// 該函式只能通過動態方式得到地址
	ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwQuerySystemInformation");
	do
	{
		pBuffer = malloc(BufferSize);
		if (pBuffer == NULL) return 0;

		// 查詢系統中的所有模塊資訊
		Result = ZwQuerySystemInformation(SystemModuleInformation, pBuffer, BufferSize, &NeedSize);
		if (Result == STATUS_INFO_LENGTH_MISMATCH)
		{
			free(pBuffer);
			BufferSize *= 2;
		}
		else if (!NT_SUCCESS(Result))
		{
			free(pBuffer);
			return 0;
		}
	} while (Result == STATUS_INFO_LENGTH_MISMATCH);

	// 取模塊資訊結構
	pSystemModuleInformation = (PSYSTEM_MODULE_INFORMATION)pBuffer;

	// 得到模塊基地址
	ULONG64 ret = (ULONG64)(pSystemModuleInformation->Module[0].Base);

	// 拷貝模塊名
	if (NtosName != NULL)
	{
		strcpy(NtosName, pSystemModuleInformation->Module[0].ImageName + pSystemModuleInformation->Module[0].ModuleNameOffset);
	}

	free(pBuffer);
	return ret;
}

// 判斷并修復重定位表
BOOL RepairRelocationTable(ULONG64 HandleInFile, ULONG64 BaseInKernel)
{
	PIMAGE_DOS_HEADER		pDosHeader;
	PIMAGE_NT_HEADERS64		pNtHeader;
	PIMAGE_BASE_RELOCATION	pRelocTable;
	ULONG i, dwOldProtect;

	// 得到DOS頭并判斷是否符合DOS規范
	pDosHeader = (PIMAGE_DOS_HEADER)HandleInFile;
	if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
	{
		return FALSE;
	}

	// 得到Nt頭
	pNtHeader = (PIMAGE_NT_HEADERS64)((ULONG64)HandleInFile + pDosHeader->e_lfanew);

	// 是否存在重定位表
	if (pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)
	{
		// 獲取到重定位表基地址
		pRelocTable = (PIMAGE_BASE_RELOCATION)((ULONG64)HandleInFile + pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);

		do
		{
			// 得到重定位號
			ULONG	numofReloc = (pRelocTable->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / 2;
			SHORT	minioffset = 0;
			
			// 得到重定位資料
			PUSHORT pRelocData = https://www.cnblogs.com/LyShark/p/(PUSHORT)((ULONG64)pRelocTable + sizeof(IMAGE_BASE_RELOCATION));

			// 回圈或直接判斷*pRelocData是否為0也可以作為結束標記
			for (i = 0; i> 12) == IMAGE_REL_BASED_DIR64)
				{
					// 計算需要進行重定位的地址
					// 重定位資料的低12位再加上本重定位塊頭的RVA即真正需要重定位的資料的RVA
					minioffset = (*pRelocData) & 0xFFF; // 小偏移

					// 模塊基址+重定位基址+每個資料表示的小偏移量
					RelocAddress = (PULONG64)(HandleInFile + pRelocTable->VirtualAddress + minioffset);

					// 直接在RING3修改: 原始資料+基址-IMAGE_OPTINAL_HEADER中的基址
					VirtualProtect((PVOID)RelocAddress, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);

					// 因為是R3直接LOAD的所以要修改一下記憶體權限
					*RelocAddress = *RelocAddress + BaseInKernel - pNtHeader->OptionalHeader.ImageBase;
					VirtualProtect((PVOID)RelocAddress, 4, dwOldProtect, NULL);
				}
				// 下一個重定位資料
				pRelocData++;
			}
			// 下一個重定位塊
			pRelocTable = (PIMAGE_BASE_RELOCATION)((ULONG64)pRelocTable + pRelocTable->SizeOfBlock);
		} while (pRelocTable->VirtualAddress);

		return TRUE;
	}
	return FALSE;
}

// 初始化
BOOL InitEngine(BOOL IsClear)
{
	if (IsClear == TRUE)
	{
		// 動態獲取ntdll.dll模塊的基地址
		KernelBase = GetKernelBase64(NtosFullName);
		printf("模塊基址: %llx | 模塊名: %s \n", KernelBase, NtosFullName);
		if (!KernelBase)
		{
			return FALSE;
		}
			
		// 動態加載模塊到記憶體,并獲取到模塊句柄
		hKernel = LoadLibraryExA(NtosFullName, 0, DONT_RESOLVE_DLL_REFERENCES);

		if (!hKernel)
		{
			return FALSE;
		}

		// 判斷并修復重定位表
		if (!RepairRelocationTable((ULONG64)hKernel, KernelBase))
		{
			return FALSE;
		}
		return TRUE;
	}
	else
	{
		FreeLibrary(hKernel);
		return TRUE;
	}
}

// 獲取原始函式機器碼
VOID GetOriginalMachineCode(ULONG64 Address, PUCHAR ba, SIZE_T Length)
{
	ULONG64 OffsetAddress = Address - KernelBase + (ULONG64)hKernel;
	RtlCopyMemory(ba, (PVOID)OffsetAddress, Length);
}

// 獲取傳入函式的記憶體地址
ULONG64 GetSystemRoutineAddress(PCHAR FuncName)
{
	return KernelBase + (ULONG64)GetProcAddress(hKernel, FuncName) - (ULONG64)hKernel;
}

// 獲取當前函式機器碼
VOID GetCurrentMachineCode(ULONG64 Address, PUCHAR ba, SIZE_T Length)
{
	ULONG64 dat[2] = { 0 };
	dat[0] = Address;
	dat[1] = Length;
	IoControl(hDriver, CTL_CODE_GEN(0x800), dat, 16, ba, Length);
}

// 清除特定位置的機器碼
VOID ClearInlineHook(ULONG64 Address, PUCHAR ba, SIZE_T Length)
{
	KF_DATA dat = { 0 };
	dat.Address = (PVOID)Address;
	dat.Length = Length;

	// 直接呼叫寫出控制碼
	RtlCopyMemory(dat.data, ba, Length);
	IoControl(hDriver, CTL_CODE_GEN(0x801), &dat, sizeof(KF_DATA), 0, 0);
}

// 列印資料
VOID PrintBytes(PCHAR DescriptionString, PUCHAR ba, UINT Length)
{
	printf("%s", DescriptionString);
	for (UINT i = 0; i<Length; i++)
	{
		printf("%02x ", ba[i]);
	}
	printf("\n");
}

int main(int argc, char *argv[])
{
	UCHAR OriginalMachineCode[BYTE_ARRAY_LENGTH];
	UCHAR CurrentMachineCode[BYTE_ARRAY_LENGTH];
	ULONG64 Address = 0;

	hDriver = CreateFileA("\\\\.\\WinDDK", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	// 初始化
	if (!InitEngine(TRUE) || hDriver == 0)
	{
		return 0;
	}

	// 需要獲取的函式串列
	CHAR *FunctionList[128] = { "PsLookupProcessByProcessId", "NtCommitEnlistment", "NtCommitComplete", "NtCommitTransaction" };

	for (size_t i = 0; i < 4; i++)
	{
		// 清空快取
		RtlZeroMemory(OriginalMachineCode, 0, BYTE_ARRAY_LENGTH);
		RtlZeroMemory(CurrentMachineCode, 0, BYTE_ARRAY_LENGTH);

		// 獲取到當前函式地址
		Address = GetSystemRoutineAddress(FunctionList[i]);

		printf("\n函式地址: %p | 函式名: %s\n", Address, FunctionList[i]);
		if (Address == 0 || Address < KernelBase)
		{
			return 0;
		}

		GetOriginalMachineCode(Address, OriginalMachineCode, BYTE_ARRAY_LENGTH);
		PrintBytes("原始機器碼: ", OriginalMachineCode, BYTE_ARRAY_LENGTH);

		GetCurrentMachineCode(Address, CurrentMachineCode, BYTE_ARRAY_LENGTH);
		PrintBytes("當前機器碼: ", CurrentMachineCode, BYTE_ARRAY_LENGTH);

		/*
		// 不相同則詢問是否恢復
		if (memcmp(OriginalMachineCode, CurrentMachineCode, BYTE_ARRAY_LENGTH))
		{
			printf("按下[ENTER]恢復鉤子");
			getchar();
			ClearInlineHook(Address, OriginalMachineCode, BYTE_ARRAY_LENGTH);
		}
		*/
	}

	// 注銷
	InitEngine(FALSE);
	system("pause");

	return 0;
}

首先編譯驅動程式WinDDK.sys并通過KmdManager將驅動程式拉起來,運行客戶端lyshark.exe程式會輸出當前FunctionList串列中,指定的4個函式的掛鉤情況,

參考文獻

WIN64內核編程基礎 胡文亮

文章作者:lyshark (王瑞)
文章出處:https://www.cnblogs.com/LyShark/p/16833606.html
本博客所有文章除特別宣告外,均采用 BY-NC-SA 許可協議,轉載請注明出處!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/555881.html

標籤:訊息安全

上一篇:曾經辛苦造的輪子,現在能否用 ChatGPT 替代呢?

下一篇:返回列表

標籤雲
其他(161546) Python(38244) JavaScript(25513) Java(18251) C(15238) 區塊鏈(8272) C#(7972) AI(7469) 爪哇(7425) MySQL(7265) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1971) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 驅動開發:摘除InlineHook內核鉤子

    在筆者上一篇文章`《驅動開發:內核層InlineHook掛鉤函式》`中介紹了通過替換`函式`頭部代碼的方式實作`Hook`掛鉤,對于ARK工具來說實作掃描與摘除`InlineHook`鉤子也是最基本的功能,此類功能的實作一般可在應用層進行,而驅動層只需要保留一個`讀寫位元組`的函式即可,將復雜的流程放... ......

    uj5u.com 2023-06-25 07:59:01 more
  • 曾經辛苦造的輪子,現在能否用 ChatGPT 替代呢?

    上一篇文章 [我在 vscode 插件里接入了 ChatGPT,解決了代碼變數命名的難題](https://www.cnblogs.com/jaycewu/p/17476198.html) 中,展示了如何在 vscode 插件中使用 ChatGPT 解決代碼變數命名的問題。vscode 插件市場中有 ......

    uj5u.com 2023-06-24 08:01:15 more
  • 前端Vue自定義支付密碼輸入鍵盤Keyboard和支付設定輸入框Input

    #### 前端Vue自定義支付密碼輸入鍵盤Keyboard和支付設定輸入框Input, 下載完整代碼請訪問uni-app插件市場地址:https://ext.dcloud.net.cn/plugin?id=13166 #### 效果圖如下: ![](https://p3-juejin.byteimg ......

    uj5u.com 2023-06-24 08:01:11 more
  • 前端Vue自定義簡單實用輪播圖封裝組件 快速實作輪播圖

    前端Vue自定義簡單實用輪播圖封裝組件 快速實作輪播圖, 下載完整代碼請訪問uni-app插件市場地址:https://ext.dcloud.net.cn/plugin?id=13153 效果圖如下: ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fb ......

    uj5u.com 2023-06-24 08:01:06 more
  • 曾經辛苦造的輪子,現在能否用 ChatGPT 替代呢?

    上一篇文章 [我在 vscode 插件里接入了 ChatGPT,解決了代碼變數命名的難題](https://www.cnblogs.com/jaycewu/p/17476198.html) 中,展示了如何在 vscode 插件中使用 ChatGPT 解決代碼變數命名的問題。vscode 插件市場中有 ......

    uj5u.com 2023-06-24 08:00:53 more
  • 前端Vue自定義簡單好用商品分類串列組件 側邊欄商品分類組件

    #### 前端Vue自定義簡單好用商品分類串列組件 側邊欄商品分類組件 , 下載完整代碼請訪問uni-app插件市場地址:https://ext.dcloud.net.cn/plugin?id=13148 #### 效果圖如下: ![](https://p3-juejin.byteimg.com/t ......

    uj5u.com 2023-06-23 07:38:42 more
  • 【技識訓累】Vue.js中的基礎概念與語法【一】

    博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-06-23 07:33:27 more
  • 記錄--新的HTML標簽 :<search>

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 本文介紹了一種新的HTML元素搜索方法,并提供了一個實用的工具來幫助開發者快速找到所需的元素。這對于那些需要處理大量HTML元素的開發者來說是非常有用的。文章還通過提供一些常見元素的用法示例,幫助開發者更好地理解和應用這些元素。在眾多元素 ......

    uj5u.com 2023-06-22 07:59:31 more
  • 單標簽下的日間/黑夜模式切換按鈕效果

    前不久,在網上看到這么一張非常有趣的圖: ![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4edc3cef70d744d381eabb604ef089cb~tplv-k3u1fbpfcp-watermark.image?) 想必很多同學都看 ......

    uj5u.com 2023-06-22 07:59:25 more
  • 前端Vue自定義頂部搜索框 熱門搜索 歷史搜索 用于搜索跳轉使用

    #### 前端Vue自定義頂部搜索框 熱門搜索 歷史搜索 用于搜索跳轉使用, 下載完整代碼請訪問uni-app插件市場地址:[https://ext.dcloud.net.cn/plugin?id=13128](https://ext.dcloud.net.cn/plugin?id=13119) # ......

    uj5u.com 2023-06-22 07:59:21 more