2

3つの疑問1)次のようにコールスタックを取得するとします。

    user32.dll!_InternalCallWinProc@20()  + 0x28 bytes  
user32.dll!_UserCallWinProcCheckWow@32()  + 0xb7 bytes  
user32.dll!_CallWindowProcAorW@24()  + 0x51 bytes   
user32.dll!_CallWindowProcW@20()  + 0x1b bytes  

では、各関数の最後に記載されているバイトは何ですか?最初のステートメントのように、0x28バイトは何ですか。

2)VSのWindowsシステムDLLにブレークポイントを設定する方法は?windbgでは、Windowsシステムdllの特定の機能を次のように検索できます。

>x wininet!*funcA*

このコマンドを使用すると、この関数のアドレスを取得し、ブレークポイントを設定できます。Visual Studioでも同じことができますか?

3)dllのシンボルファイルがありません。私が分解しているコールスタックは

7814XXX0  call        dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)] 

__imp__上記のコールスタックには何がありますか?これは、このWindows関数が他のdllにフックされていることを意味しますか?

4

3 に答える 3

9

1)関数の開始を基準にした、そのスタックフレームで実行されている命令のバイトオフセットです。

2) [新しいブレークポイント]ダイアログに次のようなものを入力します。

{,,user32.dll}_SendMessageW@16

ここで、16は関数が期待するパラメータのバイト数です(Win32では、これはほとんどの場合、パラメータ数の4倍です)。は、APIのWUnicodeバージョンを指します。AANSIアプリケーションをデバッグする場合に使用します。

3) __imp__ DLLインポートテーブルを参照します-現在のモジュールのコードは、を介しJMPて実際のWindows DLLにリダイレクトされ、__imp__シンボルはそれを参照しJMPます。これらJMPは、呼び出しを行うDLLまたはEXEのテーブルに存在します。

于 2009-06-17T11:37:56.343 に答える
1

質問の最初の部分では、言及されているバイトオフセットは、スタックの上位にある後続の呼び出しをもたらした実行中の関数内の位置です。

于 2009-06-17T11:36:11.497 に答える
0

1)関数の開始から、スタックトレースが作成されたときに実行されていた行までのオフセットです。

2&3-わからない。ごめん。

于 2009-06-17T11:36:04.430 に答える