我有一个.net应用程序正在进行COM互操作并调用一些本机库API。其中一个API正在返回一些意外的数据并导致我头痛。我正在寻找一些强制托管API的返回值的方法。这不会解决我的问题,但帮助我缩小一些事情。我正在简化下面的事情。
记住所有这些,让我们说我的托管类名MyClass,它有两个方法ParentMethod()和ChildMethod()。 ParentMethod调用ChildMethod,它在内部调用那些本机API。 ChildMethod本身返回一个bool。
通过Windbg进入我的应用程序后,我首先运行了!dumpheap -type MyClass命令,它给了我以下输出
0:027> !dumpheap -type MyClass
地址MT尺寸
0ac7e7e4 04ac5030 100
总共0个对象
统计:
MT Count TotalSize类名 04ac5030 1 100 MyNamespace.MyClass
共1个对象
然后我运行以下命令试图获取此类中方法的地址。
0:027> !dumpmt -md 04ac5030
EEClass:04ac1b20
模块:04ac49c8
名称:MyNamespace.MyClass
mdToken:02000002
文件:MyAssemblyName,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
BaseSize:0x64
ComponentSize:0x0
VTable中的插槽:61
IFaceMap中的IFaces数量:4
MethodDesc表
Entry MethodDesc JIT名称
04b20270 04ac4fd0 JIT MyNamespace.MyClass..ctor()
04b20230 04ac4ffc JIT MyNamespace.MyClass..cctor()
04acc081 04ac4fd8无MyNamespace.MyClass.ParentMethod()
04acc085 04ac4fe4无MyNamespace.MyClass.ChildMethod()
04b202c0 04ac4ff0 JIT MyNamespace.MyClass.InitializeComponent()
我找到了Naveen's blog entry,他描述了一些沿着同一条线做某事的技巧,但我无法弄清楚我应该从这里采取什么样的步骤。任何帮助将受到高度赞赏。
答案 0 :(得分:1)
以下是简单的步骤
bp 04acc085
- 哪个是ChildMethod bp poi(@esp)
,设置返回寄存器的断点r eax=00000001
将值更改为true。 eax
寄存器将返回值存储在x86 或另一种方式是bp 04acc085 "gu;r eax=00000001;gc"
,它将在一行中执行相同的操作