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. 几个重要概念
-
文件偏移地址:数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏 移。
-
装载基址:PE 装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL 文件是0x10000000。这些位置可以通过修改编译选项更改。
-
虚拟内存地址: PE 文件中的指令被装入内存后的地址。
-
相对虚拟地址:相对虚拟地址是内存地址相对于映射基址的偏移量。
关系如下:
VA = Image Base + RVA

-
使用Lord PE可以查看节信息
-
Lord PE查看导入表信息
-
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窗口
3821

被折叠的 条评论
为什么被折叠?



