From 5891fabbacfe0bcbb73542e2b47642eee2db94ac Mon Sep 17 00:00:00 2001 From: Ulf Frisk Date: Fri, 8 Mar 2019 12:00:58 +0100 Subject: [PATCH] Version 2.2 --- README.md | 4 ++++ files/vmm.dll | Bin 136192 -> 136704 bytes files/vmm.lib | Bin 10500 -> 10692 bytes files/vmmdll.h | 13 ++++++++++++- files/vmmpy.py | 13 +++++++++++++ files/vmmpyc.pyd | Bin 35840 -> 36352 bytes vmm/m_status.c | 2 +- vmm/pluginmanager.c | 2 ++ vmm/statistics.c | 5 +++-- vmm/statistics.h | 11 ++++++----- vmm/version.h | 2 +- vmm/vmm.c | 12 ++++++++++++ vmm/vmmdll.c | 36 ++++++++++++++++++++++++++++++++++++ vmm/vmmdll.def | 1 + vmm/vmmdll.h | 13 ++++++++++++- vmm/vmmproc.c | 4 ++-- vmm/vmmproc.h | 2 +- vmmpyc/version.h | 2 +- vmmpyc/vmmdll.h | 13 ++++++++++++- vmmpyc/vmmpyc.c | 15 +++++++++++++++ 20 files changed, 134 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 3695088..edee4a9 100644 --- a/README.md +++ b/README.md @@ -143,3 +143,7 @@ v2.1 * IAT/EAT hook functionality. * Limited Windows 10 MemCompression support. * Bug fixes. + +v2.2 +* New API: + * Force refresh of process list and caches. diff --git a/files/vmm.dll b/files/vmm.dll index 838340eaf5a6251fbb0df43e9fc529c8ed0b9790..4adf8c47fa50c002853890ff7457b1568fbb6c4d 100644 GIT binary patch delta 41640 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 delta 40871 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

hMlYdbMl)q>e##vr+V$^{4C}9 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 @@ -50,6 +50,17 @@ BOOL VMMDLL_Initialize(_In_ DWORD argc, _In_ LPSTR argv[]); _Success_(return) BOOL VMMDLL_Close(); +/* +* Perform a force refresh of all internal caches including: +* - process listings +* - memory cache +* - page table cache +* WARNING: function may take some time to execute! +* -- dwReserved = reserved future use - must be zero +* -- return = sucess/fail +*/ +_Success_(return) +BOOL VMMDLL_Refresh(_In_ DWORD dwReserved); //----------------------------------------------------------------------------- diff --git a/files/vmmpy.py b/files/vmmpy.py index 65d65fe..8db72fb 100644 --- a/files/vmmpy.py +++ b/files/vmmpy.py @@ -62,6 +62,19 @@ def VmmPy_Close(): +def VmmPy_Refresh(): + """Force refresh the internal state of the VMM.DLL - refreshing process listings and internal caches. NB! function may take a long time to execute! + + Keyword arguments: + N/A + + Example: + VmmPy_Refresh() + """ + VMMPYC_Refresh(0) + + + def VmmPy_Initialize(args, is_printf = True, is_verbose = False, is_verbose_extra = False, is_verbose_tlp = False, page_table_base = 0): """Initialize VmmPy and the Virtual Memory Manager VMM.DLL with arguments as in the argument list args. Important is the -device option and optionally diff --git a/files/vmmpyc.pyd b/files/vmmpyc.pyd index 0b9a4c271cdfb2c26f389a06396dbbca6cf52cfe..66638a8409eee28fc97433a60c9675d248431137 100644 GIT binary patch literal 36352 zcmeHw3wTwG5L)~5%;e!b4G=M|Oe4UN^lIVmaQGZgFB zj6Fa7&a8+3Xy5l;d-WghNBP;DN8Wt^=_f@peKzNZ@7~Ms9q)dN(;vV4Akv99OMHsw z5iWmc)+2x12Y8C-p?AN_>BA~5{UepXGixEIDV|3eUQ$<8OKqQSq{aC{RNpm5_`lz_ z#-=$Y&etczPf8U_09hfSt;>+6a=sN}k@1@MA9s*n{z44}WKyXJ&^%^@HU z<=_u>nZ~ZhfgE4D5EXL*)s>-2*pVBc3f%K>FU9S+JTR|0l1$W&2cjD{391>lC?M~FtYXm!k zblsZa$+Emi+@0^aIvxba0`tSX$Q_33JP$gCj+(Dn+9jxJn1>D1Nd8;f4yo%@R|n-x zkG?|>&F$!GJ}0O566#SzyN5fS@*WaPTUQLCTz!X!t-QdMx6erEAHL8qa}Db1^t_1Y z64a@Xbw1)cS*XJVU1O|$M*CCA3qN(;>9;KFZA$Lt!E-N;72b5w0&=OKM&*$h|bb(aS}vq0(($uzB~t) zp~eG~e%f#hXb-s1fHE!ZyXYG5;ks7gdTz_x}#{hEnXzvJyjSXXY) zSlaVWg5S?pqqcQLsb?id*aQnadt`(jubHxjYQn=UGP+<3G&Gp$9)h?DqN5v~Xd>%9 z!yJHHTV!bm(RqwplkU$$%50P^Hr>Gf&+YB1X8#A)Uh@cO&yzxT`oFCGmgWJ$&?8uQ zjIPHswqP1$?I(Y?I^X=Dpzh`7R2o^wH9$K&pWAS9v9!(T&CnX~C|v(kv(fcHMl10- zNHe6?FrO#)S6mobBnD?MAV&Y5-}z4Hwt~p*2}WemXEil7uJbxjflxGJ^N^*TMat>y zb9KDVV24|bb9L-v*np*ZiK_jCfm*HLvvBqs6|Ngqv z+g@;BTQI4NUUHr1XK^oUF+UH`WNSq=((Ogdh=}6~h~I-ML*D?3+!t*2R+_~&A2^Gr z$V4$oP8eochGD>0%xA9wXf{Pmx}`0K2$g4hnzP^mqk-X`XK8(if6>#qvZpuNJ^eih zho^z%d`pXPrRNclSlZW_99^c)Km*k2=!pKFi9-9{T3hT!+tD42Pg;Ozm*w5TK1F#m z4|_9;C4XXq#mv$oYP1p=~d5#Uk}&MmMu3Yv{D#(ZI=L zY0p7`?1y*2s4Q(MI1Rnags+gC2aqK>|09e)%+%E%KAf(QU$oKos?qb^W;31 zYji!F(TB2^>=Cy40BMTaB*|RIb>Alt;>*{=Iw>SO56dL<13g*VIgnjvUuf(v;0(lY zd=>%$Fu9t$fskqrSCuW$YAV|fPlI--Uy#gEnx+&d{(=7d^bAB4AM6X^$L~gQ?JSb0T&MJ&) zH75A}_LIhx34uqnLD&TK?oyghdY<_gOS>1{gQ<

Km%SqLsCuo)wxb?F-z}AURn~ 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 &= ~VMM_FLAG_PROCESS_SHOW_TERMINATED; ctxVmm->flags |= fEnable ? VMM_FLAG_PROCESS_SHOW_TERMINATED : 0; - VmmProc_Refresh(TRUE); + VmmProc_RefreshProcesses(TRUE); } return nt; } diff --git a/vmm/pluginmanager.c b/vmm/pluginmanager.c index 75d745f..d0a15a4 100644 --- a/vmm/pluginmanager.c +++ b/vmm/pluginmanager.c @@ -305,6 +305,7 @@ BOOL PluginManager_Initialize() if(ctxVmm->pVmmVfsModuleList) { return FALSE; } // already initialized ZeroMemory(&ri, sizeof(VMMDLL_PLUGIN_REGINFO)); // 1: process built-in modules + EnterCriticalSection(&ctxVmm->MasterLock); PluginManager_Initialize_RegInfoInit(&ri, NULL); M_Virt2Phys_Initialize(&ri); PluginManager_Initialize_RegInfoInit(&ri, NULL); @@ -344,5 +345,6 @@ BOOL PluginManager_Initialize() } // 3: process 'special status' python plugin manager. PluginManager_Initialize_Python(); + LeaveCriticalSection(&ctxVmm->MasterLock); return TRUE; } diff --git a/vmm/statistics.c b/vmm/statistics.c index ca23bcd..44164da 100644 --- a/vmm/statistics.c +++ b/vmm/statistics.c @@ -77,7 +77,7 @@ VOID _PageStatShowUpdate(_Inout_ PPAGE_STATISTICS ps) " Pages read: %llu / %llu (%llu%%) \n" \ " Pages failed: %llu (%llu%%) \n", ps->szAction, - ps->fKMD ? "KMD (kernel module assisted DMA)" : "DMA (hardware only) ", + ps->fKMD ? "KMD (kernel module assisted DMA)" : "Normal ", (ps->cPageSuccess + ps->cPageFail) / 256, ps->cPageTotal / 256, qwPercentTotal, @@ -99,7 +99,7 @@ VOID _PageStatShowUpdate(_Inout_ PPAGE_STATISTICS ps) " Pages read: %llu \n" \ " Pages failed: %llu \n", ps->szAction, - ps->fKMD ? "KMD (kernel module assisted DMA)" : "DMA (hardware only) ", + ps->fKMD ? "KMD (kernel module assisted DMA)" : "Normal ", (ps->cPageSuccess + ps->cPageFail) / 256, (isMBs ? qwSpeed >> 10 : qwSpeed), (isMBs ? "MB/s" : "kB/s"), @@ -202,6 +202,7 @@ const LPSTR NAMES_VMM_STATISTICS_CALL[] = { "VMMDLL_WinGetThunkEAT", "VMMDLL_WinGetThunkIAT", "VMMDLL_WinMemCompression_DecompressPage", + "VMMDLL_Refresh", "PluginManager_List", "PluginManager_Read", "PluginManager_Write", diff --git a/vmm/statistics.h b/vmm/statistics.h index 298f28c..11dc164 100644 --- a/vmm/statistics.h +++ b/vmm/statistics.h @@ -92,11 +92,12 @@ VOID PageStatUpdate(_In_opt_ PPAGE_STATISTICS pPageStat, _In_ QWORD qwAddr, _In_ #define STATISTICS_ID_VMMDLL_WinGetThunkEAT 0x16 #define STATISTICS_ID_VMMDLL_WinGetThunkIAT 0x17 #define STATISTICS_ID_VMMDLL_WinMemCompression_DecompressPage 0x18 -#define STATISTICS_ID_PluginManager_List 0x19 -#define STATISTICS_ID_PluginManager_Read 0x1a -#define STATISTICS_ID_PluginManager_Write 0x1b -#define STATISTICS_ID_PluginManager_Notify 0x1c -#define STATISTICS_ID_MAX 0x1c +#define STATISTICS_ID_VMMDLL_Refresh 0x19 +#define STATISTICS_ID_PluginManager_List 0x1a +#define STATISTICS_ID_PluginManager_Read 0xab +#define STATISTICS_ID_PluginManager_Write 0x1c +#define STATISTICS_ID_PluginManager_Notify 0x1d +#define STATISTICS_ID_MAX 0x1d #define STATISTICS_ID_NOLOG 0xffffffff VOID Statistics_CallSetEnabled(_In_ BOOL fEnabled); diff --git a/vmm/version.h b/vmm/version.h index 5720f62..b428978 100644 --- a/vmm/version.h +++ b/vmm/version.h @@ -2,7 +2,7 @@ #define STRINGIZE(s) STRINGIZE2(s) #define VERSION_MAJOR 2 -#define VERSION_MINOR 1 +#define VERSION_MINOR 2 #define VERSION_REVISION 0 #define VERSION_BUILD 0 diff --git a/vmm/vmm.c b/vmm/vmm.c index 30b9181..5a11a06 100644 --- a/vmm/vmm.c +++ b/vmm/vmm.c @@ -383,10 +383,22 @@ VOID VmmCacheClear(_In_ WORD wTblTag) { DWORD i; PVMM_CACHE_TABLE t; + PVMM_PROCESS pObProcess = NULL; + // 1: clear cache t = VmmCacheTableGet(wTblTag); for(i = 0; i < VMM_CACHE2_REGIONS; i++) { VmmCacheReclaim(t, i, TRUE); } + // 2: if tlb cache clear -> update process 'is spider done' flag + if(wTblTag == VMM_CACHE_TAG_TLB) { + while((pObProcess = VmmProcessGetNext(pObProcess))) { + if(pObProcess->fTlbSpiderDone) { + EnterCriticalSection(&pObProcess->LockUpdate); + pObProcess->fTlbSpiderDone = FALSE; + LeaveCriticalSection(&pObProcess->LockUpdate); + } + } + } } VOID VmmCache_CallbackRefCount1(PVMMOB_MEM pOb) diff --git a/vmm/vmmdll.c b/vmm/vmmdll.c index c946933..b1abad6 100644 --- a/vmm/vmmdll.c +++ b/vmm/vmmdll.c @@ -491,6 +491,42 @@ BOOL VMMDLL_VfsInitializePlugins() PluginManager_Initialize()) } + + +//----------------------------------------------------------------------------- +// REFRESH FUNCTIONALITY BELOW: +//----------------------------------------------------------------------------- + +_Success_(return) +BOOL VMMDLL_Refresh_Impl(_In_ DWORD dwReserved) +{ + ULONG64 paMax; + // enforce global lock even if 'multi thread' is enabled + // we wish to avoid parallel process refreshes ... + EnterCriticalSection(&ctxVmm->MasterLock); + VmmCacheClear(VMM_CACHE_TAG_PHYS); + VmmCacheClear(VMM_CACHE_TAG_TLB); + VmmProc_RefreshProcesses(TRUE); + // update max physical address (if volatile). + if(ctxMain->dev.fVolatileMaxAddress) { + if(LeechCore_GetOption(LEECHCORE_OPT_MEMORYINFO_ADDR_MAX, &paMax) && (paMax > 0x01000000)) { + ctxMain->dev.paMax = paMax; + } + } + LeaveCriticalSection(&ctxVmm->MasterLock); + return TRUE; +} + +_Success_(return) +BOOL VMMDLL_Refresh(_In_ DWORD dwReserved) +{ + CALL_SYNCHRONIZED_IMPLEMENTATION_VMM( + STATISTICS_ID_VMMDLL_Refresh, + VMMDLL_Refresh_Impl(dwReserved)) +} + + + //----------------------------------------------------------------------------- // VMM CORE FUNCTIONALITY BELOW: //----------------------------------------------------------------------------- diff --git a/vmm/vmmdll.def b/vmm/vmmdll.def index 5e61a51..ce972b7 100644 --- a/vmm/vmmdll.def +++ b/vmm/vmmdll.def @@ -2,6 +2,7 @@ LIBRARY VMM EXPORTS VMMDLL_Initialize VMMDLL_Close + VMMDLL_Refresh VMMDLL_ConfigGet VMMDLL_ConfigSet diff --git a/vmm/vmmdll.h b/vmm/vmmdll.h index 42befa8..6b1e71b 100644 --- a/vmm/vmmdll.h +++ b/vmm/vmmdll.h @@ -4,7 +4,7 @@ // (c) Ulf Frisk, 2018-2019 // Author: Ulf Frisk, pcileech@frizk.net // -// Header Version: 2.1 +// Header Version: 2.2 // #include @@ -50,6 +50,17 @@ BOOL VMMDLL_Initialize(_In_ DWORD argc, _In_ LPSTR argv[]); _Success_(return) BOOL VMMDLL_Close(); +/* +* Perform a force refresh of all internal caches including: +* - process listings +* - memory cache +* - page table cache +* WARNING: function may take some time to execute! +* -- dwReserved = reserved future use - must be zero +* -- return = sucess/fail +*/ +_Success_(return) +BOOL VMMDLL_Refresh(_In_ DWORD dwReserved); //----------------------------------------------------------------------------- diff --git a/vmm/vmmproc.c b/vmm/vmmproc.c index 6fa488a..5c35a74 100644 --- a/vmm/vmmproc.c +++ b/vmm/vmmproc.c @@ -37,7 +37,7 @@ BOOL VmmProcUserCR3TryInitialize64() return TRUE; } -BOOL VmmProc_Refresh(_In_ BOOL fRefreshTotal) +BOOL VmmProc_RefreshProcesses(_In_ BOOL fRefreshTotal) { BOOL result; PVMM_PROCESS pObProcessSystem; @@ -116,7 +116,7 @@ DWORD VmmProcCacheUpdaterThread() } // refresh proc list if(fProcPartial || fProcTotal) { - if(!VmmProc_Refresh(fProcTotal)) { + if(!VmmProc_RefreshProcesses(fProcTotal)) { vmmprintf("VmmProc: Failed to refresh memory process file system - aborting.\n"); LeaveCriticalSection(&ctxVmm->MasterLock); goto fail; diff --git a/vmm/vmmproc.h b/vmm/vmmproc.h index 595b02c..2fbf814 100644 --- a/vmm/vmmproc.h +++ b/vmm/vmmproc.h @@ -12,7 +12,7 @@ * -- fRefreshTotal = full refresh of processes should be done instead of partial. * -- return */ -BOOL VmmProc_Refresh(_In_ BOOL fRefreshTotal); +BOOL VmmProc_RefreshProcesses(_In_ BOOL fRefreshTotal); /* * Load operating system dependant module names, such as parsed from PE or ELF diff --git a/vmmpyc/version.h b/vmmpyc/version.h index 3faa79f..a2ebf60 100644 --- a/vmmpyc/version.h +++ b/vmmpyc/version.h @@ -2,7 +2,7 @@ #define STRINGIZE(s) STRINGIZE2(s) #define VERSION_MAJOR 2 -#define VERSION_MINOR 1 +#define VERSION_MINOR 2 #define VERSION_REVISION 0 #define VERSION_BUILD 0 diff --git a/vmmpyc/vmmdll.h b/vmmpyc/vmmdll.h index 42befa8..6b1e71b 100644 --- a/vmmpyc/vmmdll.h +++ b/vmmpyc/vmmdll.h @@ -4,7 +4,7 @@ // (c) Ulf Frisk, 2018-2019 // Author: Ulf Frisk, pcileech@frizk.net // -// Header Version: 2.1 +// Header Version: 2.2 // #include @@ -50,6 +50,17 @@ BOOL VMMDLL_Initialize(_In_ DWORD argc, _In_ LPSTR argv[]); _Success_(return) BOOL VMMDLL_Close(); +/* +* Perform a force refresh of all internal caches including: +* - process listings +* - memory cache +* - page table cache +* WARNING: function may take some time to execute! +* -- dwReserved = reserved future use - must be zero +* -- return = sucess/fail +*/ +_Success_(return) +BOOL VMMDLL_Refresh(_In_ DWORD dwReserved); //----------------------------------------------------------------------------- diff --git a/vmmpyc/vmmpyc.c b/vmmpyc/vmmpyc.c index 0bb625b..c3d03a5 100644 --- a/vmmpyc/vmmpyc.c +++ b/vmmpyc/vmmpyc.c @@ -58,6 +58,20 @@ VMMPYC_Close(PyObject *self, PyObject *args) return Py_BuildValue("s", NULL); // None returned on success. } +// (DWORD) -> None +static PyObject* +VMMPYC_Refresh(PyObject *self, PyObject *args) +{ + BOOL result; + DWORD dwReserved = 0; + if(!PyArg_ParseTuple(args, "k", &dwReserved)) { return NULL; } + Py_BEGIN_ALLOW_THREADS; + result = VMMDLL_Refresh(dwReserved); + Py_END_ALLOW_THREADS; + if(!result) { return PyErr_Format(PyExc_RuntimeError, "VMMPYC_Refresh: Refresh failed."); } + return Py_BuildValue("s", NULL); // None returned on success. +} + //----------------------------------------------------------------------------- @@ -946,6 +960,7 @@ VMMPYC_VfsList(PyObject *self, PyObject *args) static PyMethodDef VMMPYC_EmbMethods[] = { {"VMMPYC_Initialize", VMMPYC_Initialize, METH_VARARGS, "Initialize the VMM"}, {"VMMPYC_Close", VMMPYC_Close, METH_VARARGS, "Try close the VMM"}, + {"VMMPYC_Refresh", VMMPYC_Refresh, METH_VARARGS, "Force refresh the VMM (process listings and caches)."}, {"VMMPYC_ConfigGet", VMMPYC_ConfigGet, METH_VARARGS, "Get a device specific option value."}, {"VMMPYC_ConfigSet", VMMPYC_ConfigSet, METH_VARARGS, "Set a device specific option value."}, {"VMMPYC_MemReadScatter", VMMPYC_MemReadScatter, METH_VARARGS, "Read multiple 4kB page sized and aligned chunks of memory given as an address list."},