|
网络安全编程:Inline HOOK SSDT计算机与网络安全 今天
一次性付费进群,长期免费索取资料。
回复公众号:微信群 可查看进群流程。
在有些情况下,反病毒软件会保护SSDT不受篡改,其保护方式是检查Native API的函数指针数组中的值是否正确。如果其中某项或某几项被修改,那么反病毒软件会将被修改的项恢复到原来的值,这样HOOK SSDT就不成功了。Inline HOOK是修改被HOOK的入口字节为一个跳转,从而跳转入函数中。如果换作是Inline HOOK SSDT的话,那么就不会去修改Native API的函数指针数组中的值了,这样可以避免反病毒软件的检测(注:这只是一个简单的说明,现在使用Inline HOOK SSDT同样会被反病毒软件查杀)。
实现Inline HOOK SSDT的代码如下:
- typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
- HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG);
- NTCREATEPROCESSEX ulZwCreateProcessEx = 0; // 原始函数地址
- unsigned char bOldBytes[5]; // 函数入口代码
- unsigned char bNewBytes[5]; // Inline 代码
- VOID UnInlineHookCreateProcess();
- VOID ReInlineHookCreateProcess();
- VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
- {
- UnInlineHookCreateProcess();
- }
- NTSTATUS
- MyNtCreateProcessEx(
- __out PHANDLE ProcessHandle,
- __in ACCESS_MASK DesiredAccess,
- __in_opt POBJECT_ATTRIBUTES ObjectAttributes,
- __in HANDLE ParentProcess,
- __in ULONG Flags,
- __in_opt HANDLE SectionHandle,
- __in_opt HANDLE DebugPort,
- __in_opt HANDLE ExceptionPort,
- __in ULONG JobMemberLevel
- )
- {
- NTSTATUS Status = STATUS_SUCCESS;
- KdPrint(("Enter Inline MyNtCreateProcessEx! \r\n"));
- UnInlineHookCreateProcess();
- Status = ulZwCreateProcessEx(ProcessHandle,
- DesiredAccess,
- ObjectAttributes,
- ParentProcess,
- Flags,
- SectionHandle,
- DebugPort,
- ExceptionPort,
- JobMemberLevel);
- ReInlineHookCreateProcess();
- return Status;
- }
- VOID UnInlineHookCreateProcess()
- {
- UN_PROTECT();
- RtlCopyMemory((PVOID)ulZwCreateProcessEx, (CONST PVOID)bOldBytes, 5);
- RE_PROTECT();
- }
- VOID ReInlineHookCreateProcess()
- {
- UN_PROTECT();
- RtlCopyMemory((PVOID)ulZwCreateProcessEx, (CONST PVOID)bNewBytes, 5);
- RE_PROTECT();
- }
- VOID InlineHookCreateProcess()
- {
- ULONG ulSsdt = 0;
- // 保存 NtCreateProcessEx 的地址
- ULONG ulZwCreateProcessExAddr = 0;
- // __asm int 3;
- // 获取 SSDT
- ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase;
- // 获取 NtCreateProcessEx 地址的指针
- ulZwCreateProcessExAddr = ulSsdt + 0x30 * 4;
- // 备份 NtCreateProcessEx 的原始地址
- ulZwCreateProcessEx = (NTCREATEPROCESSEX) *(PULONG)ulZwCreateProcessExAddr;
- // 备份函数前 5 字节
- RtlCopyMemory((PVOID)bOldBytes, (CONST PVOID)ulZwCreateProcessEx, 5);
- // 构造入口跳转指令
- bNewBytes[0] = '\xE9'; // jmp 指令
- *(PULONG)&bNewBytes[1] = (ULONG)MyNtCreateProcessEx - (ULONG)ulZwCreateProcessEx - 5;
- // 修改函数前 5 字节
- RtlCopyMemory((PVOID)ulZwCreateProcessEx, (CONST PVOID)bNewBytes, 5);
- }
- NTSTATUS DriverEntry(
- PDRIVER_OBJECT pDriverObject,
- PUNICODE_STRING pRegistryPath
- )
- {
- NTSTATUS Status = STATUS_SUCCESS;
- pDriverObject->DriverUnload = DriverUnload;
- UN_PROTECT();
- InlineHookCreateProcess();
- RE_PROTECT();
- return Status;
- }
复制代码
其运行结果如图1所示。
图1 Inline HOOK
|
|