在WinDBG中手动设置断点

Chr*_*ley 7 windbg breakpoints ollydbg

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 13

您应该能够使用以下内容列出您的dll的所有入口点:

x myDLL!*
Run Code Online (Sandbox Code Playgroud)

但要注意这将列出一切,

如果你只想Win32FileOpen:

x myDLL!*Win32FileOpen*
Run Code Online (Sandbox Code Playgroud)

将列出所有匹配项,这将列出您可以设置断点的正确地址.

关于偏移的另一个问题,您可以在方法名称或地址上设置断点并添加偏移量:

bp myDLL!Win32FileOpen+0xa
Run Code Online (Sandbox Code Playgroud)

如果你打开exectuable它将立即调试breakvent并且可能没有开始加载你的dll,如果这是一个问题,那么你可以设置未解决的断点:

bu myDLL!Win32FileOpen
Run Code Online (Sandbox Code Playgroud)

或者只是在应用程序启动时附加,列出字符串然后设置断点.

您还可以考虑在源代码行上设置断点:

bp `myDLL!mySourceFile.cpp:XXX` 
Run Code Online (Sandbox Code Playgroud)

其中XXX是行号,请注意您必须使用严重的重音来标记源行,希望这会有所帮助.

编辑

刚发现此链接可能对您有用:http://mattoh.wordpress.com/2010/08/06/setting-breakpoint-on-entry-poin-with-windbg/

还有一个评论员指出了一个伪寄存器,它允许你在你的exe的入口点设置bp:

bp $exentry
Run Code Online (Sandbox Code Playgroud)

要么

bu @$exentry
Run Code Online (Sandbox Code Playgroud)