《Python程序设计》习题与答案 下载本文

内容发布更新时间 : 2024/12/23 12:01:24星期一 下面是文章的全部内容请认真阅读。

第16章 逆向工程与软件分析

16.1 下载PE文件规范8.3版本,并尝试了解PE文件基本结构。 答:略。

16.2 下载并安装IDA Pro与Immunity Debugger,并简单了解PE文件反汇编和调试步骤。

答:略。

16.3 安装并配置IDAPython插件,然后运行本章16.2.1小节的Python代码。 答:略。

16.4 在Immunity Debugger调试器中运行本章16.2.2小节中的代码。 答:略。

16.5 叙述软件调试断点的概念、作用及其分类。 答:

断点是最常用的软件调试技术之一,其基本思想是在某一个位置设置一个“陷阱”,当CPU执行到这个位置的时候停止被调试的程序并中断到调试器中,让调试者进行分析和调试,调试者分析结束后,可以让被调试程序恢复执行。通过设置断点可以暂停程序执行,并可以观察和记录指令信息、变量值、堆栈参数和内存数据,还可以深入了解和把握程序执行的内部原理和详细过程,断点对于软件调试具有重要的意义和作用。

断点可以分为软件断点、硬件断点和内存断点三大类。 1)软件断点

软件断点是一个单字节指令(INT 3,字节码为0xCC),可以在程序中设置多个软件断点,使得程序执行到该处时能够暂停执行,并将控制权转移给调试器的断点处理函数。

当调试器被告知在目标地址设置一个断点,它首先读取目标地址的第一个字节的操作码,然后保存起来,同时把地址存储在内部的中断列表中。接着,调试器把一个字节操作码 “0xCC” 写入刚才的地址。当 CPU 执行到“0xCC”操作码的时候就会触发一个 “INT 3”中断事件,此时调试器就能捕捉到这个事件。调试器继续判断这个发生中断事件的地址(通过指令指针寄存器EIP)是不是自己先前设置断点的地址。如果在调试器内部的断点列表中找到了这个地址,就将设置断点前存储起来的操作码写回到目标地址,这样进程被调试器恢复后就能正常的执行。

2)硬件断点

硬件断点通过调试寄存器实现,设置在CPU级别上,当需要调试某个指定区域而又无法修改该区域时,硬件断点非常有用。

一个CPU一般会有8 个调试寄存器(DR0 寄存器到DR7寄存器),用于管理硬件断点。其中调试寄存器DR0到调试寄存器DR3存储硬件断点地址,同一时间内最多只能设置4个硬件断点;DR4和DR5保留,DR6是状态寄存器,说明被断点触发的调试事件的类型;DR7本质上是一个硬件断点的开关寄存器,同时也存储了断点的不同类型。通过在DR7寄存器里设置不同标志,能够创建以下几种断点:当特定的地址上有指令执行的时候中断、当特定的地址上有数据写入的时候、当特定的地址上有数据读或者写但不执行的时候。

硬件断点使用“INT 1”实现,该中断负责硬件中断和步进事件。步进是指根据预定的流程一条一条地执行指令,每执行完一条指令后暂停下来,从而可以精确地观察关键代码并监视寄存器和内存数据的变化。在CPU每次执行代码之前,都会先确认当前将要执行代码的地址是否是硬件断点的地址,同时也要确认是否有代码要访问被设置了硬件断点的内存区域。如果任何储存在DR0-DR3中的地址所指向的区域被访问了,就会触发 “INT 1”中断,同时暂停CPU;如果不是中断地址则CPU执行该行代码,到下一行代码时,CPU继续重复上面的过程。

3)内存断点

内存断点是通过修改内存中指定块或页的访问权限来实现的。通过将指定内存块或页的访问权限属性设置为受保护的,则任何不符合访问权限约束的操作都将失败,并抛出异常,导致CPU暂停执行,使得调试器可以查看当前执行状态。

一般来说,每个内存块或页的访问权限都由三种不同的访问权限组成:是否可执行、是否可读、是否可写。每个操作系统都提供了用来查询和修改内存页访问权限的函数,在Windows操作系统中可以使用VirtualProtect()函数来修改主调进程虚拟地址空间中已提交页面的保护属性,使用VirtualProtectEx()函数可以修改其他进程虚拟地址空间页面的保护属性。

16.6 运行本章16.4节中的代码并查看运行结果。 答:略。

第17章 科学计算与可视化

17.1 运行本章所有代码并查看运行结果。 答:略。

17.2 使用Python内置函数dir()查看scipy模块中的对象与方法,并使用Python内置函数help()查看其使用说明。 答:略。