Windows-Rootkits/SSDT-SSSDT-Manager/EnumSSSDTManagerRing0/SSSDT.c

134 lines
4.3 KiB
C
Raw Normal View History

2016-08-29 07:50:25 +00:00
#include "SSSDT.h"
extern ULONG_PTR SSSDTDescriptor;
extern PDRIVER_OBJECT CurrentDriverObject;
extern PVOID SysModuleBsse;
extern ULONG_PTR ulSysModuleSize;
//<2F><><EFBFBD><EFBFBD>SSSDT<44><54>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*4+SSSDT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><34><CEBB><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ƫ<EFBFBD>ơ<EFBFBD><C6A1><EFBFBD><EFBFBD><EFBFBD>SSSDT<44><54><EFBFBD>õ<EFBFBD> <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
PVOID GetSSSDTFunctionAddress64(ULONG ulIndex)
{
2018-08-14 14:22:43 +00:00
LONG v1 = 0;
2016-08-29 07:50:25 +00:00
ULONG_PTR v2 = 0;
ULONG_PTR ServiceTableBase= 0 ;
PSYSTEM_SERVICE_TABLE64 SSSDT = (PSYSTEM_SERVICE_TABLE64)SSSDTDescriptor;
ServiceTableBase=(ULONG_PTR)(SSSDT ->ServiceTableBase);
v2 = ServiceTableBase + 4 * ulIndex;
v1 = *(PLONG)v2;
v1 = v1>>4;
return (PVOID)(ServiceTableBase + (ULONG_PTR)v1);
}
//SSSDT<44><54><EFBFBD><EFBFBD>ַ+4*Index<65><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SSSDT<44><54>Ӧ<EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD>ַ
PVOID GetSSSDTFunctionAddress32(ULONG ulIndex)
{
ULONG_PTR ServiceTableBase= 0 ;
PSYSTEM_SERVICE_TABLE32 SSSDT = (PSYSTEM_SERVICE_TABLE32)SSSDTDescriptor;
ServiceTableBase = (ULONG_PTR)(SSSDT->ServiceTableBase);
return (PVOID)(*(PULONG_PTR)((ULONG_PTR)ServiceTableBase + 4 * ulIndex));
}
//Ring3<67><33><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DriverObject->DriverSection<6F><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚϣ<C8BD> һ<><D2BB><EFBFBD>򷵻<EFBFBD><F2B7B5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
BOOLEAN GetSysModuleByLdrDataTable(WCHAR* wzModuleName)
{
BOOLEAN bRet = FALSE;
if (CurrentDriverObject)
{
PKLDR_DATA_TABLE_ENTRY ListHead = NULL, ListNext = NULL;
ListHead = ListNext = (PKLDR_DATA_TABLE_ENTRY)CurrentDriverObject->DriverSection; //dt _DriverObject
while((PKLDR_DATA_TABLE_ENTRY)ListNext->InLoadOrderLinks.Flink != ListHead)
{
//DbgPrint("%wZ\r\n",&ListNext->BaseDllName);
if (ListNext->BaseDllName.Buffer&&
2018-08-14 14:22:43 +00:00
wcsstr((WCHAR*)(ListNext->BaseDllName.Buffer),wzModuleName)!=NULL)
2016-08-29 07:50:25 +00:00
{
2018-08-14 14:22:43 +00:00
SysModuleBsse = (PVOID)(ListNext->DllBase);
2016-08-29 07:50:25 +00:00
ulSysModuleSize = ListNext->SizeOfImage;
//DbgPrint("%x %x\r\n",ListNext->DllBase,ListNext->EntryPoint);
// DbgPrint("ModuleNameSecondGet:%wZ\r\n",&(ListNext->FullDllName));
bRet = TRUE;
break;
}
ListNext = (PKLDR_DATA_TABLE_ENTRY)ListNext->InLoadOrderLinks.Flink;
}
}
return bRet;
}
//<2F><><EFBFBD><EFBFBD>DriverObject->DriverSection<6F><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
BOOLEAN GetSysModuleByLdrDataTable1(PVOID Address,WCHAR* wzModuleName)
{
BOOLEAN bRet = FALSE;
ULONG_PTR ulBase;
ULONG ulSize;
if (CurrentDriverObject)
{
PKLDR_DATA_TABLE_ENTRY ListHead = NULL, ListNext = NULL;
ListHead = ListNext = (PKLDR_DATA_TABLE_ENTRY)CurrentDriverObject->DriverSection; //dt _DriverObject
while((PKLDR_DATA_TABLE_ENTRY)ListNext->InLoadOrderLinks.Flink != ListHead)
{
ulBase = (ListNext)->DllBase;
ulSize = (ListNext)->SizeOfImage;
2018-08-14 14:22:43 +00:00
if((ULONG_PTR)Address > ulBase && (ULONG_PTR)Address < ulSize+ulBase)
2016-08-29 07:50:25 +00:00
{
memcpy(wzModuleName,(WCHAR*)(((ListNext)->FullDllName).Buffer),sizeof(WCHAR)*60);
bRet = TRUE;
break;
}
ListNext = (PKLDR_DATA_TABLE_ENTRY)ListNext->InLoadOrderLinks.Flink;
}
}
return bRet;
}
2018-08-14 14:22:43 +00:00
VOID UnHookSSSDTWin7(ULONG ulIndex, ULONG_PTR OriginalFunctionAddress)
2016-08-29 07:50:25 +00:00
{
ULONG_PTR v2 = 0;
ULONG_PTR ServiceTableBase = 0 ;
ULONG CurrentFunctionOffsetOfSSSDT = 0;
PSYSTEM_SERVICE_TABLE64 SSSDT = (PSYSTEM_SERVICE_TABLE64)SSSDTDescriptor;
ServiceTableBase=(ULONG_PTR)(SSSDT ->ServiceTableBase);
CurrentFunctionOffsetOfSSSDT = (ULONG)((ULONG_PTR)OriginalFunctionAddress - (ULONG_PTR)(SSSDT->ServiceTableBase));
CurrentFunctionOffsetOfSSSDT = CurrentFunctionOffsetOfSSSDT<<4;
v2 = ServiceTableBase + 4 * ulIndex;
WPOFF();
*(PLONG)v2 = CurrentFunctionOffsetOfSSSDT;
WPON();
}
2018-08-14 14:22:43 +00:00
VOID UnHookSSSDTWinXP(ULONG ulIndex, ULONG_PTR OriginalFunctionAddress)
2016-08-29 07:50:25 +00:00
{
ULONG_PTR ServiceTableBase = 0 ;
ULONG_PTR v2 = 0;
PSYSTEM_SERVICE_TABLE32 SSSDT = (PSYSTEM_SERVICE_TABLE32)SSSDTDescriptor;
ServiceTableBase=(ULONG_PTR)(SSSDT->ServiceTableBase);
v2 = ServiceTableBase + 4 * ulIndex;
WPOFF();
*(PLONG)v2 = (ULONG)OriginalFunctionAddress;
WPON();
}
BOOLEAN ResumeSSSDTInlineHook(ULONG ulIndex,UCHAR* szOriginalFunctionCode)
{
PVOID CurrentFunctionAddress = NULL;
#ifdef _WIN64
CurrentFunctionAddress = GetSSSDTFunctionAddress64(ulIndex);
#else
CurrentFunctionAddress = GetSSSDTFunctionAddress32(ulIndex);
#endif
WPOFF();
SafeCopyMemory(CurrentFunctionAddress,szOriginalFunctionCode,CODE_LENGTH);
//memcpy(CurrentFunctionAddress,szOriginalFunctionCode,CODE_LENGTH);
WPON();
return TRUE;
}