首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Pykd中我会得到一个“找不到”的符号呢?

为什么在Pykd中我会得到一个“找不到”的符号呢?
EN

Stack Overflow用户
提问于 2018-06-11 15:05:08
回答 2查看 249关注 0票数 1

我正在研究一个垃圾场,我试着用PYKD技术对它进行调查。

x /2 *!*``vtable'的结果(只有一个回勾)包含以下结果:

代码语言:javascript
复制
745293b8          mfc110u!CPtrList::`vftable'

但是,当我试图获得有关该类的更多信息时,我会得到一个“符号未找到”的异常:

Python源代码:

代码语言:javascript
复制
dprintln("name=[%s]" % type_stats.name)
if not type_stats.name in typesize_by_type:
  try:
    type_info = typeInfo(type_stats.name)
  except Exception, e:
    dprintln("text=[%s]" % (str(e)))

输出:

代码语言:javascript
复制
name=[mfc110u!CPtrList]
text=['CPtrList' - symbol not found]

lm命令的结果返回mfc110u符号,如下所示:

代码语言:javascript
复制
0:000> lm
start     end        module name
...
744f0000  74930000   mfc110u    (pdb symbols) C:\ProgramData\dbg\sym\mfc110u.i386.pdb\...\mfc110u.i386.pdb
...

请注意,我现在正在使用PYKD的最后版本:

代码语言:javascript
复制
0:000> .chain
Extension DLL search Path:
    ...
Extension DLL chain:
    pykd.pyd: image 0.3.3.4, API 1.0.0, built Mon May 14 11:14:43 2018
        [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext\pykd.pyd]

同时,我找到了一种非常简单的方法来重现问题,而不需要启动整个脚本(使用Windbg提示符):

代码语言:javascript
复制
0:000> !py
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> typeInfo("mfc110u!CPtrList")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
SymbolException: 'CPtrList' - symbol not found

除了ussr英雄的回答外,还有以下额外信息:

x /2 *!CPtrList*的结果包含(除其他外)以下结果:

代码语言:javascript
复制
009530c4   <application>!CPtrList::~CPtrList
009530be   <application>!CPtrList::CPtrList
...        <application>!CPtrList::...
009abc5c   <application>!CPtrList::`RTTI Base Class Array'
009abc4c   <application>!CPtrList::`RTTI Class Hierarchy Descriptor'
009bcd18   <application>!CPtrList `RTTI Type Descriptor'
009abc30   <application>!CPtrList::`RTTI Base Class Descriptor at (0,-1,0,64)'
7464e9cb   mfc110u!CPtrList::~CPtrList
74544a04   mfc110u!CPtrList::CPtrList
...        mfc110u!CPtrList::...
745293b8   mfc110u!CPtrList::`vftable'
747510da   mfc110u!CPtrList::`vector deleting destructor'
745293cc   mfc110u!CPtrList::`RTTI Complete Object Locator'
7452940c   mfc110u!CPtrList::`RTTI Base Class Array'
745293fc   mfc110u!CPtrList::`RTTI Class Hierarchy Descriptor'
74795778   mfc110u!CPtrList `RTTI Type Descriptor'
745293e0   mfc110u!CPtrList::`RTTI Base Class Descriptor at (0,-1,0,64)'
746fdc68   mfc110u!CPtrList::classCPtrList

我使用的脚本(heap_stat.py)浏览!heap -h 0的结果并搜索与mfc110u!CPtrList::``vtable'对应的条目。

dt CPtrList的结果如下所示:

代码语言:javascript
复制
0:000> dt CPtrList
<application>!CPtrList => in other words, no 'mfcu110' entry
   +0x000 __VFN_table : Ptr32 

很长一段时间以来,我都在想,mfc110u!CPtrList<application>!CPtrList条目之间有什么区别,vtable条目在x /2结果中的确切作用是什么?

有什么想法吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-12 11:41:24

与此同时,我找到了解决办法:

显然,对于某些对象,需要删除模块前缀:

代码语言:javascript
复制
>>> typeInfo("mdf110u!CPtrList")
-> SymbolException

>>> typeInfo("CPtrList")
-> this is working!!!
票数 0
EN

Stack Overflow用户

发布于 2018-06-12 17:41:52

尝试查看WinDBG如何定位此类型:

代码语言:javascript
复制
dt CPtrList

也许mfc110u不包含CPtrList的类型信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50800800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档