在使用winappdbg设置断点后总是出现访问冲突

0 投票
2 回答
715 浏览
提问于 2025-04-17 16:57

我正在使用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

访问违规

异常事件 (00000001) 在地址 779315DE,进程 9172,线程 9616

顺便说一下,我是从一个由IDA生成的pida文件中获取地址来设置断点的。我已经重新基准化了这个文件,所以地址应该是对齐的。

谢谢!

2 个回答

0

我首先猜测你可能是在指令中间设置了断点。其次,我猜测你可能还在修改寄存器的内容,这可能导致在写入[ebx]时出现访问违规的问题。(另外,0x779315DE很可能是在ntdll.dll中,而不是winamp.exe,所以这可能完全是其他问题)。

不过没有更多信息我不能确定。你能把你提到的那些地址的代码也发上来吗?你有没有尝试继续处理异常,看看会发生什么?寄存器的内容也会有帮助,另外可以试试微软的调试工具(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)

希望这能帮到你!:)

0

看起来这个 pida_dump 脚本没有获取到正确的基地址,所以当我进行了重定位时,代码变成了

地址 - 旧基地址 + 新基地址

因为旧基地址是错误的,所以搞乱了我的 BP。

无论如何,还是谢谢你的帮助!

撰写回答