2011-04-17 161 views
1

我有一個.net應用程序正在做COM互操作並調用一些本地庫API。其中一個API會返回一些意想不到的數據,並給我帶來麻煩。我正在尋找一些方法來強制託管API的返回值。這不會解決我的問題,但幫助我縮小一些事情。我簡化了以下的事情。更改函數返回值

記住所有這些,讓我們說我的託管類名稱MyClass,它有兩個方法ParentMethod()和ChildMethod()。 ParentMethod調用內部調用這些本機API的ChildMethod。 ChildMethod本身返回一個布爾值。

闖入通過WinDBG的我的應用程序後,我第一次跑dumpheap型MyClass的命令,它給了我下面的輸出

0:!027> dumpheap型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,文化=中性公鑰=空
BaseSize:0x64
ComponentSize:爲0x0
插槽中的VTable:61
在IFaceMa IFaces數號碼:4
方法描述表
條目方法描述JIT名稱
04b20270 04ac4f​​d0 JIT MyNamespace.MyClass..ctor()
04b20230 04ac4f​​fc JIT MyNamespace.MyClass..cctor()
04acc081 04ac4f​​d8 NONE MyNamespace.MyClass.ParentMethod( )
04acc085 04ac4f​​e4 NONE MyNamespace.MyClass.ChildMethod()
04b202c0 04ac4f​​f0 JIT MyNamespace.MyClass.InitializeComponent()

我發現Naveen's blog entry他去寫了一些沿同一條線做某事的技巧,但我無法弄清楚我應該從這裏採取什麼確切步驟。任何幫助將不勝感激。

回答

1

這裏有個簡單的步驟

  1. bp 04acc085 - 這是ChildMethod
  2. 當斷點命中然後發出命令bp poi(@esp)它設置在返回時斷點註冊
  3. 而當第二個斷點擊中你可以使用r eax=00000001將值更改爲true。該eax寄存器存儲在86

或者另一種方式返回值是bp 04acc085 "gu;r eax=00000001;gc"將做相同的一行

+0

再次感謝納文。所以只是爲了理解@esp與poi的重要性。我的理解是,poi就像去參照一個地址一樣。 – 2011-04-17 23:18:56

+0

@esp寄存器存儲函數返回地址。所以通過發佈bp poi(@esp),我們在返回地址上設置了一個斷點。 – Naveen 2011-04-18 01:06:23