代码拉取完成,页面将自动刷新
#include "FastFunction.h"
ULONG64 FastFunction::GetSystemModuleBase(char* lpModuleName)
{
ULONG NeedSize, i, ModuleCount, BufferSize = 0x5000;
PVOID pBuffer = NULL;
PCHAR pDrvName = NULL;
NTSTATUS Result;
PSYSTEM_MODULE_INFORMATION pSystemModuleInformation;
do
{
pBuffer = kmalloc(BufferSize);
if (pBuffer == NULL)
return 0;
Result = ZwQuerySystemInformation(11, pBuffer, BufferSize, &NeedSize);
if (Result == STATUS_INFO_LENGTH_MISMATCH)
{
kfree(pBuffer);
BufferSize *= 2;
}
else if (!NT_SUCCESS(Result))
{
kfree(pBuffer);
return 0;
}
} while (Result == STATUS_INFO_LENGTH_MISMATCH);
pSystemModuleInformation = (PSYSTEM_MODULE_INFORMATION)pBuffer;
ModuleCount = pSystemModuleInformation->ModuleCount;
for (i = 0; i < ModuleCount; i++)
{
if ((ULONG64)(pSystemModuleInformation->Module[i].ImageBase) > (ULONG64)0x8000000000000000)
{
pDrvName = pSystemModuleInformation->Module[i].ImageName + pSystemModuleInformation->Module[i].PathLength;
if (_stricmp(pDrvName, lpModuleName) == 0)
return (ULONG64)pSystemModuleInformation->Module[i].ImageBase;
}
}
kfree(pBuffer);
return 0;
}
VOID FastFunction::GetSystemModuleBase(char * lpModuleName, ULONG64 * ByRefBase, ULONG * ByRefSize)
{
ULONG NeedSize, i, ModuleCount, BufferSize = 0x5000;
PVOID pBuffer = NULL;
PCHAR pDrvName = NULL;
NTSTATUS Result;
PSYSTEM_MODULE_INFORMATION pSystemModuleInformation;
do
{
pBuffer = kmalloc(BufferSize);
if (pBuffer == NULL)
return;
Result = ZwQuerySystemInformation(11, pBuffer, BufferSize, &NeedSize);
if (Result == STATUS_INFO_LENGTH_MISMATCH)
{
kfree(pBuffer);
BufferSize *= 2;
}
else if (!NT_SUCCESS(Result))
{
kfree(pBuffer);
return;
}
} while (Result == STATUS_INFO_LENGTH_MISMATCH);
pSystemModuleInformation = (PSYSTEM_MODULE_INFORMATION)pBuffer;
ModuleCount = pSystemModuleInformation->ModuleCount;
for (i = 0; i < ModuleCount; i++)
{
if ((ULONG64)(pSystemModuleInformation->Module[i].ImageBase) > (ULONG64)0x8000000000000000)
{
pDrvName = pSystemModuleInformation->Module[i].ImageName + pSystemModuleInformation->Module[i].PathLength;
if (_stricmp(pDrvName, lpModuleName) == 0)
{
*ByRefBase = (ULONG64)pSystemModuleInformation->Module[i].ImageBase;
*ByRefSize = pSystemModuleInformation->Module[i].ImageSize;
goto exit_sub;
}
}
}
exit_sub:
kfree(pBuffer);
}
NTSTATUS FastFunction::HideDriver(char * pDrvName,PDRIVER_OBJECT pPDriverObj)
{
PKLDR_DATA_TABLE_ENTRY entry = (PKLDR_DATA_TABLE_ENTRY)pPDriverObj->DriverSection;
PKLDR_DATA_TABLE_ENTRY firstentry;
ULONG64 pDrvBase = 0;
KIRQL OldIrql;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
firstentry = entry;
pDrvBase = GetSystemModuleBase(pDrvName);
DbgPrintEx(77, 0, "驱动基址 = %p.\n", pDrvBase);
while ((PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink != firstentry)
{
if (entry->DllBase == pDrvBase)
{
DbgPrintEx(77, 0, "找到开始清空.\n");
OldIrql = KeRaiseIrqlToDpcLevel();
((LIST_ENTRY64*)(entry->InLoadOrderLinks.Flink))->Blink = entry->InLoadOrderLinks.Blink;
((LIST_ENTRY64*)(entry->InLoadOrderLinks.Blink))->Flink = entry->InLoadOrderLinks.Flink;
entry->InLoadOrderLinks.Flink = 0;
entry->InLoadOrderLinks.Blink = 0;
KeLowerIrql(OldIrql);
Status = STATUS_SUCCESS;
break;
}
entry = (PKLDR_DATA_TABLE_ENTRY)entry->InLoadOrderLinks.Flink;
}
return Status;
}
PVOID FastFunction::RvaToVaHades(PVOID pModuleBase, ULONG Rva)
{
if (Rva == 0)
{
return NULL;
}
return (PVOID)((PUCHAR)pModuleBase + Rva);
}
PVOID FastFunction::GetModuleExport(PVOID pModuleBase, PCHAR pExportName)
{
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pModuleBase;
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{
return NULL;
}
PIMAGE_NT_HEADERS32 pNtHeaders32 = (PIMAGE_NT_HEADERS32)RvaToVaHades(pModuleBase, pDosHeader->e_lfanew);
PIMAGE_NT_HEADERS64 pNtHeaders64 = (PIMAGE_NT_HEADERS64)pNtHeaders32;
if (pNtHeaders64 == NULL || pNtHeaders64->Signature != IMAGE_NT_SIGNATURE)
{
return NULL;
}
PIMAGE_DATA_DIRECTORY pDataDirectory = NULL;
if (pNtHeaders64->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
{
pDataDirectory = &pNtHeaders64->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
}
else if (pNtHeaders64->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
{
pDataDirectory = &pNtHeaders32->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
}
else
{
return NULL;
}
PIMAGE_EXPORT_DIRECTORY pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)RvaToVaHades(pModuleBase, pDataDirectory->VirtualAddress);
ULONG ExportDirectorySize = pDataDirectory->Size;
if (pExportDirectory == NULL)
{
return NULL;
}
PULONG NameTable = (PULONG)RvaToVaHades(pModuleBase, pExportDirectory->AddressOfNames);
PULONG AddressTable = (PULONG)RvaToVaHades(pModuleBase, pExportDirectory->AddressOfFunctions);
PUSHORT OrdinalsTable = (PUSHORT)RvaToVaHades(pModuleBase, pExportDirectory->AddressOfNameOrdinals);
if (NameTable == NULL || AddressTable == NULL || OrdinalsTable == NULL)
{
return NULL;
}
for (size_t i = 0; i < pExportDirectory->NumberOfNames; i++)
{
PCHAR pCurrentName = (PCHAR)RvaToVaHades(pModuleBase, NameTable[i]);
if (pCurrentName != NULL && strncmp(pExportName, pCurrentName, 256) == 0)
{
USHORT CurrentOrd = OrdinalsTable[i];
if (CurrentOrd < pExportDirectory->NumberOfFunctions)
{
PVOID pExportAddress = RvaToVaHades(pModuleBase, AddressTable[CurrentOrd]);
if ((ULONG_PTR)pExportAddress >= (ULONG_PTR)pExportDirectory &&
(ULONG_PTR)pExportAddress <= (ULONG_PTR)pExportDirectory + ExportDirectorySize)
{
return NULL;
}
return pExportAddress;
}
return NULL;
}
}
return NULL;
}
PVOID FastFunction::GetModuleBaseWow64(PEPROCESS pEProcess, PWCHAR pModuleName)
{
NTSTATUS nStatus;
PPEB32 pPeb = NULL;
UNICODE_STRING usModuleName = { 0 };
RtlInitUnicodeString(&usModuleName, pModuleName);
pPeb = (PPEB32)PsGetProcessWow64Process(pEProcess);
if (pPeb == NULL || pPeb->Ldr == 0) {
return NULL;
}
for (PLIST_ENTRY32 pListEntry = (PLIST_ENTRY32)((PPEB_LDR_DATA32)pPeb->Ldr)->InLoadOrderModuleList.Flink;
pListEntry != &((PPEB_LDR_DATA32)pPeb->Ldr)->InLoadOrderModuleList;
pListEntry = (PLIST_ENTRY32)pListEntry->Flink)
{
PLDR_DATA_TABLE_ENTRY32 LdrEntry = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY32, InLoadOrderLinks);
if (LdrEntry->BaseDllName.Buffer == NULL)
{
continue;
}
UNICODE_STRING usCurrentName = { 0 };
RtlInitUnicodeString(&usCurrentName, (PWCHAR)LdrEntry->BaseDllName.Buffer);
if (RtlEqualUnicodeString(&usModuleName, &usCurrentName, TRUE))
{
return (PVOID)LdrEntry->DllBase;
}
}
return NULL;
}
PEPROCESS FastFunction::GetProcessPeprocess(int Pid)
{
PEPROCESS Pe = NULL;
PsLookupProcessByProcessId((HANDLE)Pid, &Pe);
return Pe;
}
PVOID FastFunction::GetFunctionFromModule(PEPROCESS pEProcess, PWCHAR DllName, PCHAR FunctionName,BOOLEAN IsAttach)
{
KAPC_STATE KAPC = { 0 };
PVOID BaseAddr = NULL;
if (IsAttach) {
KeStackAttachProcess(pEProcess, &KAPC);
}
PVOID pNtdllBase = GetModuleBaseWow64(pEProcess, DllName);
if (pNtdllBase == NULL) {
goto $EXIT;
}
BaseAddr = GetModuleExport(pNtdllBase, FunctionName);
$EXIT:
if (IsAttach) {
KeUnstackDetachProcess(&KAPC);
}
return BaseAddr;
}
char* FastFunction::GetProcessNamebyHandle(HANDLE handle)
{
PEPROCESS Process;
NTSTATUS status;
char *nameptr = NULL;
status = ObReferenceObjectByHandle(handle, 0, NULL, KernelMode, (PVOID *)&Process, NULL);
if (!NT_SUCCESS(status))
{
return NULL;
}
return (char *)PsGetProcessImageFileName(Process);
}
NTSTATUS FastFunction::ApcpQuerySystemProcessInformation(PSYSTEM_PROCESS_INFO * SystemInfo)
{
PSYSTEM_PROCESS_INFO pBuffer = NULL;
ULONG BufferSize = 0;
ULONG RequiredSize = 0;
NTSTATUS status = STATUS_SUCCESS;
while ((status = ZwQuerySystemInformation(
SystemProcessInformation,
pBuffer,
BufferSize,
&RequiredSize//retn Length
)) == STATUS_INFO_LENGTH_MISMATCH)
{
BufferSize = RequiredSize;
pBuffer = (PSYSTEM_PROCESS_INFO)ExAllocatePool(PagedPool, BufferSize);
}
if (!NT_SUCCESS(status))
{
if (pBuffer != NULL)
{
ExFreePool(pBuffer);
}
return status;
}
//retn pSystemProcessInfo
*SystemInfo = pBuffer;
return status;
}
NTSTATUS FastFunction::GetProcessThreadInfo(IN ULONG Pid, OUT ULONG *ThreadNuber, OUT PULONG64 Tid, OUT PULONG64 StartAddr)
{
PEPROCESS pEProcess;
PSYSTEM_PROCESS_INFO OriginalSystemProcessInfo = NULL;
NTSTATUS status = PsLookupProcessByProcessId((HANDLE)Pid, &pEProcess);
if (!NT_SUCCESS(status))
{
return status;
}
if (MmIsAddressValid(ThreadNuber) == 0)
{
status = STATUS_UNSUCCESSFUL;
return status;
}
if (MmIsAddressValid(StartAddr) == 0)
{
status = STATUS_UNSUCCESSFUL;
return status;
}
if (MmIsAddressValid(Tid) == 0)
{
status = STATUS_UNSUCCESSFUL;
return status;
}
status = ApcpQuerySystemProcessInformation(&OriginalSystemProcessInfo);
if (!NT_SUCCESS(status))
{
ObDereferenceObject(pEProcess);
return status;
}
PSYSTEM_PROCESS_INFO SystemProcessInfo = OriginalSystemProcessInfo;
status = STATUS_NOT_FOUND;
do
{
if (SystemProcessInfo->UniqueProcessId == PsGetProcessId(pEProcess))
{
status = STATUS_SUCCESS;
break;
}
SystemProcessInfo = (PSYSTEM_PROCESS_INFO)((PUCHAR)SystemProcessInfo + SystemProcessInfo->NextEntryOffset);
} while (SystemProcessInfo->NextEntryOffset != 0);
if (!NT_SUCCESS(status))
{
ObDereferenceObject(pEProcess);
ExFreePool(OriginalSystemProcessInfo);
return status;
}
*ThreadNuber = SystemProcessInfo->NumberOfThreads;
for (ULONG Index = 0; Index < SystemProcessInfo->NumberOfThreads; ++Index)
{
HANDLE UniqueThreadId = SystemProcessInfo->Threads[Index].ClientId.UniqueThread;
Tid[Index] = (ULONG64)UniqueThreadId;
StartAddr[Index] = (ULONG64)SystemProcessInfo->Threads[Index].StartAddress;
}
ObDereferenceObject(pEProcess);
return status;
}
HANDLE FastFunction::OpenThread(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadId)
{
OBJECT_ATTRIBUTES ObjectAttributes = { 0, };
CLIENT_ID ClientId = { 0, };
HANDLE hThread = NULL;
NTSTATUS Status;
SSDT _SSDT;
_SSDT.SSDT_Init();
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
if (bInheritHandle) {
ObjectAttributes.Attributes = OBJ_INHERIT;
}
ClientId.UniqueProcess = NULL;
ClientId.UniqueThread = (HANDLE)dwThreadId;
NtOpenThread = (NTSTATUS(__cdecl *)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PCLIENT_ID))_SSDT.GetSSDTFuncCurAddrByIndex(SSDT_OPEN_THREAD);
if (NtOpenThread == NULL) {
return NtOpenThread;
}
Status = NtOpenThread(&hThread,
dwDesiredAccess,
&ObjectAttributes,
&ClientId);
OutPut("<-->错误代码 = %X\n", Status);
_SSDT.Un_SSDTClass();
return hThread;
}
NTSTATUS FastFunction::SuspendThread(HANDLE ThreadHandle)
{
SSDT _SSDT;
NTSTATUS Status;
_SSDT.SSDT_Init();
NtSuspendThread = (NTSTATUS(__cdecl *)(HANDLE, PULONG))_SSDT.GetSSDTFuncCurAddrByIndex(SSDT_NTSUSPENDTHRED);
Status = NtSuspendThread(ThreadHandle, NULL);
OutPut("<-->错误代码 = %X\n", Status);
_SSDT.Un_SSDTClass();
return Status;
}
NTSTATUS FastFunction::ResumeThread(HANDLE hThread)
{
SSDT _SSDT;
NTSTATUS Status;
_SSDT.SSDT_Init();
NtResumeThread = (NTSTATUS(__cdecl *)(HANDLE, PULONG))_SSDT.GetSSDTFuncCurAddrByIndex(SSDT_RESUMETHREAD);
Status = NtResumeThread(hThread, NULL);
OutPut("<-->错误代码 = %X\n", Status);
_SSDT.Un_SSDTClass();
return Status;
}
NTSTATUS FastFunction::GetDriverThread(char * DriverName, OUT ULONG * ThreadNuber, OUT PULONG64 Tid)
{
ULONG64 DriverBaseAddr = 0;
ULONG DriverSize = 0;
ULONG Number = 0;
ULONG Number1 = 0;
ULONG64 __Tid[THREAD_MAX_NUMBER] = { 0 };
ULONG64 __ThreadStartAddr[THREAD_MAX_NUMBER] = { 0 };
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PETHREAD Et = NULL;
ULONG Count = 0;
GetSystemModuleBase(DriverName, &DriverBaseAddr, &DriverSize);
if (DriverBaseAddr == 0 || DriverSize == 0) {
return Status;
}
Status = GetProcessThreadInfo(4, &Number, __Tid, __ThreadStartAddr);
if (!NT_SUCCESS(Status)) {
return Status;
}
for (ULONG i = 0; i < Number; i++)
{
if (__ThreadStartAddr[i] >= DriverBaseAddr)
{
if (__ThreadStartAddr[i] <= DriverBaseAddr + DriverSize)
{
Tid[Count] = __Tid[i];
Count++;
}
}
}
*ThreadNuber = Count;
return STATUS_SUCCESS;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。