第三章 软件调试基础

3.1 二进制文件

3.1.1 PE 文件格式

源代码通过编译和连接后形成可执行文件。可执行文件之所以可以被操作系统加载且运行,是因为它们遵循相同的规范

PE(Portable Executable)是 Win32 平台下可执行文件遵守的数据格式。常见的可执行 文件(如“.exe”文件和“.dll”文件)都是典型的PE文件。

  • .text: 由编译器产生,存放着二进制的机器代码,也是我们反汇编和调试的对象。

  • .data:初始化的数据块,如宏定义、全局变量、静态变量等。

  • .idata:可执行文件所使用的动态链接库等外来函数与文件的信息, 即输入表。

  • .rsrc:存放程序的资源,如图标、菜单等。

还可能出现.reloc,.edata,.tls,.rdata

3.1.2 软件加壳

加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段

加壳的程序可以直接运行,但是不能查看源代码,需要脱壳才可以查看

1. 基本原理

加壳其实是利用特殊的算法,对EXE、DLL文件里的代码、资源等进行压缩、加密。

  • 解压过程完全隐蔽,都在内存中完成

  • 它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序, 执行原来的代码部分。

  • 加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改, 同时也可以防止程序被静态反编译。

加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。

  • 当你加壳时,其实就是给可执行的文件加上 个外衣。用户执行的只是这个外壳程序。

  • 当你执行这个程序的时候这个壳就会把原来的程序 在内存中解开,解开后,以后的就交给真正的程序。

2. 加壳分类

加壳工具通常分为压缩壳和加密壳两类。

  • 压缩壳的特点是减小软件体积大小,加密保护不是重点。

  • 加密壳种类比较多,不同的壳侧重点不同,一些壳单纯保护程序,另一些壳提供额外的 功能,如提供注册机制、使用次数、时间限制等。

3.1.3 虚拟内存
  • 为了防止用户程序访问并篡改操作系统的关键部分,Windows使用了2种处理器存取模 式:用户模式和内核模式。

  • Windows 的内存可以被分为两个层面:物理内存和虚拟内存。其中,物理内存非常复杂, 需要进入Windows内核级别才能看到。

    • 用户模式下:看到的内存地址都是虚拟内存,用户编制和调试程序时使用的地址称为虚拟地址或逻辑地址,其对应的存储空间 称为虚拟内存或逻辑地址空间

    • 计算机物理内存访问地址称为实地址或物理地址,其对应的存储空间称为物理存储空间或主存空间

    • 程序进行虚地址到实地址转换的过程称为程 序的再定位。

  • Windows系统,运行PE文件的时候,操作系统自动加载该文件到内存,并称其为4GB的虚拟存储空间,然后继续执行,形成了进程空间。在该空间中定位的地址称为虚拟内存地址(VA)

  • Windows装载器在装载的 时候仅仅建立好虚拟地址和PE文件之间的映射关系,

    • 只有真正执行到某个内存页中的指令或 访问某一页中的数据时,这个页才会被从磁盘提交到物理内存。

    • 但因为装载可执行文件时, 有些数据在装入前会被预先处理(如需要重定位的代码),装入以后,数据之间的相对位置也 可能发生改变。因此,一个节的偏移和大小在装入内存前后可能是完全不同的。

3.1.4 PE 文件与虚拟内存的映射

调试漏洞的时候,需要进行的操作如下:

  • 看到的PE文件中的指令的h的位置是相对于磁盘文件而言的,及所谓的文件偏移。可能还需要指令在内存中的位置,即虚拟内存地址

  • 看到的指令的地址为虚拟内存地址,需要回到PE文件中找到这条指令对应的机器码

1. 几个重要概念
  1. 文件偏移地址:数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏 移。

  2. 装载基址:PE 装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL 文件是0x10000000。这些位置可以通过修改编译选项更改。

  3. 虚拟内存地址: PE 文件中的指令被装入内存后的地址。

  4. 相对虚拟地址:相对虚拟地址是内存地址相对于映射基址的偏移量。

    关系如下:

    VA = Image Base + RVA

  1. 使用Lord PE可以查看节信息

  2. Lord PE查看导入表信息

  3. PEview查看PE文件格式

3.2 调试分析工具

3.2.1 OllyDBG

  • 反汇编窗口:显示被调试程序的反汇编代码。

  • 寄存器窗口:显示当前所选线程的CPU寄存器内容。

  • 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字符串等。

  • 数据窗口:显示内存或文件的内容。

  • 堆栈窗口:显示当前线程的堆栈。

基本调试方法

  • F2:设置断点,只要在光标定位的位置(上图中灰色条)按 F2 键即可,再按一次 F2 键则会删除断点。

  • F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等 子程序不进入其代码。

  • F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入 其中,进入后首先会停留在子程序的第一条指令上。

  • F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。

  • F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。

  • CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于 从系统领空返回到我们调试的程序领空。

  • ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。

3.2.2 IDA Pro
1. 主要的数据窗口
  • 反汇编窗口

    • 图形视图

  • 文本视图

  • Names窗口

  • Strings窗口

  • Function name窗口

  • Function call窗口

2. 反编译功能
3. 脚本和插件功能

3.3 演示示例

3.3.1 PE 文件代码注入
3.3.2 软件破解示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值