《python灰帽子》学习笔记:调试器设置

一、构造 C  数据类型

  • C Type        | Python Type      | ctypes Type
  • _______________________________________________________________________________________
  • char         | 1-character      | string c_char
  • wchar_t        | 1-character Unicode | string c_wchar
  • char         | int/long        | c_byte
  • char        | int/long        | c_ubyte
  • short        | int/long        | c_short
  • unsigned short    | int/long        | c_ushort
  • int         | int/long        | C_int
  • unsigned int     | int/long        | c_uint
  • long         | int/long        | c_long
  • unsigned long    | int/long        | c_ulong
  • long long       | int/long        | c_longlong
  • unsigned long long | int/long        | c_ulonglong
  • float         | float         | c_float
  • double        | float         | c_double
  • char * (NULL terminated)  | string or none    | c_char_p
  • wchar_t * (NULL terminated) | unicode or none    | c_wchar_p
  • void *      | int/long or none    | c_void_

二、通用  CPU  寄存器

  • CPU 的寄存器能够对少量的数据进行快速的存取访问。在 x86 指令集里,一个 CPU 有

八个通用寄存器:EAX, EDX, ECX, ESI, EDI, EBP, ESP 和 EBX。还有很多别的寄存器,遇
到的时候具体讲解。 这八个通用寄存器各有不同的用途, 了解它们的作用对于我们设计调试
器是至关重要的。 让我们先简略的看一看每个寄存器和功能。 最后我们将通过一个简单的实
验来说明他它们的使用方法。

  • EAX 寄存器也叫做累加寄存器,除了用于存储函数的返回值外也用于执行计算的

操作。许多优化的 x86 指令集都专门设计了针对 EAX 寄存器的读写和计算指令。列如从最
基本的加减,比较到特殊的乘除操作都有专门的 EAX 优化指令。
前面我们说了,函数的返回值也是存储在 EAX 寄存器里。这一点很重要,因为通过返
回的 EAX 里的值我们可以判断函数是执行成功与否,或者得到确切返回值。

  • EDX 寄存器也叫做数据寄存器。这个寄存器从本质上来说是 EAX 寄存器的延伸 ,

它辅助 EAX 完成更多复杂的计算操作像乘法和除法。它虽然也能当作通用寄存器使用,不
过更多的是结合 EAX 寄存器进行计算操作。

  • ECX 寄存器,也叫做计数寄存器,用于循环操作,比如重复的字符存储操作,或

者数字统计。有一点很重要,ECX 寄存器的计算是向下而不是向上的(简单理解就是用于
循环操作时是由大减到小的)

  • 在 x86 汇编里, 依靠 ESI 和 EDI 寄存器能对需要循环操作的数据进行高效的处理 。

ESI 寄存器是源操作数指针,存储着输入的数据流的位置。EDI 寄存器是目的操作数指针 ,
存储了计算结果存储的位置。简而言之,ESI(source index)用于读,EDI(destination index )
用于写。用源操作数指针和目的操作数指针,极大的提高了程序处理数据的效率。

  • ESP 和 EBP 分别是栈指针和基指针。 这两个寄存器共同负责函数的调用和栈的操

作。 当一个函数被调用的时候, 函数需要的参数被陆续压进栈内最后函数的返回地址也被压
进。ESP 指着栈顶,也就是返回地址。EBP 则指着栈的底端。有时候,编译器能够做出优
化,释放 EBP,使其不再用于栈的操作,只作为普通的寄存器使用。

  • EBX 是唯一一个没有特殊用途的寄存器。它能够作为额外的数据储存器。
  • 还有一个需要提及的寄存器就是 EIP。这个寄存器总是指向马上要执行的指令。当 CPU

执行一个程序的成千上万的代码的时候,EIP 会实时的指向当前 CPU 马上要执行到的位置。

  • 一个调试器必须能够很方便的获取和修改这些寄存器的内容。 每一个操作系统都提供

了一个接口让调试器和 CPU 交互,以便能够获取和修改这些值。我们将在后面的操作系统
章节详细的单独的讲解。

三、栈
  在开发调试器的时候, 栈是一个非常重要的结构。 栈存储了与函数调用相关的各种信息 ,
包括函数的参数和函数执行完成后返回的方法。ESP 负责跟踪栈顶,EBP 负责跟踪栈底。
栈从内存的高地址像低地址增长。 让我们用前面编写的函数 my_sock()作为例子讲解栈是如
何工作的。
Function  Call  in C
_____________________________________________________________________
int my_socks(color_one, color_two, color_three);
_____________________________________________________________________
Function Call in x86 Assembly
_____________________________________________________________________
push color_three
push color_two
push color_one
call my_socks

四、断点

  当我们需要让被调试程序暂停的时候就需要用到断点。 通过暂停进程, 我们能观察
变量,堆栈参数以及内存数据,并且记录他们。断点有非常多的好处,当你调试进程的时候
这些功能会让你觉得很舒爽。断点主要分成三种:软件断点,硬件断点,内存断点。他们有
非常相似的工作方式,但实现的手段却各不相同。

  1、软件断点

如果我们先前讲解的指令发生在 0x4433221 这个地址,一般是这样显示的:
_______________________________________________________________________________
0x44332211: 8BC3 MOV EAX, EBX
_______________________________________________________________________________
这里显示了地址,操作码,和高级的汇编指令。为了在这个地址设置断点,暂停 CPU ,
我们将从 2 个字节的 8BC3 操作码中换出一个单字节的操作码。这个单字节的操作码也就
是 3 号中断指令(INT 3) ,一条能让 CPU 暂停的指令。3 号中断转换成操作码就是 0xCC 。
这里是设置断点前和设置断点后的对比:
在断点被设置前的操作码
_______________________________________________________________________________
0x44332211: 8BC3 MOV EAX, EBX
_______________________________________________________________________________
断点被设置后的操作码
_______________________________________________________________________________
0x44332211: CCC3 MOV EAX, EBX
_______________________________________________________________________________

  2、硬件断点

  硬件断点非常有用, 尤其是当想在一小块区域内设置断点, 但是又不能修改它们的时候 。
这种类型的断点被设置在 CPU 级别,并用特定的寄存器:调试寄存器。一个 CPU 一般会有
8 个调试寄存器(DR0 寄存器到 DR7 寄存器) ,它们被用于管理硬件断点。调试寄存器 DR0
到调试寄存器 DR3 存储硬件断点地址。这意味着你同一时间内最多只能有 4 个硬件断点。
DR4 和 DR5 保留。DR6 是状态寄存器,说明了被断点触发的调试事件的类型。DR7 本质上
是一个硬件断点的开关寄存器,同时也存储了断点的不同类型。通过在 DR7 寄存器里设置
不同标志,能够创建以下几种断点:
· 当特定的地址上有指令执行的时候中断
. 当特定的地址上有数据可以写入的时候
· 当特定的地址上有数据读或者写但不执行的时候
这非常有用,当你要设置特定的断点(至多 4 个) ,又不能修改运行的进程的时候。

  3、内存断点

  内存断点其实不是真正的断点。当一个调试器设置了一个内存断点的时候,它其实是
改变了内存中某个块或者页的权限。 一个内存页是操作系统处理的最小的内存单位。 一个内
存页被申请成功以后,就拥有了一个权限集,它决定了内存该如何被访问。下面是一些内存
页的访问权限的例子:
  可执行页 允许执行但不允许读或写,否则抛出访问异常
  可读页 只允许从页面中读取数据,其余的则抛出访问异常
  可写页 允许将数据写入页面
任何对保护页的访问都会引发异常,之后页面恢复访问前的状态
大多数系统允许你综合这些权限。举个例子,你能有在内存中创建一个页面,既能
读又能写, 同时另一个页面既能读又能执行。 每一个操作系统都有内建的函数让你查询当前
内存页(并不是所有的)的权限,并且修改它们。

  这里我们感兴趣的是保护页(Guard Page) 。这种类型的页面常被用于:分离堆和栈或者
确保一部分内存数据不会增长出边界。 另一种情况, 就是当一个特定的内存块被进程命中 (访
问)了,就暂停进程。举个例子,如果我们在逆向一个网络服务程序,在其接收到网络数据
包以后,我们在存储数据包的内存上设置保护页,接着运行程序,一旦有任何对保护页的访
问,都会使 CPU 暂停,抛出一个保护页调试异常,这时候我们就能确定程序是在什么时候
用什么方式访问接收到的数据了。 之后再进一步跟踪观察访问内存的指令, 继而确定程序对
数据做了什么操作。 这种断点同时也解决了软件断点数据更新的问题, 因为我们没有修改任
何运行着的代码。

时间: 2024-10-10 08:42:51

《python灰帽子》学习笔记:调试器设置的相关文章

python灰帽子学习感想

Gray Hat Python Python Programming for hackers and reverse engineers Python灰帽子:黑客与逆向project师的Python编程之道 几乎相同两周之前看到了这本书,心情非常是激动啊,下定决心一定要好好看看. 好了一个星期的边看边写,发现激动的心情不在了,里面的内容都是为了底层debuger的 的内容.要安装的东西跟版本号的关系还非常大,都没怎么更新. 换了低版本号的Python安装起来也是不易的.终于能成功安装即可,各个安

【Python灰帽子--黑客与逆向工程师的Python编程之道】我的学习笔记,过程.(持续更新HOT)

我的学习笔记---python灰帽子 世界让我遍体鳞伤,但伤口长出的却是翅膀. -------------------------------------------- 前言 本书是由知名安全机构ImmunityInc的资深黑帽JustinSeitz先生主笔撰写的一本关于编程语言Python如何被广泛应用于黑客与逆向工程领域的书籍. 很庆幸,我会对这方面感兴趣,初中寥寥草草的涉及过一滴点逆向工程只是为了破解某软件刷刷QB啥,当然那是以前..现在回想起来也有点自娱自乐的感觉...接下来这会成为这几

python网络爬虫学习笔记

python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章目录 1. 介绍: 2. 从简单语句中开始: 3. 传送数据给服务器 4. HTTP头-描述数据的数据 5. 异常 5.0.1. URLError 5.0.2. HTTPError 5.0.3. 处理异常 5.0.4. info和geturl 6. Opener和Handler 7. Basic Authentication 8. 代理 9. Timeout 设置 10. Cookie 11. Deb

Python灰帽子中文PDF

Python灰帽子中文PDF百度网盘链接:https://pan.baidu.com/s/1BI-RyIYOPhHusaLMVr17Tg 提取码:qf1o 内容简介 · · · · · · <Python灰帽子>是由知名安全机构Immunity Inc的资深黑帽Justin Seitz主笔撰写的一本关于编程语言Python如何被广泛应用于***与逆向工程领域的书籍.老牌***,同时也是Immunity Inc的创始人兼首席技术执行官(CTO)Dave Aitel为这本书担任了技术编辑一职.书中

Python灰帽子-***与逆向工程师的Python编程之道PD

Python灰帽子-***与逆向工程师的Python编程之道PDF百度网盘链接:https://pan.baidu.com/s/1OsBpcSYuIFQmmFhRs9FehQ 提取码:j1xa 内容简介 · · · · · · <Python灰帽子>是由知名安全机构Immunity Inc的资深黑帽Justin Seitz主笔撰写的一本关于编程语言Python如何被广泛应用于***与逆向工程领域的书籍.老牌***,同时也是Immunity Inc的创始人兼首席技术执行官(CTO)Dave Ai

《python灰帽子》学习笔记:写一个windos 调试器(一)

一.开发内容介绍 为了对一个进程进行调试,你首先必须用一些方法把调试器和进程连接起来.所以, 我们的调试器要不然就是装载一个可执行程序然后运行它, 要不然就是动态的附加到一个运行的进程.Windows 的调试接口(Windows debugging API)提供了一个非常简单的方法完成这两点. 运行一个程序和附加到一个程序有细微的差别. 打开一个程序的优点在于他能在程序运行任何代码之前完全的控制程序. 这在分析病毒或者恶意代码的时候非常有用. 附加到一个进程,仅仅是强行的进入一个已经运行了的进程

python数据分析入门学习笔记儿

学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分析相关python库的介绍(前言1~4摘抄自<利用python进行数据分析>) 1.Numpy: Numpy是python科学计算的基础包,它提供以下功能(不限于此): (1)快速高效的多维数组对象naarray (2)用于对数组执行元素级计算以及直接对数组执行数学运算的函数 (3)用于读写硬盘

HTML学习笔记8——CSS设置背景图片

注意点:   background:blue: 与 background-color:blue: 不一样! 一.关于background设置:   1)background:blue:   2)background-image:url(图片名称): 当背景既有颜色,又有图片时,哪个在后面哪个就生效,如下例所示: 此处写了“新宋体”的这张图片作为本文涉及到的背景图片. 以图片为背景时,若图片小于页面大小,则图片会一直重复直到铺满为止: 字在后面时,字生效 1 <!DOCTYPE html> 2

&lt;&lt;Python基础教程&gt;&gt;学习笔记之|第01章|基础知识

本学习笔记主要用要记录下学习<<Python基础教程>>过程中的一些Key Point,或自己没怎么搞明白的内容,可能有点杂乱,但比较实用,查找起来也方便. 第01章:基础知识 ------ Jython:      Python的Java实现,运行在JVM中,相对稳定,但落后于Python,当前版本2.5,在TA(Python+Robot)会用到 IronPython:  Python的C#实现,运行在Common Language Runtime,速度比Python要快 >