0

我正在使用 winappdbg 框架在 python 中构建调试器。

我可以使用 event.debug.break_at(event.get_pid(),address) 设置一些断点以设置断点,但是在设置某些断点之后(而不是在设置它们时,而是在程序命中它们时!)我得到访问冲突例外。

例如,我可以在 0x48d1ea 或 0x47a001 处设置一个访问点,但如果我在 0x408020 处设置一个访问点,则会出现异常。

模块基地址为 0x400000。

0048D0BE: xor esi,eax

0048D0C0: call [winamp!start+0x25c1]

760DCC50: add [ebx],dh

Access Violation

Exception event (00000001) at address 779315DE, process 9172, thread 9616

顺便说一句,我从 IDA 生成的 pida 文件中获取地址来设置断点。我重新设置了文件的基础,因此地址应该对齐

谢谢!

4

2 回答 2

0

我的第一个猜测是你试图在指令中间设置断点。我的第二个猜测是,您还修改了寄存器的内容,这就是写入 [ebx] 时访问冲突的原因。(另请注意 0x779315DE 可能位于 ntdll.dll 而不是 winamp.exe,因此它可能完全是另一回事)。

但如果没有更多信息,我不确定。你能把代码贴在你提到的那些地址上吗?您是否尝试继续异常并查看会发生什么?寄存器的内容也会有所帮助,就像尝试 Microsoft 的调试器 (ntsd.exe) 以查看问题是否特定于 WinAppDbg。

关于来自 IDA 的地址,您可以尝试使用相对地址来避免 ASLR 出现问题。例如,如果“winamp”模块基址是 0x400000,断点应该在 0x408020,您可以像这样在“winamp!0x8020”处设置断点:

address = event.get_process().resolve_label("winamp!0x8020")
event.debug.break_at(event.get_pid(), address)

希望这可以帮助!:)

于 2013-03-03T19:43:44.233 回答
0

显然 pida_dump 脚本没有得到正确的基地址,所以当我进行变基时,代码就像

地址 - old_base_address + new_base_address

并且由于 old_base_address 已磨损,它错过了我的 BP。

感谢任何方式的帮助!

于 2013-03-05T22:47:20.353 回答