1

我有一个 .net 应用程序正在执行 COM 互操作并调用一些本机库 API。其中一个 API 正在返回一些出乎意料的数据,这让我很头疼。我正在寻找一些强制托管 API 返回值的方法。这不会解决我的问题,但可以帮助我缩小一些范围。我在下面简化了一些事情。

记住这一切,假设我的托管类名为 MyClass,它有两个方法 ParentMethod() 和 ChildMethod()。ParentMethod 调用 ChildMethod 内部调用这些本地 API。ChildMethod 本身返回一个布尔值。

通过 Windbg 闯入我的应用程序后,我首先运行 !dumpheap -type MyClass 命令,该命令给了我以下输出

0:027> !dumpheap -type MyClass
地址 MT 大小
0ac7e7e4 04ac5030 100
共 0 个对象
统计信息:
MT 计数 TotalSize 类名称
04ac5030 1 100 MyNamespace.MyClass
共 1 个对象

然后我运行以下命令试图获取此类中方法的地址。

0:027>!dumpmt -md 04ac5030
EEClass:04ac1b20
模块:04ac49c8
名称:MyNamespace.MyClass
mdToken:02000002
文件:MyAssemblyName,版本=1.0.0.0,文化=中性,PublicKeyToken=null
BaseSize:0x64
ComponentSize:0x0
VTable 中的插槽: 61
IFaceMap 中 IFace 的数量:4
MethodDesc 表
条目 MethodDesc JIT 名称
04b20270 04ac4f​​d0 JIT MyNamespace.MyClass..ctor()
04b20230 04ac4f​​fc JIT MyNamespace.MyClass..cctor()
04acc081 04ac4f​​d8 NONE MyNamespace.MyClass.ParentMethod() 04acc085 NONE MyNamespace.MyNamespace.ParentMethod()
04acc085 N404 .MyClass.ChildMethod()
04b202c0 04ac4f​​f0 JIT MyNamespace.MyClass.InitializeComponent()

我找到了Naveen 的博客条目,他在其中描述了一些沿同一路线做某事的技术,但我不知道我应该从这里采取什么确切步骤。任何帮助将不胜感激。

4

1 回答 1

1

以下是简单的步骤

  1. bp 04acc085- 这是 ChildMethod
  2. 当断点命中时,发出bp poi(@esp)在返回寄存器上设置断点的命令
  3. 当第二个断点命中时,您可以使用将值更改为 true r eax=00000001。寄存器将eax返回值存储在 x86 中

或者另一种方法是bp 04acc085 "gu;r eax=00000001;gc"在一行中做同样的事情

于 2011-04-17T22:41:36.010 回答