我有运行Windows Server 2012 R2的VM的内存转储。转储是整个RAM(4 GB)的一部分。

我想从此转储中提取尽可能多的功能。主要是我想提取机器上运行的所有线程的所有堆栈并存在于内存中。或者,我想提取所有线程的调用序列。

是否有任何工具/教程/书籍等可以帮助我执行此任务?

我熟悉Volatility和Rekall,是否有任何特定的插件可以帮助我实现目标?

评论

我可能误解了您的问题,但是为什么不简单地在Volatility中使用pstree命令,然后通过procmemdump,dlldump或memdump管理某些内容呢?但是,我一定错过了一些事情。

我不确定,但是如何使用这些命令提取进程的堆栈或调用顺序?

好了,您可以转储进程的内存。它肯定包含堆栈...但是,您看到的是,您的问题缺少对所需内容的精确定义,因为最后您将使用哪种堆栈表示形式?

@perror:我假设OP想要提取调用堆栈或回溯(例如Windbg的k或GDB的bt)。

#1 楼

我不确定您要寻找的内容,让我尝试一下

我也有一个vm的转储文件,MEMORY.dmp也来自运行xp sp3的vm的vm,它是使用附加到内核调试器的.crash创建的

我使用windbg如下加载它

windbg -z memory.dmp 


现在我想我会计算正在运行的线程数,所以我做了这样的事情

kd> r $t0 = 0; !for_each_thread "r $t0= @$t0+1" ; ? @$t0
Evaluate expression: 306 = 00000132


现在让我看到所有线程的调用堆栈,这样我就可以了

kd> !for_each_thread  ".thread @#Thread ; k2"


它吐出了

Implicit thread is now 812915b8
 # ChildEBP RetAddr  
00 fc8d37b4 804dc0f7 nt!KiSwapContext+0x2e
01 fc8d37c0 804e3b7d nt!KiSwapThread+0x46
Implicit thread is now 8128eda8
 # ChildEBP RetAddr  
00 fc8e3d34 804dc0f7 nt!KiSwapContext+0x2e
01 fc8e3d40 804e407e nt!KiSwapThread+0x46
Implicit thread is now 8128eb30
 # ChildEBP RetAddr  
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


好,而不是k2我得到了完整的堆栈跟踪

Implicit thread is now 810efda8
  *** Stack trace for last set context - .thread/.cxr resets it
 # ChildEBP RetAddr  
00 f8ad3c38 804dc0f7 nt!KiSwapContext+0x2e
01 f8ad3c44 804dc143 nt!KiSwapThread+0x46
02 f8ad3c6c bf802f52 nt!KeWaitForSingleObject+0x1c2
03 f8ad3ca8 bf801b2a win32k!xxxSleepThread+0x192
04 f8ad3cec bf819e6c win32k!xxxRealInternalGetMessage+0x418
05 f8ad3d4c 804de7ec win32k!NtUserGetMessage+0x27
06 f8ad3d4c 7c90e4f4 nt!KiFastCallEntry+0xf8
07 0007fe24 7e4191be ntdll!KiFastSystemCallRet
08 0007fe44 0100a740 USER32!NtUserGetMessage+0xc
09 0007fe80 0100c216 wmiprvse!WindowsDispatch+0x31
0a 0007ff14 0100c314 wmiprvse!Process+0x225
0b 0007ff1c 010247aa wmiprvse!WinMain+0x4e
0c 0007ffc0 7c817067 wmiprvse!WinMainCRTStartup+0x174
0d 0007fff0 00000000 kernel32!BaseProcessStart+0x23
Implicit thread is now 8113b960
  *** Stack trace for last set context - .thread/.cxr resets it

XXXXXXXXXXXXXXXX


希望您的查询是如果没有回答,请解释调用顺序是什么意思

如果Igor Skochinsky发表评论,请回答

如果文件的格式是原始的,例如用matthieu捕获现在停止运行的win32dd.exe可以使用volatility的插件raw2dmp并在windbg中使用生成的与windbg兼容的dmpfile,如上

vol 25 -f foo.dmp --profile = Win7SP1x86 imageinfo

Volatility Foundation Volatility Framework 2.5
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP0x86, Win7SP1x86
                     AS Layer1 : IA32PagedMemoryPae (Kernel AS)
                     AS Layer2 : FileAddressSpace (E:\vola\foo.dmp)
                      PAE type : PAE
                           DTB : 0x185000L
                          KDBG : 0x82d32c28L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0x82d33c00L
             KUSER_SHARED_DATA : 0xffdf0000L
           Image date and time : 2016-06-02 18:08:14 UTC+0000


vol25 -f foo.dmp --profile = Win7SP1x86 raw2dmp --output-image = foowind.dmp

Volatility Foundation Volatility Framework 2.5
Writing data (5.00 MB chunks): |.....


dumpchk.exe foowind.dmp

Loading dump file foowind.dmp

Microsoft (R) Windows Debugger Version 10.0.10586.567 X86
Copyright (c) Microsoft Corporation. All rights reserved.

Loading Dump File [xxx\foowind.dmp]
Kernel Complete Dump File: Full address space is available

Comment: 'File was converted with Volatility'
xxxxxxxxxxxxxxxxxxxxxxx
*** ERROR: Module load completed but symbols could not be loaded for win32dd.exe
Cannot find frame 0x6c, previous scope unchanged
*** ERROR: Module load completed but symbols could not be loaded for win32dd.sys
Probably caused by : win32dd.exe ( win32dd!Unknown )


评论


我认为OP具有原始(纯二进制)内存转储,而不是DMP文件。

–伊戈尔·斯科钦斯基♦
16年2月2日在17:47

@IgorSkochinsky我看到我没有意识到那么波动率或记忆力应该能够读取它们–我编辑了我的答案,以解决波动性raw2dmp

– blabb
16年3月3日在6:07

#2 楼


为每个进程提取完整的内存区域
在每个进程中获取进程中每个线程的TIB

TIB将帮助您到达堆栈存储区的开始/底部对于以上所有线程,您都可以使用Rekall的波动性。查看有关插件的相关文档(pstree,线程,procdump)

OS内部结构也将有所帮助

现在,如果您能详细说明一下自己是什么,试图找到。我可能会给出更具体的说明。

祝你好运。