在使用winappdbg设置断点后总是出现访问冲突
我正在使用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 个回答
我首先猜测你可能是在指令中间设置了断点。其次,我猜测你可能还在修改寄存器的内容,这可能导致在写入[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)
希望这能帮到你!:)
看起来这个 pida_dump 脚本没有获取到正确的基地址,所以当我进行了重定位时,代码变成了
地址 - 旧基地址 + 新基地址
因为旧基地址是错误的,所以搞乱了我的 BP。
无论如何,还是谢谢你的帮助!