parent
328b869cf7
commit
ce936023a2
@ -0,0 +1,101 @@
|
|||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: AlwaysBreak
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlines: DontAlign
|
||||||
|
AlignOperands: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterReturnType: TopLevel
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: true
|
||||||
|
BinPackArguments: false
|
||||||
|
BinPackParameters: false
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: true
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializers: AfterColon
|
||||||
|
BreakStringLiterals: false
|
||||||
|
ColumnLimit: 120
|
||||||
|
CommentPragmas: '^begin_wpp|^end_wpp|^FUNC |^USESUFFIX |^USESUFFIX '
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
IndentWidth: 4
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
Language: Cpp
|
||||||
|
MacroBlockBegin: '^BEGIN_MODULE$|^BEGIN_TEST_CLASS$|^BEGIN_TEST_METHOD$'
|
||||||
|
MacroBlockEnd: '^END_MODULE$|^END_TEST_CLASS$|^END_TEST_METHOD$'
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
PointerAlignment: Right
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: false
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Cpp11
|
||||||
|
StatementMacros: [
|
||||||
|
'EXTERN_C',
|
||||||
|
'PAGED',
|
||||||
|
'PAGEDX',
|
||||||
|
'NONPAGED',
|
||||||
|
'PNPCODE',
|
||||||
|
'INITCODE',
|
||||||
|
'_At_',
|
||||||
|
'_When_',
|
||||||
|
'_Success_',
|
||||||
|
'_Check_return_',
|
||||||
|
'_Must_inspect_result_',
|
||||||
|
'_IRQL_requires_',
|
||||||
|
'_IRQL_requires_max_',
|
||||||
|
'_IRQL_requires_min_',
|
||||||
|
'_IRQL_saves_',
|
||||||
|
'_IRQL_restores_',
|
||||||
|
'_IRQL_saves_global_',
|
||||||
|
'_IRQL_restores_global_',
|
||||||
|
'_IRQL_raises_',
|
||||||
|
'_IRQL_lowers_',
|
||||||
|
'_Acquires_lock_',
|
||||||
|
'_Releases_lock_',
|
||||||
|
'_Acquires_exclusive_lock_',
|
||||||
|
'_Releases_exclusive_lock_',
|
||||||
|
'_Acquires_shared_lock_',
|
||||||
|
'_Releases_shared_lock_',
|
||||||
|
'_Requires_lock_held_',
|
||||||
|
'_Use_decl_annotations_',
|
||||||
|
'_Guarded_by_',
|
||||||
|
'__drv_preferredFunction',
|
||||||
|
'__drv_allocatesMem',
|
||||||
|
'__drv_freesMem',
|
||||||
|
]
|
||||||
|
TabWidth: '4'
|
||||||
|
UseTab: Never
|
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Source.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="struct.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@ -1,3 +1,11 @@
|
|||||||
# FakeEnclave
|
# FakeEnclave
|
||||||
|
|
||||||
A poc that abuses Enclave
|
A poc that abuses Enclave
|
||||||
|
![image](https://user-images.githubusercontent.com/13917777/189128521-bf4e0691-bed8-41b1-aa7b-bd9ed17e39f7.png)
|
||||||
|
|
||||||
|
## What it can do?
|
||||||
|
- Anti-tamper
|
||||||
|
- There may be nothing to do
|
||||||
|
|
||||||
|
## Compile
|
||||||
|
- Visual Studio 2022 & WDK10
|
||||||
|
- llvm-msvc [[link]](https://github.com/NewWorldComingSoon/llvm-msvc-build)
|
||||||
|
@ -0,0 +1,183 @@
|
|||||||
|
#include <fltKernel.h>
|
||||||
|
#include <ntimage.h>
|
||||||
|
#include "struct.h"
|
||||||
|
|
||||||
|
#define YOUR_APP_NAME "dwm.exe"
|
||||||
|
|
||||||
|
#define dprintf(...) DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, __VA_ARGS__)
|
||||||
|
|
||||||
|
EXTERN_C
|
||||||
|
PCCHAR
|
||||||
|
NTAPI
|
||||||
|
PsGetProcessImageFileName(IN PEPROCESS Process);
|
||||||
|
|
||||||
|
EXTERN_C
|
||||||
|
PVOID
|
||||||
|
PsGetProcessSectionBaseAddress(__in PEPROCESS Process);
|
||||||
|
|
||||||
|
using fnMiObtainReferencedVadEx = void *(NTAPI *)(void *a1, char a2, int *a3);
|
||||||
|
|
||||||
|
__declspec(naked) PVOID GetNtosBase()
|
||||||
|
{
|
||||||
|
_asm {
|
||||||
|
mov rax, qword ptr gs:[18h]
|
||||||
|
mov rcx, [rax+38h]
|
||||||
|
mov rax, 0FFFFFFFFFFFFF000h
|
||||||
|
and rax, [rcx+4h]
|
||||||
|
jmp while_begin
|
||||||
|
search_begin:
|
||||||
|
add rax, 0FFFFFFFFFFFFF000h
|
||||||
|
while_begin:
|
||||||
|
xor ecx, ecx
|
||||||
|
jmp search_cmp
|
||||||
|
search_next:
|
||||||
|
add rcx, 1
|
||||||
|
cmp rcx, 0FF9h
|
||||||
|
jz search_begin
|
||||||
|
search_cmp:
|
||||||
|
cmp byte ptr[rax+rcx], 48h
|
||||||
|
jnz search_next
|
||||||
|
cmp byte ptr[rax+rcx+1], 8Dh
|
||||||
|
jnz search_next
|
||||||
|
cmp byte ptr[rax+rcx+2], 1Dh
|
||||||
|
jnz search_next
|
||||||
|
cmp byte ptr[rax+rcx+6], 0FFh
|
||||||
|
jnz search_next
|
||||||
|
mov r8d,[rax+rcx+3]
|
||||||
|
lea edx,[rcx+r8]
|
||||||
|
add edx, eax
|
||||||
|
add edx, 7
|
||||||
|
test edx, 0FFFh
|
||||||
|
jnz search_next
|
||||||
|
mov rdx, 0FFFFFFFF00000000h
|
||||||
|
and rdx, rax
|
||||||
|
add r8d, eax
|
||||||
|
lea eax,[rcx+r8]
|
||||||
|
add eax, 7
|
||||||
|
or rax, rdx
|
||||||
|
ret
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static PUCHAR
|
||||||
|
FindPattern(PVOID Module, ULONG Size, LPCSTR Pattern, LPCSTR Mask)
|
||||||
|
{
|
||||||
|
auto checkMask = [](PUCHAR Buffer, LPCSTR Pattern, LPCSTR Mask) -> bool {
|
||||||
|
for (auto x = Buffer; *Mask; Pattern++, Mask++, x++)
|
||||||
|
{
|
||||||
|
auto addr = *(UCHAR *)(Pattern);
|
||||||
|
if (addr != *x && *Mask != '?')
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto x = 0; x < Size - strlen(Mask); x++)
|
||||||
|
{
|
||||||
|
auto addr = (PUCHAR)Module + x;
|
||||||
|
if (checkMask(addr, Pattern, Mask))
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PEPROCESS
|
||||||
|
FindDWMEprocess(ULONG &OutPid)
|
||||||
|
{
|
||||||
|
OutPid = 0;
|
||||||
|
PEPROCESS pEpDWM = nullptr;
|
||||||
|
for (ULONG i = 0; i < 0x5000; i += 4)
|
||||||
|
{
|
||||||
|
PEPROCESS pEp = nullptr;
|
||||||
|
auto lStatus = PsLookupProcessByProcessId((HANDLE)i, &pEp);
|
||||||
|
if (!NT_SUCCESS(lStatus) || !pEp)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto pName = PsGetProcessImageFileName(pEp);
|
||||||
|
// A more casual code
|
||||||
|
if (pName && strstr(pName, YOUR_APP_NAME))
|
||||||
|
{
|
||||||
|
pEpDWM = pEp;
|
||||||
|
}
|
||||||
|
ObDereferenceObject(pEp);
|
||||||
|
|
||||||
|
if (pEpDWM)
|
||||||
|
{
|
||||||
|
OutPid = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pEpDWM;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN_C
|
||||||
|
NTSTATUS
|
||||||
|
DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
|
||||||
|
{
|
||||||
|
dprintf("new world!\n");
|
||||||
|
|
||||||
|
PVOID pNtosBase = GetNtosBase();
|
||||||
|
dprintf("pNtosBase=%p\n", pNtosBase);
|
||||||
|
|
||||||
|
// 48 89 5C 24 10 48 89 74 24 18 48 89 7C 24 20 41 54 41 56 41 57 48 83 EC 20 41 C7 00 00 00 00 00 4D 8B E0 65 48 8B
|
||||||
|
// ?? ?? 88 01 00 00 44 8B ?? 48 8B ?? ?? ?? ?? B8 00 00 00
|
||||||
|
fnMiObtainReferencedVadEx pMiObtainReferencedVadEx = (fnMiObtainReferencedVadEx)FindPattern(
|
||||||
|
((PUCHAR)pNtosBase + 0x1000),
|
||||||
|
0x50000,
|
||||||
|
"\x48\x89\x5C\x24\x10\x48\x89\x74\x24\x18\x48\x89\x7C\x24\x20\x41\x54\x41\x56\x41\x57\x48\x83\xEC\x20\x41\xC7\x00\x00\x00\x00\x00\x4D\x8B\xE0\x65\x48\x8B\x00\x00\x88\x01\x00\x00\x44\x8B\x00\x48\x8B\x00\x00\x00\x00\xB8\x00\x00\x00",
|
||||||
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx??xxxxxx?xx????xxxx");
|
||||||
|
dprintf("pMiObtainReferencedVadEx=%p\n", pMiObtainReferencedVadEx);
|
||||||
|
|
||||||
|
if (!pMiObtainReferencedVadEx)
|
||||||
|
{
|
||||||
|
dprintf("Error: Not found MiObtainReferencedVadEx!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG uDWMPID;
|
||||||
|
PEPROCESS pEpDWM = FindDWMEprocess(uDWMPID);
|
||||||
|
dprintf("pEpDWM=%p, uDWMPID=%d!\n", pEpDWM, uDWMPID);
|
||||||
|
if (uDWMPID == 0)
|
||||||
|
{
|
||||||
|
dprintf("Error: Not found DWM!\n");
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
PUCHAR pFirstPage = (PUCHAR)PsGetProcessSectionBaseAddress(pEpDWM) + 0x1000;
|
||||||
|
dprintf("pFirstPage=%p!\n", pFirstPage);
|
||||||
|
|
||||||
|
KAPC_STATE ks;
|
||||||
|
KeStackAttachProcess(pEpDWM, &ks);
|
||||||
|
|
||||||
|
PETHREAD pCurThread = KeGetCurrentThread();
|
||||||
|
short uOldSpecialApcDisable = *(short *)((PUCHAR)pCurThread + SpecialApcDisable_17763_OFFSET);
|
||||||
|
|
||||||
|
*(short *)((PUCHAR)pCurThread + SpecialApcDisable_17763_OFFSET) = 0;
|
||||||
|
|
||||||
|
int ns = 0;
|
||||||
|
auto pVAD = (PMMVAD_SHORT_17763)pMiObtainReferencedVadEx(pFirstPage, 2, &ns);
|
||||||
|
|
||||||
|
*(short *)((PUCHAR)pCurThread + SpecialApcDisable_17763_OFFSET) = uOldSpecialApcDisable;
|
||||||
|
|
||||||
|
KeUnstackDetachProcess(&ks);
|
||||||
|
|
||||||
|
dprintf("pVAD=%p\n", pVAD);
|
||||||
|
if (pVAD)
|
||||||
|
{
|
||||||
|
dprintf("pVAD->u.VadFlags.PrivateMemory=%d\n", pVAD->u.VadFlags.PrivateMemory);
|
||||||
|
dprintf("pVAD->u.VadFlags.Graphics=%d\n", pVAD->u.VadFlags.Graphics);
|
||||||
|
dprintf("pVAD->u.VadFlags.Enclave=%d\n", pVAD->u.VadFlags.Enclave);
|
||||||
|
|
||||||
|
pVAD->u.VadFlags.PrivateMemory = 1;
|
||||||
|
pVAD->u.VadFlags.Graphics = 1;
|
||||||
|
pVAD->u.VadFlags.Enclave = 1;
|
||||||
|
dprintf("fake world!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_VIRUS_INFECTED;
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <fltKernel.h>
|
||||||
|
|
||||||
|
typedef struct _EX_PUSH_LOCK_17763
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct /* bitfield */
|
||||||
|
{
|
||||||
|
/* 0x0000 */ unsigned __int64 Locked : 1; /* bit position: 0 */
|
||||||
|
/* 0x0000 */ unsigned __int64 Waiting : 1; /* bit position: 1 */
|
||||||
|
/* 0x0000 */ unsigned __int64 Waking : 1; /* bit position: 2 */
|
||||||
|
/* 0x0000 */ unsigned __int64 MultipleShared : 1; /* bit position: 3 */
|
||||||
|
/* 0x0000 */ unsigned __int64 Shared : 60; /* bit position: 4 */
|
||||||
|
}; /* bitfield */
|
||||||
|
/* 0x0000 */ unsigned __int64 Value;
|
||||||
|
/* 0x0000 */ void *Ptr;
|
||||||
|
}; /* size: 0x0008 */
|
||||||
|
} EX_PUSH_LOCK_17763, *PEX_PUSH_LOCK_17763; /* size: 0x0008 */
|
||||||
|
|
||||||
|
typedef struct _MMVAD_FLAGS_17763
|
||||||
|
{
|
||||||
|
struct /* bitfield */
|
||||||
|
{
|
||||||
|
/* 0x0000 */ unsigned long VadType : 3; /* bit position: 0 */
|
||||||
|
/* 0x0000 */ unsigned long Protection : 5; /* bit position: 3 */
|
||||||
|
/* 0x0000 */ unsigned long PreferredNode : 6; /* bit position: 8 */
|
||||||
|
/* 0x0000 */ unsigned long PrivateMemory : 1; /* bit position: 14 */
|
||||||
|
/* 0x0000 */ unsigned long PrivateFixup : 1; /* bit position: 15 */
|
||||||
|
/* 0x0000 */ unsigned long Graphics : 1; /* bit position: 16 */
|
||||||
|
/* 0x0000 */ unsigned long Enclave : 1; /* bit position: 17 */
|
||||||
|
/* 0x0000 */ unsigned long PageSize64K : 1; /* bit position: 18 */
|
||||||
|
/* 0x0000 */ unsigned long ShadowStack : 1; /* bit position: 19 */
|
||||||
|
/* 0x0000 */ unsigned long Spare : 6; /* bit position: 20 */
|
||||||
|
/* 0x0000 */ unsigned long HotPatchAllowed : 1; /* bit position: 26 */
|
||||||
|
/* 0x0000 */ unsigned long NoChange : 1; /* bit position: 27 */
|
||||||
|
/* 0x0000 */ unsigned long ManySubsections : 1; /* bit position: 28 */
|
||||||
|
/* 0x0000 */ unsigned long DeleteInProgress : 1; /* bit position: 29 */
|
||||||
|
/* 0x0000 */ unsigned long LockContended : 1; /* bit position: 30 */
|
||||||
|
/* 0x0000 */ unsigned long Lock : 1; /* bit position: 31 */
|
||||||
|
}; /* bitfield */
|
||||||
|
} MMVAD_FLAGS_17763, *PMMVAD_FLAGS_17763; /* size: 0x0004 */
|
||||||
|
|
||||||
|
typedef struct _MMVAD_SHORT_17763
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/* 0x0000 */ struct _MMVAD_SHORT *NextVad;
|
||||||
|
/* 0x0008 */ void *ExtraCreateInfo;
|
||||||
|
}; /* size: 0x0010 */
|
||||||
|
/* 0x0000 */ struct _RTL_BALANCED_NODE VadNode;
|
||||||
|
}; /* size: 0x0018 */
|
||||||
|
/* 0x0018 */ unsigned long StartingVpn;
|
||||||
|
/* 0x001c */ unsigned long EndingVpn;
|
||||||
|
/* 0x0020 */ unsigned char StartingVpnHigh;
|
||||||
|
/* 0x0021 */ unsigned char EndingVpnHigh;
|
||||||
|
/* 0x0022 */ unsigned char CommitChargeHigh;
|
||||||
|
/* 0x0023 */ unsigned char SpareNT64VadUChar;
|
||||||
|
/* 0x0024 */ long ReferenceCount;
|
||||||
|
/* 0x0028 */ struct _EX_PUSH_LOCK_17763 PushLock;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
/* 0x0030 */ unsigned long LongFlags;
|
||||||
|
/* 0x0030 */ struct _MMVAD_FLAGS_17763 VadFlags;
|
||||||
|
/* 0x0030 */ volatile unsigned long VolatileVadLong;
|
||||||
|
}; /* size: 0x0004 */
|
||||||
|
} /* size: 0x0004 */ u;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
/* 0x0034 */ unsigned long LongFlags1;
|
||||||
|
///* 0x0034 */ struct _MMVAD_FLAGS1 VadFlags1;
|
||||||
|
}; /* size: 0x0004 */
|
||||||
|
} /* size: 0x0004 */ u1;
|
||||||
|
/* 0x0038 */ struct _MI_VAD_EVENT_BLOCK *EventList;
|
||||||
|
} MMVAD_SHORT_17763, *PMMVAD_SHORT_17763; /* size: 0x0040 */
|
||||||
|
|
||||||
|
#define SpecialApcDisable_17763_OFFSET (0x01e6)
|
Loading…
Reference in new issue