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)