9

WinDBG を使用して実行可能ファイルのアセンブリを調べようとしていますが、取得するのに苦労しています。プログラムの最初の命令にブレークポイントを設定したいのですが、(モジュールのアドレスを使用して) 手動で設定しようとすると、WinDBG は、"メモリ位置へのアクセスが無効です。」

ソース コード GUI を介してブレークポイントを作成すると、アドレスがモジュールの最初の部分と同じではないことに気付きました (私の例では、「Win32FileOpen」、私が書いた単純なプログラムです)。何らかのヘッダーがありますか?モジュールのアドレスにオフセットを追加する必要がありますか?

別の 質問で、「次のようにブレークポイント アドレスを計算しようとします: モジュール開始 + コード開始 + コード オフセット」という提案を見ましたが、これらの値をどこで取得するかがわかりませんでした。誰かがこれについて詳しく説明してもらえますか?

ソース GUI だけを使用しない理由は、ソース/シンボルを持っていない可能性のあるプログラムでこれを実行できるようにしたいからです。

開いた実行可能ファイルですぐに作業を開始する簡単な方法がある場合は、お知らせください。(たとえば、.exe を開くと Olly はすぐにその .exe のアセンブリを表示し、参照された文字列を検索するとそのモジュールからの結果が得られます。WinDBG は ntdll.dll で開始されるようですが、これは通常は役に立ちません。)

0:000> lm
start             end                 module name
00000000`00130000 00000000`0014b000   Win32FileOpen C (private pdb symbols)  C:\cfinley\code\Win32FileOpen\Debug\Win32FileOpen.pdb
00000000`73bd0000 00000000`73c2c000   wow64win   (deferred)            
00000000`73c30000 00000000`73c6f000   wow64      (deferred)            
00000000`74fe0000 00000000`74fe8000   wow64cpu   (deferred)            
00000000`77750000 00000000`778f9000   ntdll      (pdb symbols)          c:\symbols\mssymbols\ntdll.pdb\15EB43E23B12409C84E3CC7635BAF5A32\ntdll.pdb
00000000`77930000 00000000`77ab0000   ntdll32    (deferred)            
0:000> bu 00000000`00130000
0:000> bl
 0 e x86 00000000`001413a0     0001 (0001)  0:**** Win32FileOpen!main              <-- One that is generated via GUI
 1 e x86 00000000`00130000     0001 (0001)  0:**** Win32FileOpen!__ImageBase       <-- One I tried to set manually
0:000> g
Unable to insert breakpoint 1 at 00000000`00130000, Win32 error 0n998
    "Invalid access to memory location."
bp1 at 00000000`00130000 failed
WaitForEvent failed
ntdll!LdrpDoDebuggerBreak+0x31:
00000000`777fcb61 eb00            jmp     ntdll!LdrpDoDebuggerBreak+0x33 (00000000`777fcb63)
4

1 に答える 1

16

次を使用して、dll のすべてのエントリ ポイントを一覧表示できるはずです。

x myDLL!*

ただし、これによりすべてがリストされることに注意してください。

Win32FileOpen だけが必要な場合:

x myDLL!*Win32FileOpen*

一致するものがすべてリストされます。これにより、ブレークポイントを設定できる正しいアドレスがリストされます。

オフセットに関する他の質問では、メソッド名またはアドレスにブレークポイントを設定してオフセットを追加できます。

bp myDLL!Win32FileOpen+0xa

実行可能ファイルを開くと、すぐに debugbreak され、おそらく dll のロードが開始されません。これが問題である場合は、未解決のブレークポイントを設定できます。

bu myDLL!Win32FileOpen

または、アプリの起動時にアタッチし、文字列を一覧表示してからブレークポイントを設定します。

ソース行にブレークポイントを設定することも検討してください。

bp `myDLL!mySourceFile.cpp:XXX` 

ここで、XXX は行番号です。ソース行を区切るにはグレイブ アクセントを使用する必要があることに注意してください。これが役立つことを願っています。

編集

あなたにとって興味深いかもしれないこのリンクを見つけました: http://mattoh.wordpress.com/2010/08/06/setting-breakpoint-on-entry-poin-with-windbg/

また、コメンテーターの 1 人が、exe のエントリ ポイントに bp を設定できる疑似レジスタの 1 つを指摘しました。

bp $exentry

また

bu @$exentry
于 2012-05-25T19:15:21.740 に答える