Hi list,
I'm currently doing some memory analysis, and I'm using Notepad on Windows 7 x64 as an example.
My question is this: is there any way to link a _FILE_OBJECT back to the process that generated it, without a valid handle, or an entry in the VAD tree.
Here's an example:
I open notepad, and open a simple text file that contains "This is the contents of the file". Performing a scan over the memory dump reveals this data in two locations:
1 - 0x1448f000 - This is the contents of the file found through the _FILE_OBJECT->SectionObjectPointers->DataSectionObject. This points to a control area, and through that I can locate the Subsection-BasePTE which shows that the page is in transition and has a PFN of 0x1448f. So this allows me to the find the data through the _FILE_OBJECT
2 - 0x39d336b0 - This address is currently part of Notepad's private heap, which is where the data has been mapped into.
So examining the two pages through WinDbg gives me this information:
lkd> !pfn 1448f
PFN 0001448F at address FFFFFA80003CDAD0
flink 00015B8F blink / share count 00013ED5 pteaddress FFFFF8A0008AD010
reference count 0000 used entry count 0000 Cached color 0 Priority 5
restore pte FA800325553004C0 containing page 00ABBA Standby P
Shared
lkd> !pte FFFFF8A0008AD010 1
VA fffff8a0008ad010
PXE at FFFFF8A0008AD010 PPE at FFFFF8A0008AD010 PDE at FFFFF8A0008AD010 PTE at FFFFF8A0008AD010
contains 000000001448F8C0
not valid
Transition: 1448f
Protect: 6 - ReadWriteExecute
As can be seen, the page containing the original data is shared, is on the standby list, and points to a prototype PTE.
lkd> !pfn 39d33
PFN 00039D33 at address FFFFFA8000AD7990
flink 00039D88 blink / share count 00039D1E pteaddress FFFFF6800001CAC8
reference count 0000 used entry count 0000 Cached color 0 Priority 3
restore pte 1635500000080 containing page 0274B8 Standby
lkd> !pte FFFFF6800001CAC8 1
VA fffff6800001cac8
PXE at FFFFF6800001CAC8 PPE at FFFFF6800001CAC8 PDE at FFFFF6800001CAC8 PTE at FFFFF6800001CAC8
contains 0000000000000000
not valid
The PTE within Notepad's heap is marked as not valid, but also shows that the page is on the standby list.
As the page located through the FILE_OBJECT is marked as shared, and points to a prototype PTE, is there anyway of locating this prototype PTE, and using it to track back to Notepad? So for instance, would it be possible to locate the PPTE by searching memory for the 'MmSt' tag, and then parse the PPTE to gain any information. Or does the PPTE not track backwards in that way?
Essentially, if the page containing the data found through the _FILE_OBJECT is shared, what is it shared with, and is it possible to track this information, using either the PFN database, prototype PTE entries, or something else I haven't thought of.
Any input or advice would be appreciated.
Thanks
Josh.