收藏 分享(赏)

吉林公务员考试《行测》甲级真题及参考解析.doc

上传人:up710 文档编号:4033420 上传时间:2021-07-11 格式:DOC 页数:34 大小:116KB
下载 相关 举报
吉林公务员考试《行测》甲级真题及参考解析.doc_第1页
第1页 / 共34页
吉林公务员考试《行测》甲级真题及参考解析.doc_第2页
第2页 / 共34页
吉林公务员考试《行测》甲级真题及参考解析.doc_第3页
第3页 / 共34页
吉林公务员考试《行测》甲级真题及参考解析.doc_第4页
第4页 / 共34页
吉林公务员考试《行测》甲级真题及参考解析.doc_第5页
第5页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 上一节,我们讲了复杂度的大O表示法和几个分析技巧,还举了一些常见复杂度分析的例子,比如O(1)、O(logn)、O(n)、O(nlogn)复杂度分析。掌握了这些内容, 对于复杂度分析这个知识点,你已经可以到及格线了。但是,我想你肯定不会满足于此。 今天我会继续给你讲四个复杂度分析方面的知识点,最好情况时间

2、复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均 情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)。如果这几个概念你都能掌握,那对你来说,复杂度分析这部分内 容就没什么大问题了。 最好、最坏情况时间复杂度 上一节我举的分析复杂度的例子都很简单,今天我们来看一个稍微复杂的。你可以用我上节教你的分析技巧,自己先试着分析一下这段代码的时间复杂度。 / n表示数组array的长度 int find(int arra

3、y, int n, int x) int i = 0; int pos = -1; for (; i n; +i) if (arrayi = x) pos = i; return pos; 你应该可以看出来,这段代码要实现的功能是,在一个无序的数组(array)中,查找变量x出现的位置。如果没有找到,就返回-1。按照上节课讲的分析方法,这 段代码的复杂度是O(n),其中,n代表数组的长度。 我们在数组中查找一个数据,并不需要每次都把整个数组都遍历一遍,因为有可能中途找到就可以提前结束循环了。但是,这段代码写得不够高效。我们可以这 样优化一下这段查找代码。 / n表示数组array的长度 int

4、 find(int array, int n, int x) int i = 0; int pos = -1; for (; i n; +i) if (arrayi = x) pos = i; break; return pos; 这个时候,问题就来了。我们优化完之后,这段代码的时间复杂度还是O(n)吗?很显然,咱们上一节讲的分析方法,解决不了这个问题。 因为,要查找的变量x可能出现在数组的任意位置。如果数组中第一个元素正好是要查找的变量x,那就不需要继续遍历剩下的n-1个数据了,那时间复杂度就 是O(1)。但如果数组中不存在变量x,那我们就需要把整个数组都遍历一遍,时间复杂度就成了O(n)。

5、所以,不同的情况下,这段代码的时间复杂度是不一样的。 为了表示代码在不同情况下的不同时间复杂度,我们需要引入三个概念:最好情况时间复杂度、最坏情况时间复杂度和平均情况时间复杂度。 顾名思义,最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。就像我们刚刚讲到的,在最理想的情况下,要查找的变量x正好是数组的 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 第一个元素,这个时候对应的时间复杂度就是最好

6、情况时间复杂度。 同理,最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。就像刚举的那个例子,如果数组中没有要查找的变量x,我们需要把整个数组 都遍历一遍才行,所以这种最糟糕情况下对应的时间复杂度就是最坏情况时间复杂度。 平均情况时间复杂度 我们都知道,最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大。为了更好地表示平均情况下的复杂度, 我们需要引入另一个概念:平均情况时间复杂度,后面我简称为平均时间复杂度。 平均时间复杂度又该怎么分析呢?我还是借助刚才查找变量x的例子来给你解释。 要查找的变量x在数组中的位置,有n+1种情况:在数

7、组的0n-1位置中和不在数组中。我们把每种情况下,查找需要遍历的元素个数累加起来,然后再除以n+1, 就可以得到需要遍历的元素个数的平均值,即: 我们知道,时间复杂度的大O标记法中,可以省略掉系数、低阶、常量,所以,咱们把刚刚这个公式简化之后,得到的平均时间复杂度就是O(n)。 这个结论虽然是正确的,但是计算过程稍微有点儿问题。究竟是什么问题呢?我们刚讲的这n+1种情况,出现的概率并不是一样的。我带你具体分析一下。(这里 要稍微用到一点儿概率论的知识,不过非常简单,你不用担心。) 我们知道,要查找的变量x,要么在数组里,要么就不在数组里。这两种情况对应的概率统计起来很麻烦,为了方便你理解,我们

8、假设在数组中与不在数组中的概 率都为1/2。另外,要查找的数据出现在0n-1这n个位置的概率也是一样的,为1/n。所以,根据概率乘法法则,要查找的数据出现在0n-1中任意位置的概率就 是1/(2n)。 因此,前面的推导过程中存在的最大问题就是,没有将各种情况发生的概率考虑进去。如果我们把每种情况发生的概率也考虑进去,那平均时间复杂度的计算过 程就变成了这样: 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 这个值

9、就是概率论中的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度。 引入概率之后,前面那段代码的加权平均值为(3n+1)/4。用大O表示法来表示,去掉系数和常量,这段代码的加权平均时间复杂度仍然是O(n)。 你可能会说,平均时间复杂度分析好复杂啊,还要涉及概率论的知识。实际上,在大多数情况下,我们并不需要区分最好、最坏、平均情况时间复杂度三种情 况。像我们上一节课举的那些例子那样,很多时候,我们使用一个复杂度就可以满足需求了。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们 才会使用这三种复杂度表示法来区分。 均摊时间复杂度 到此为止,你应该

10、已经掌握了算法复杂度分析的大部分内容了。下面我要给你讲一个更加高级的概念,均摊时间复杂度,以及它对应的分析方法,摊还分析(或 者叫平摊分析)。 均摊时间复杂度,听起来跟平均时间复杂度有点儿像。对于初学者来说,这两个概念确实非常容易弄混。我前面说了,大部分情况下,我们并不需要区分最好、 最坏、平均三种复杂度。平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。 老规矩,我还是借助一个具体的例子来帮助你理解。(当然,这个例子只是我为了方便讲解想出来的,实际上没人会这么写。) / array表示一个长度为n的数组 / 代码中的array.length就等于n in

11、t array = new intn; int count = 0; void insert(int val) if (count = array.length) int sum = 0; for (int i = 0; i = len) / 数组空间不够了 / 重新申请一个2倍大小的数组空间 int new_array = new intlen*2; / 把原来array数组中的数据依次copy到new_array for (int j = 0; j len; +j) new_arrayj = arrayj; / new_array复制给array,array现在大小就是2倍len了 arr

12、ay = new_array; len = 2 * len; / 将element放到下标为i的位置,下标i加一 arrayi = element; +i; 欢迎留言和我分享,我会第一时间给你反馈。 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 精选留言: Alvin 2018-09-28 01:56:09 老师讲的很好,练习题最好是O(1),最差是O(n), 均摊是O(1)。 看到好多人纠结于清空数组的问题:

13、 对于可反复读写的存储空间,使用者认为它是空的它就是空的。如果你定义清空是全部重写为0或者某个值,那也可以! 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 但是老师举的例子完全没必要啊!写某个值和写任意值在这里有区别吗,使用值只关心要存的新值!所以老师的例子,清空把下标指到第一个位置就可以了 ! 742赞 作者回复2018-09-28 02:07:26 嗯嗯 是的 多谢你。同学们帮把这一条顶上去吧 可以让其他同

14、学都看看 阿杜S考特 2018-09-27 2技巧和诀窍技巧和诀窍 3V M 2006 Microchip Technology Inc.DS41285A_CN 第 i 页 技巧和诀窍简介技巧和诀窍简介 技巧 #1:使用 LDO 稳压器,从 5V 电源向 3.3V 系统供 电 4 技巧 #2:选择方案:采用齐纳二极管的低成本供电系统 6 技巧 #3:选择方案:采用 3 个整流二极管的更低成本供 电系统 .8 技巧 #4:使用开关稳压器,从 5V 电源向 3.3V 系统供 电 10 技巧 #5:3.3V ? 5V 直接连接 .13 技巧 #6:3.3V ? 5V 使用 MOSFET 转换器.14

15、 技巧 #7:3.3V ? 5V 使用二极管补偿.16 技巧 #8:3.3V ? 5V 使用电压比较器.18 技巧 #9:5V ? 3.3V 直接连接 .21 技巧 #10: 5V ? 3.3V 使用二极管钳位22 技巧 #11: 5V ? 3.3V 有源钳位.24 技巧 #12: 5V ? 3.3V 电阻分压器.25 技巧 #13: 3.3V ? 5V 电平转换器.29 技巧 #14: 3.3V ? 5V 模拟增益模块32 技巧 #15: 3.3V ? 5V 模拟补偿模块33 技巧 #16: 5V ? 3.3V 有源模拟衰减器34 技巧 #17: 5V ? 3.3V 模拟限幅器.37 技巧

16、#18: 驱动双极型晶体管 41 技巧 #19: 驱动 N 沟道 MOSFET 晶体管 44 目录目录 技巧和诀窍技巧和诀窍 技巧和诀窍技巧和诀窍 DS41285A_CN 第 ii 页 2006 Microchip Technology Inc. 注:注: 技巧和诀窍技巧和诀窍 2006 Microchip Technology Inc.DS41285A_CN 第 1 页 技巧和诀窍简介技巧和诀窍简介 3.3 伏至 5 伏连接。 概述概述 我们对处理速度的需求日益增长,伴随着这种增 长,用来构建单片机的晶体管尺寸则在持续减小。 以更低的成本实现更高的集成度,也促进了对更小 的几何尺寸的需求。随

17、着尺寸的减小,晶体管击穿 电压变得更低,最终,当击穿电压低于电源电压 时,就要求减小电源电压。因此,随着速度的提高 和复杂程度的上升,对于高密度器件而言,不可避 免的后果就是电源电压将从 5V 降至 3.3V,甚至 1.8V。 Microchip 单片机的速度和复杂性已经到达足以要 求降低电源电压的程度,并正在向 5V 电源电压以 下转换。但问题是绝大多数接口电路仍然是为 5V 电源而设计的。这就意味着,作为设计人员,我们 现在面临着连接 3.3V 和 5V 系统的任务。此外, 这个任务不仅包括逻辑电平转换,同时还包括为 3.3V 系统供电、 转换模拟信号使之跨越 3.3V/5V 的 障碍。

18、技巧和诀窍技巧和诀窍 DS41285A_CN 第 2 页 2006 Microchip Technology Inc. 本 技巧和诀窍提供了一些电源供电组件、数 字电平转换组件甚至模拟转换组件,以解决所面临 的挑战。全书对每种转换均给出了多种选择方案, 从单片 (All-in-One)接口器件到低成本的分立解 决方案都有涉及。简而言之,无论导致转换的原因 是复杂性、成本还是尺寸,设计人员处理 3.3V 挑 战可能需要的全部组件均在本文有所讨论。 注:注: 本 技巧和诀窍中假设电源为 3.3V。然 而对于其他电源电压,给出的方法只需要 经过适当的修正,将同样适用。 技巧和诀窍技巧和诀窍 2006

19、 Microchip Technology Inc.DS41285A_CN 第 3 页 电源电源 面对 3.3V 挑战首先要解决的问题之一是产生 3.3V 电源电压。假设讨论的是 5V 系统至 3.3V 系统的 连接,我们可以认为已经拥有稳定的 5 VDC电源。 本节将给出针对 5V 至 3.3V 转换而设计的电压稳 压器解决方案。只需要适中的电流消耗的设计可以 使用简单的线性稳压器。如果电流需求较高的话, 可能就需要开关稳压器解决方案。对成本敏感的应 用,可能需要简单的分立式二极管稳压器。下面针 对这几种情况各给出一个例子,同时包含了必要的 支持信息,使其适用于各种最终应用。 表表 1:电源

20、比较:电源比较 方法方法VREGIQ效率尺寸成本瞬态响应效率尺寸成本瞬态响应 齐纳旁路 稳压器 10% 典型值 5 mA60% 小低差 串联线性 稳压器 0.4% 典型值 1 A 至 100 A 60% 小中极好 开关降压 稳压器 0.4% 典型值 30 A 至 2 mA 93% 中 到 大 高好 技巧和诀窍技巧和诀窍 DS41285A_CN 第 4 页 2006 Microchip Technology Inc. 技巧技巧 #1使用使用 LDO 稳压器,从稳压器,从 5V 电源向电源向 3.3V 系统供电系统供电 标准三端线性稳压器的压差通常是 2.0-3.0V。要 把 5V 可靠地转换为

21、3.3V,就不能使用它们。压 差为几百个毫伏的低压降 (Low Dropout, LDO) 稳压器,是此类应用的理想选择。图 1-1 是基本 LDO 系统的框图,标注了相应的电流。从图中可 以看出, LDO 由四个主要部分组成: 1. 导通晶体管 2. 带隙参考源 3. 运算放大器 4. 反馈电阻分压器 在选择 LDO 时,重要的是要知道如何区分各种 LDO。器件的静态电流、封装大小和型号是重要 的器件参数。根据具体应用来确定各种参数,将会 得到最优的设计。 技巧和诀窍技巧和诀窍 2006 Microchip Technology Inc.DS41285A_CN 第 5 页 图图 1-1:LD

22、O 电压稳压器电压稳压器 LDO的静态电流IQ是器件空载工作时器件的接地电 流 IGND。 IGND是 LDO 用来进行稳压的电流。当 IOUTIQ时, LDO 的效率可用输出电压除以输入 电压来近似地得到。然而,轻载时,必须将 IQ计 入效率计算中。具有较低 IQ的 LDO 其轻载效率较 高。轻载效率的提高对于 LDO 性能有负面影响。 静态电流较高的 LDO 对于线路和负载的突然变化 有更快的响应。 IIN VIN VREF IOUT C1 C2 IGND RL 技巧和诀窍技巧和诀窍 DS41285A_CN 第 6 页 2006 Microchip Technology Inc. 技巧技巧

23、 #2选择方案:采用齐纳二极管的低成 本供电系统 选择方案:采用齐纳二极管的低成 本供电系统 这里详细说明了一个采用齐纳二极管的低成本稳压 器方案。 图图 2-1:齐纳电源:齐纳电源 可以用齐纳二极管和电阻做成简单的低成本 3.3V 稳压器,如图 2-1 所示。在很多应用中,该电路可 以替代 LDO 稳压器并具成本效益。但是,这种稳 压器对负载敏感的程度要高于 LDO 稳压器。另 外,它的能效较低,因为 R1和 D1始终有功耗。 R1限制流入D1和PICmicro MCU的电流, 从而使 VDD保持在允许范围内。由于流经齐纳二极管的电 流变化时,二极管的反向电压也将发生改变,所以 需要仔细考虑

24、 R1的值。 VDD VSS PICmicro MCU 0.1 FC1 D1 +5V R1 470 技巧和诀窍技巧和诀窍 2006 Microchip Technology Inc.DS41285A_CN 第 7 页 R1的选择依据是:在最大负载时通常是在 PICmicro MCU 运行且驱动其输出为高电平时 R1上的电压降要足够低从而使PICmicro MCU有足 以维持工作所需的电压。同时,在最小负载时 通常是 PICmicro MCU 复位时VDD不超过齐 纳二极管的额定功率,也不超过 PICmicro MCU 的最大 VDD。 技巧和诀窍技巧和诀窍 DS41285A_CN 第 8 页

25、2006 Microchip Technology Inc. 技巧技巧 #3选择方案:采用选择方案:采用 3 个整流二极管的 更低成本供电系统 个整流二极管的 更低成本供电系统 图 3-1 详细说明了一个采用 3 个整流二极管的更低 成本稳压器方案。 图图 3-1:二极管电源:二极管电源 我们也可以把几个常规开关二极管串联起来,用其 正向压降来降低进入的 PICmicro MCU 的电压。 这甚至比齐纳二极管稳压器的成本还要低。这种设 计的电流消耗通常要比使用齐纳二极管的电路低。 VDD VSS PICmicro MCU 0.1 FC1 R1 +5V D3 D1D2 技巧和诀窍技巧和诀窍 20

26、06 Microchip Technology Inc.DS41285A_CN 第 9 页 所需二极管的数量根据所选用二极管的正向电压而 变化。二极管 D1-D3的电压降是流经这些二极管 的电流的函数。连接 R1是为了避免在负载最小时 通常是 PICmicro MCU 处于复位或休眠状态 时PICmicro MCU VDD引脚上的电压超过 PICmicro MCU 的最大 VDD值。根据其他连接至 VDD的电路, 可以提高R1的阻值, 甚至也可能完全 不需要 R1。二极管 D1-D3的选择依据是:在最大 负载时通常是 PICmicro MCU 运行且驱动其 输出为高电平时D1-D3上的电压降要

27、足够低从 而dowsWindowsWindowsWindows 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! _ from ctypes import * msvcrt = cdll.msvcrt message_string = “Hello world!n“ msvcrt.printf(“Testing: %s“, message_string) _ 输出结果见如下: _ C:Python25 python chapter1-printf.py Testing: Hello world! C:Python25

28、_ Linux 下会有略微不同: c c c chapter1-printf.pyhapter1-printf.pyhapter1-printf.pyhapter1-printf.py CodeCodeCodeCode onononon LinuxLinuxLinuxLinux _ from ctypes import * libc = CDLL(“libc.so.6“) message_string = “Hello world!n“ libc.printf(“Testing: %s“, message_string) _ 输出结果如下: _ # python /root/chapter1-

29、printf.py Testing: Hello world! # _ 可以看到 ctypes 调用动态链接库中的函数有多简单。 1.3.31.3.31.3.31.3.3构造构造 C C C C 数据类型数据类型 使用 Python 创建一个 C 数据类型很简单, 你可以很容易的使用由 C 或者 C+些的组件。 Listing 1-1 显示三者之间的对于关系。 _ C C C CTypeTypeTypeTypePythonPythonPythonPython TypeTypeTypeTypectypesctypesctypesctypes TypeTypeTypeType _ char1-ch

30、aracter stringc_char wchar_t1-character Unicode stringc_wchar 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! charint/longc_byte charint/longc_ubyte shortint/longc_short unsigned shortint/longc_ushort intint/longC_int unsigned intint/longc_uint longint/longc_long unsigned longint/long

31、c_ulong long longint/longc_longlong unsigned long longint/longc_ulonglong floatfloatc_float doublefloatc_double char * (NULL terminated)string or nonec_char_p wchar_t * (NULL terminated)unicode or nonec_wchar_p void *int/long or nonec_void_p ListingListingListingListing 1-11-11-11-1:Python:Python:Py

32、thon:Python 与与 C C C C 数据类型映射数据类型映射 请把这章表放到随时很拿到的地方。ctypes 类型初始化的值,大小和类型必须符合定义 的要求。看下面的例子。 _ C:Python25 python.exe Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) MSC v.1310 32 bit (Intel) on win32 Type “help“, “copyright“, “credits“ or “license“ for more information. from ctypes import * c_int() c_lo

33、ng(0) c_char_p(“Hello world!“) c_char_p(Hello world!) c_ushort(-5) c_ushort(65531) c_short(-5) c_short(-5) seitz = c_char_p(“loves the python“) print seitz c_char_p(loves the python) print seitz.value loves the python exit() _ 最后一个例子将包含了“loves the python“的字符串指针赋值给变量 seitz,并通过 seitz.value 方法间接引用了指针的内

34、容, 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! 1.3.51.3.51.3.51.3.5定义结构和联合定义结构和联合 结构和联合是非常重要的数据类型, 被大量的适用于 WIN32 的 API 和 Linux 的 libc 中。 一个结构变量就是一组简单变量的集合(所有变量都占用空间)些结构内的变量在类型上没 有限制,可以通过点加变量名来访问。比如 beer_recipe.amt_barley,就是访问 beer_recipe 结 构中的 amt_barley 变量。 InInInIn C C C C _ str

35、uct beer_recipe int amt_barley; int amt_water; ; _ InInInIn PythonPythonPythonPython _ class beer_recipe(Structure): _fields_ = (“amt_barley“, c_int), (“amt_water“, c_int), _ 如你所见,ctypes 很简单的就创建了一个 C 兼容的结构。 联合和结构很像。 但是联合中所有变量同处一个内存地址, 只占用一个变量的内存空间, 这个空间的大小就是最大的那个变量的大小。 这样就能够将联合作为不同类型的变量操作访 问了。 InInI

36、nIn C C C C _ union longbarley_long; intbarley_int; charbarley_char8; barley_amount; _ InInInIn PythonPythonPythonPython _ class barley_amount(Union): 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! _fields_ = (“barley_long“, c_long), (“barley_int“, c_int), (“barley_char“, c_char * 8)

37、, _ 如果我们将一个整数赋值给联合中的 barley_int,接着我们就能够调用 barley_char,用 字符的形式显示刚才输入的 66。 c c c chapter1-unions.pyhapter1-unions.pyhapter1-unions.pyhapter1-unions.py _ from ctypes import * class barley_amount(Union): _fields_ = (“barley_long“,c_long), (“barley_int“,c_int), (“barley_char“,c_char * 8), value = raw_inp

38、ut(“Enter the amount of barley to put into the beer vat: my_barley = barley_amount(int(value) print “Barley amount as a long: %ld“ % my_barley.barley_long print “Barley amount as an int: %d“ % my_barley.barley_long print “Barley amount as a char: %s“ % my_barley.barley_char _ 输出如下: _ C:Python25 pyth

39、on chapter1-unions.py Enter the amount of barley to put into the beer vat: 66 Barley amount as a long: 66 Barley amount as an int: 66 Barley amount as a char: B C:Python25 _ 给联合赋一个值就能得到三种不同的表现方式。 最后一个 barley_char 输出的结果是 B, 因为 66 刚好是 B 的 ASCII 码。 barley_char 成员同时也是个数组, 一个八个字符大小的数组。 在 ctypes 中申请一个数组,

40、只要简单的将变量类型乘以想要申请的数量就可以了。 一切就绪,开始我们的旅程吧! 欢迎加入非盈利Py t h o n 学习交流编程QQ群783462347,群里免费提供500+本Py t h o n 书籍! 2 2 2 2 调试器设计 调试器就是黑客的眼睛。你能够使用它对程序进行动态跟 踪和分析。特别是当涉及到 调试器设计 调试器就是黑客的眼睛。你能够使用它对程序进行动态跟 踪和分析。特别是当涉及到 exploitexploitexploitexploit ,fuzzer,fuzzer,fuzzer,fuzzer 和病毒分析的时候, 动态分析的能力决定你的技术水平。 和病毒分析的时候, 动态分析

41、的能力决定你的技术水平。对于调试器的使用大家都再熟悉不过 了, 但是对调试器的实现原理, 估计就不是那么熟悉了。 当我们对软件缺陷进行评估的时候, 调试器提供了非常多的便利和优点。比如运行,暂停,步进,一个进程;设置断点;操作寄 存器和内存;捕捉内部异常,这些底层操作的细节,正是我这章要详细探讨的。 在深入学习之前, 先让我们先了解下白盒调试和黑盒调试的不同。 许多的开发平台都会 包含一个自带的调试器, 允许开发工具结合源代码对程序进行精确的跟踪测试。 这就是白盒 调试。当我们很难得到源代码的时候,开发者,逆向工程师,Hacker 就会应用黑盒调试跟 踪目标程序。黑盒调试中,被测试的软件对黑客

42、来说是不透明的,唯一能看到的就是反汇编 代码。这时候要分析出程序的运作流程,找出程序的错误将变得更复杂,花费的时间也会更 多。但是高超的逆向技术集合优秀的逆向工具将使这个过程变得简单,轻松,有时候善于此 道的黑客,甚至比开发者更了解软件:)。 黑盒测试分成两种不同的模式:用户模式 和 内核模式。用户模式(通常指的是 ring3 级的程序)是你平时运行用户程序的一般模式(普通的程序) 。用户模式的权限是最低的。 当你运行“运算器(cacl.exe) ”的时候,就会产生一个用户级别的进程;对这个进程的调试 就是用户模式调试。核心模式的权限是最高的。这里运行着操作系统内核,驱动程序,底层 组件。当运行 Wireshark 嗅探数据包的时候,就是和

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 教育专区 > 终生教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报