1

COM 相互運用を行い、いくつかのネイティブ ライブラリ API を呼び出す .net アプリケーションがあります。これらの API の 1 つが予期しないデータを返し、頭痛の種になっています。マネージ API の戻り値を強制する方法を探しています。これは私の問題を解決するつもりはありませんが、いくつかのことを絞り込むのに役立ちます. 以下で少し単純化しています。

これらすべてを念頭に置いて、マネージ クラスの名前が MyClass で、ParentMethod() と ChildMethod() の 2 つのメソッドがあるとします。ParentMethod は、これらのネイティブ API を内部的に呼び出す ChildMethod を呼び出します。ChildMethod 自体は bool を返します。

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、Version=1.0.0.0、Culture=neutral、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 なし MyNamespace.MyClass.ParentNameMethod()
04acc085 NONE Myac4fe4 .MyClass.ChildMethod()
04b202c0 04ac4f​​f0 JIT MyNamespace.MyClass.InitializeComponent()

Naveen のブログ エントリで、同じ方向に沿って何かを行うためのテクニックについて説明しているのを見つけましたが、ここから具体的にどのような手順を踏めばよいのかわかりませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

1

ここに簡単な手順があります

  1. bp 04acc085- ChildMethod とは
  2. ブレークポイントがヒットしたら、bp poi(@esp)リターンレジスタにブレークポイントを設定するコマンドを発行します
  3. そして、2 番目のブレークポイントがヒットすると、 を使用して値を true に変更できますr eax=00000001eaxレジスタは戻り値を x86 に格納します

または別の方法はbp 04acc085 "gu;r eax=00000001;gc"、1行で同じことを行うことです

于 2011-04-17T22:41:36.010 に答える