我想从此转储中提取尽可能多的功能。主要是我想提取机器上运行的所有线程的所有堆栈并存在于内存中。或者,我想提取所有线程的调用序列。
是否有任何工具/教程/书籍等可以帮助我执行此任务?
我熟悉Volatility和Rekall,是否有任何特定的插件可以帮助我实现目标?
#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内部结构也将有所帮助
现在,如果您能详细说明一下自己是什么,试图找到。我可能会给出更具体的说明。
祝你好运。
评论
我可能误解了您的问题,但是为什么不简单地在Volatility中使用pstree命令,然后通过procmemdump,dlldump或memdump管理某些内容呢?但是,我一定错过了一些事情。我不确定,但是如何使用这些命令提取进程的堆栈或调用顺序?
好了,您可以转储进程的内存。它肯定包含堆栈...但是,您看到的是,您的问题缺少对所需内容的精确定义,因为最后您将使用哪种堆栈表示形式?
@perror:我假设OP想要提取调用堆栈或回溯(例如Windbg的k或GDB的bt)。