反汇编与软件逆向
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Linux中,系统不是根据文件的扩展名来查找对应的程序,而是根据文件中二进制的标 记字段,其可执行文件为ELF文件(Executable and Linkable Format)
PE文件和ELF文件都是基于Unix的COFF文件演化而来 后面我们主要介绍Windows的PE文件结构,及Windows下的反汇编分析
汇编基础
2.2.5一个函数的反汇编代码(Debug版)
push ebp mov ebp,esp sub esp,0x10 mov dword ptr ss:[ebp-0x4],0x0 mov eax,dword ptr ss:[ebp+0x8] mov dword ptr ss:[ebp-0x8],eax jmp short 00401352 mov eax,dword ptr ss:[ebp-0x8] add dword ptr ss:[ebp-0x4],eax inc dword ptr ss:[ebp-0x8] mov eax,dword ptr ss:[ebp-0x8] cmp eax,dword ptr ss:[ebp+0xC] jle short 00401349 mov eax,dword ptr ss:[ebp-0x4] leave retn
可执行文件结构
2.3.3 PE文件的结构
系统的主要功能就是执行程序,对可执行文件的学习,可以更加深入的了解 系统的运行机制,在Windows系统中,可执行文件的结构如下:
文件尾
区块间隙,0填充
文件头
文件
内存
基地址
可执行文件结构
2.3.2可执行文件分类
在Windows系统中,可执行文件如*.exe文件、*.dll文件都统称为PE(Portable Executable) 文件,PE文件按照一定的标准进行字段组织,使之能正确的被系统装载和执行
将当前栈顶的值取出,存放到EIP中,并继续执行
正常情况下:call指令一般在子函数调用时使用,ret指令在子函数返回时使用
汇编基础
2.2.4常用寄存器
EAX 累加器,在加法、乘法指令中用到的寄存器,或存放函数返回值 EBX 基地址寄存器,在内存寻址时存放基地址 ECX 计数器,在循环中一般会使用 EDX 存放整数除法产生的余数 ESI/EDI:源/目标索引寄存器,在很多字符串操作中ESI指向源,EDI指向目标 EBP 基址指针,一般用来存放函数的起始地址 ESP 始终指向栈顶 EIP 存放下条指令的地址
PE文件结构
2.2.3.2 PE文件结构的PE头部
typedef struct _IMAGE_NT_HEADERS { DWORD Signature; //PE头标志,为PE IMAGE_FILE_HEADER FileHeader; //文件头 IMAGE_OPTIONAL_HEADER32 OptionalHeader; //可选头 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
反汇编与逆向技术
课程目录
一、软件逆向概述 二、基础知识 三、常用工具 四、逆向破解实战 五、总结
软件逆向概述
1.1软件逆向的概念
突破软件限制
汇编层分析算法
可执行文件
软件源代码
软件逆向概述
1.2软件逆向的一般步骤
1、研究保护方法,去除保护功能 2、反汇编目标软件,定位功能函数 3、分析汇编代码 4、修改汇编代码或还原高级源代码
简单概括: 1、汇编语言是机器语言的符号表示,与硬件相关
2、个人电脑运行的是基于X86处理器架构的汇编语言
3、最终程序的运行都是一条条指令的运行
汇编基础
2.2.2汇编语言与其它语言的转换
32位
汇编基础
2.2.3常见汇编指令
Add eax,ecx Sub eax,ecx eax寄存器的值加上ecx寄存器的值,结果保存在eax寄存器 eax寄存器的值减去ecx寄存器的值,结果保存在eax寄存器
2.2.1汇编语言概述
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控 制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符 代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的 设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。 普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之 间不可直接移植。
软件逆向概述
1.3软件逆向的应用 软件破解
软件汇编级BUG调试
病毒分析 漏洞分析
基础知识
2.1、数据结构基础知识 2.2、汇编语言基础知识 2.3、可执行文件结构 2.4、Windows启动与程序装载 2.5、软件保护(选)
数据结构基础
2.1.1栈的结构
数据结构基础
2.1.2栈的工作原理
汇编基础
int add(int low,int high){ int sum=0; int i=low; for(i;i<=high;++i){ sum+=i; } return sum; }
可执行文件结构
2.3.1程序的编译与链接
源文件经过编译,生成目标文件(在Windows中是*.obj文件,在Linux中是*.o文件)。 目标文件再用链接器链接(和库文件一起组合)生成最终的可执行文件
PE可选头部保存了可执行文件中 最多的重要信息
最后一个元素数据目录表,保存了 程序中导出、导入表、数据、异常 处理等的地址
PE文件结构
2.2.3.3 PE文件结构的区块表
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 节表名称,如“.text” union { DWORD PhysicalAddress; // 物理地址 DWORD VirtualSize; // 虚拟大小 } Misc; DWORD VirtualAddress; // 节区的 RVA 地址 DWORD SizeOfRawData; // 在文件中对齐后的尺寸 DWORD PointerToRawData; // 在文件中的偏移量 DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移 DWORD PointerToLinenumbers; // 行号表的偏移(供调试使用地) WORD NumberOfRelocations; // 在OBJ文件中使用,重定位项数目 WORD NumberOfLinenumbers; // 行号表中行号的数目 DWORD Characteristics; // 节属性如可读,可写,可执行等 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
Signature字段为PE文件的标志,十六进制固定为0x5035, FileHeader为文件头,存放 了一些关于文件的属性,如创建时间。 OptionalHeader名字叫可选头,实质是必须的, 并且存放了很多重要的信息,如程序的基地址、程序的执行入口等。
PE文件结构
2.2.3.2 PE文件结构的PE头部
typedef struct _IMAGE_FILE_HEADER { WORD Machine; //运行平台 WORD NumberOfSections; //区块数量 DWORD TimeDateStamp; //文件创建时间 DWORD PointerToSymbolTable; //指向符号表 DWORD NumberOfSymbols; //符号表中符号个数 WORD SizeOfOptionalHeader; //可选头的大小 WORD Characteristics; //文件属性 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; Characteristics属性字段标记了文件的很多信息,如可执行文件是EXE还是DLL、 可执行文件是否为系统文件、是否是32位字的机器等
PE文件结构
2.2.3.2 PE文件结构的PE头部
typedef struct _IMAGE_OPTIONAL_HEADER { // Standard fields. WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfEntryPoint; //程序执行入口 DWORD BaseOfCode; //代码区块的其实RVA DWORD BaseOfData; //数据区块的其实RVA // NT additional fields. DWORD ImageBase; //首选装载地址 DWORD SectionAlignment; //内存中区块对其大小 DWORD FileAlignment; //文件中区块对其大小 WORD MajorOperatingSystemVersion; WORD MinorOperatingSystemVersion; WORD MajorImageVersion; WORD MinorImageVersion; WORD MajorSubsystemVersion; WORD MinorSubsystemVersion; DWORD Win32VersionValue; DWORD SizeOfImage; //装入内存后的总大小 DWORD SizeOfHeaders; //DOS头+PE头+区块表的总大小 DWORD CheckSum; //映像的校验和 WORD Subsystem; WORD DllCharacteristics; DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; DWORD SizeOfHeapReserve; DWORD SizeOfHeapCommit; DWORD LoaderFlags; DWORD NumberOfRvaAndSizes; //数据目录表个数 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
软件逆向概述
PE文件结构
2.2.3.1 PE文件结构的DOS头部
typedef struct _IMAGE_DOS_HEADER { // WORD e_magic; // WORD e_cblp; // WORD e_cp; // WORD e_crlc; // WORD e_cparhdr; // WORD e_minalloc; // WORD e_maxalloc; // WORD e_ss; // WORD e_sp; // WORD e_csum; // WORD e_ip; // WORD e_cs; // WORD e_lfarlc; // WORD e_ovno; // WORD e_res[4]; // WORD e_oemid; // WORD e_oeminfo; // WORD e_res2[10]; // LONG e_lfanew; // } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; DOS .EXE header Magic number,标志,为MZ Bytes on last page of file Pages in file Relocations Size of header in paragraphs Minimum extra paragraphs needed Maximum extra paragraphs needed Initial (relative) SS value Initial SP value Checksum Initial IP value Initial (relative) CS value File address of relocation table Overlay number Reserved words OEM identifier (for e_oeminfo) OEM information; e_oemid specific Reserved words PE文件头的文件偏移
cmp eax,ebx eax寄存器的值与ebx寄存器的值比较,如相等z标志置1否则置0
Jnz eax Call eax Jnz不为0时跳转,即z标志为0时跳转到eax表示的地址处继续执行 先将下条指令的地址压栈,再跳转到eax表示的地址处执行 将ecx寄存器的值保存在eax寄存器中
mov eax,ecx Ret