我正在使用winappdbg框架在python中构建调试器。
我可以使用event.debug.break_at(event.get_pid(),address)设置一些断点,以便设置断点但是在设置certin断点之后(而不是在设置它们时,但是一旦程序命中它们!)i获取访问冲突异常。
例如,我可以在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
b.t.w 我正在从IDA生成的pida文件中获取地址以设置断点。 我重新定位了文件,因此地址应该对齐
谢谢!
答案 0 :(得分: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)
希望这有帮助! :)
答案 1 :(得分:0)
显然pida_dump脚本没有得到正确的基址,所以当我做了一个rebase时代码就像
地址 - old_base_address + new_base_address
因为old_base_address很糟糕,它错过了我的BP。
感谢任何帮助!