逆向课件复习
第一章 逆向分析概述
1.release模式和debug模式下对代码进行编译采用的方法是不一样的,具体表现在汇编代码不同。release模式下做更多的优化处理
2.汇编指令ja和jg
第二章 程序逆向示例
1.运行在Windows平台的exe文件,通常被成为PE文件,而运行在linux平台的exe文件则称为ELF文件,而Android程序则可以直接通过程序的后缀进行判断。
2.判断Windows程序是32位还是64位?32位Windows下不能运行64位的程序,可以轻松判断;64位Windows可以通过反汇编工具查看程序中对应指令使用的寄存器进行判断。
3.从汇编语言中看,mian并不是程序的真正入口
4.IDA pro打开程序时,通常情况下,弹出的第一个窗口就是程序入口(main);另外可能弹出的是程序的直接入口(start)
5."Xrefs graph to…"指的是调用该函数的父函数以及“祖先”,而"Xrefs graph from…"指的是该函数调用的子函数以及“子孙”
6.栈是程序中一块十分重要的内存空间,程序在加载到系统中时,操作系统会根据需要为其进程分配一块临时的内存空间,用以实现进程内函数调用时参数的传递,以及保存函数内局部变量的值。
第三章 文件格式解析
1.Android App安装包ch3_example.apk是一个压缩文件
PE文件格式
2.PE文件使用一个平面地址空间,所有代码和数据被合并在一起。文件内容被划分为不同的区块,区段中包含代码数据,各个区块按照页边界来对齐,区块没有限制大小,是一个连续的结构。每块都有对应的属性,包括是否可读可写。
3.PE文件加载入内存中时,文件的内容几乎能在被装入到内存映射文件中找相同的信息。但是数据之间的位置可能改变,其某项的偏移地址可能区别与原始的偏移地址。
喵言喵语:“几乎”的原因应该是基地址发生变化。
4.基地址:当PE文件通过Windows加载器被装入内存后,内存中的版本被称为模块。映射文件的起始地址被称为模块句柄,可以通过模块句柄访问其他的数据结构。这个初始内存地址就是基地址。
5.相对虚拟地址:RVA只是内存中的一个简单的相对于PE文件装入地址的偏移地址。
6.文件偏移地址:当PE文件存储在磁盘上时,某个数据的位置相对于文件头的偏移量也称为文件偏移地址或者物理地址。文件偏移地址从PE文件的第一个字节开始计数,起始为零。
7.PE文件的结构:从起始位置开始依次是DOS头、PE文件头、节表以及具体的节。
8.从PE文件中读取需要的内容时,正确的方法是按照数据目录表中的字段来进行定位。
9.各种块的描述
名称 | 描述 |
---|
.text | 默认的代码区块,它的内容全是指令代码,链接器把所有目标文件的text块连接成一个大的.text块。 | .data | 默认的读/写数据块,全局变量,静态变量一般放在这个区段 | .rdata | 默认只读数据区块,但程序中很少用到该块中的数据,一般两种情况用到,一是MS的链接器产生EXE文件中存放调试目录,二是用于存放说明字符串,如果程序的DEF文件中指定了DESCRIPTIO,字符串就会出现在rdata中。 | .idata | 包含其他外来的DLL的函数及数据信息,即输入表,将.idata区块合并成另一个区块已成为一种惯例,典型的是.rdata区块,默认的,链接器只在创建一个Release模式的可执行文件时才能将idata合并到另外一个区块中。 | .edata | 输出表,当创建一个输出API或数据的可执行文件时,连接器会创建一个.EXP文件,这个文件包含一个.edata区块,其会被加载到可执行文件中,经常被合并到.text或.rdata区块中 | .rsrc | 资源,包括模块的全部资源 | .bss | 未初始化的数据 | .crt | 用于C++运行时所添加的数据 | .tls | TLS的意思是线程局部存储器,用于支持通过_declspec(thread)声明的线程局部存储变量的数据 | .reloc | 可执行文件的机制重定向 | .sdata | 相对于全局指针的可被定位的短的读写数据 | .pdata | 异常表 | .didat | 延迟装入输入数据,在非Release模式下可以找到 |
10.PE文件运行需要借助Windows系统的系统函数。导入表就是帮助载入的PE找到所需调用的函数。
ELF文件格式
11.分成三类:
可执行文件(.out):包含代码和数据,是可以直接运行的程序。其代码和数据都有固定的地址(或相对于基地址的偏移)
可重定向文件(.o):包含基础代码和数据,但它的代码及数据都没有指定绝对地址,适合于与其他文件链接来创建可执行文件或者共享文件
共享文件(.so):称为动态库文件,包含了代码和数据,这些数据是在链接时被链接器和运行时动态链接器使用的
12.ELF文件的组成
ELF头、Program Hear Table、节和节头表
ELF提供两种视图,链接视图是以节为单位,执行视图是以段为单位的。
Program Hear Table描述文件中的各种Segments,用来告诉系统如何创建进程映像
segments是从运行的角度来描述ELF文件,sections是从链接的角度来描述ELF文件。
一个segment包含若干个section
DEX文件
13.Dalvik是Android4.4及之前使用的虚拟机,它使用的是JIT技术来执行代码转译,每次执行应用的时候,Dalvik将程序的代码编译为机器语言执行。
14.java程序编译成class文件,再使用dx工具将所有class文件整合到dex文件,dex是Dalvik可执行文件格式。
class文件 | dex文件 |
---|
class文件存在很多冗余信息 | dex工具去除冗余信息,并减少了I/O操作,提高了类的查找速度,让dex文件执行的更快 | 运行的虚拟机是JVM是8位 | 运行的虚拟机DVM的字节码指令是16位 | JVM执行的是基于虚拟栈的虚拟机 | DVM是基于寄存器的虚拟机,寄存器存储的速度比栈快的多,比较适合移动设备。 |
16.Dex文件结构
| 数据名称 | 解释 |
---|
文件头 | header | dex文件头,记录整个dex文件的相关属性 | 索引区 | string_ids | 字符串数据索引 | | type_ids | 类型数据索引 | | proto_ids | 原型数据索引 | | field_ids | 字段数据索引 | | method_ids | 类方法索引 | | class_defs | 类定义数据索引 | 数据区 | data | 数据区,保存了各个类的真实数据 | | link_data | 链接数据区 |
|