这次的内容是3.4.1设置软断点的那块程序。调了半天才成功。首先分析这段程序的处理过程,如图
第一个问题
msvcrt.printf("Loop iteration %d!\n", counter)
通过msvcrt这个dll来实现python中使用printf,但是这里printf出来的内容是不会输出在python运行框中的。
第二个问题
调试的时候发现,如果在bp_set中或者write_process_memory与read_process_memory这几个函数中,如果使用print进行输出16进制数据,即使用%08x这种格式化输出,会导致bp_set异常。
def bp_set(self, address):
print "Setting breakpoint at: 0x%08X" % address
if address not in self.breakpoints:
try:
original_byte = self.read_process_memory(address, 1) # 备份内存地址上的原有字节
self.write_process_memory(address, '\xCC') # 写入一个INT3中断指令,其操作码为0xCC
self.breakpoints[address] = (address, original_byte)
except:
print 'Error in bp_set: ', kernel32.GetLastError()
return False
return True
即,输出‘Error in bp_set’,错误代码为6:The handle is invalid.显示句柄无效。暂时不明白原因。
第三个问题
使用网上下载的源代码,运行会出错,原因在于,字典
breakpoints[address] = (address, original_byte)
在字典中写入的是同时包含地址和数据的元组,而在exception_handler_breakpoint函数的处理中,
else:
print "[*] Hit user defined breakpoint."
# this is where we handle the breakpoints we set
# first put the original byte back
self.write_process_memory(self.exception_address, self.breakpoints[self.exception_address])
直接对内存写入的是这个元组,其实只需要写入数据即可。改后的程序为
else:
print "Hit user defined breakpoint."
data_temp = self.breakpoints[self.exception_address]
self.write_process_memory(self.exception_address, data_temp[1])
即可。