阅读笔记&&实现代码_of_Python灰帽子(三)

本文探讨了使用Python进行调试时遇到的三个主要问题:如何正确利用msvcrt.dll实现printf功能;在设置软断点过程中避免句柄无效错误;以及修复预设代码中关于字典数据类型不当使用的错误。

这次的内容是3.4.1设置软断点的那块程序。调了半天才成功。首先分析这段程序的处理过程,如图

204848_4uu3_2843142.jpg

第一个问题

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])

即可。

转载于:https://my.oschina.net/yup1612/blog/805407

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值