- 信息安全:软件安全、网络安全、内容安全
- 逆向工程是软件安全的核心基础课
- 安全问题从表面是看不出来的必须要深入到内部。
- 那如何深入到软件内部?
- 从软件的可执行体逐步剖析软件的实现原理,甚至还原软件的源代码。
- 就是从软件的可执行程序,逐步剖析,分析软件的实现原理,甚至还原软件的源代码的过程和技术。
- 我们都知道,软件有很多种架构,不同的架构的程序,其原理和实现机制、运行机制区别很大。逆向工程是可以针对所有的软件吗?
- 例如对脚本程序,所见即所得,程序源码即可运行。
- 对服务器端程序,一般不能得到“可执行体”
<style> table th:first-of-type { width: 120px; } </style>
架构 | 编译型 | 解释型 |
---|---|---|
语言 | C\C++等 | JavaScript、python、php、perl、Ruby等 |
可执行程序 | 二进制文件exe、elf等 | 文本文件、可执行程序就是源码 |
应用范围 | 广泛、因为是直接由硬件执行,所以可以用于开发包括操作系统和操作系统原生应用程序在内的几乎所有程序 | 只能开发应用程序,因为执行必须依赖于软件,不能进行比其执行器跟底层的工作 |
执行器 | CPU,通常由操作系统加载以后 | 一个编译型软件,解释性语言的解释执行器是由编译型语言写的 |
优点 | 执行效率高、可以完成操作系统层和硬件层的相关操作 | 跨平台(操作系统)、开发效率高,有丰富的程序库 |
缺点 | 学习成本高(需要较多系统底层背景知识,如内存管理、指针等) | 有较高的封装性因此学习成本较低 |
- 逆向工程技术主要针对编译型软件。
- 但是解释性软件的脚本程序也有一定的代码保护需求,因此也发展出了代码混淆等技术。人为消除了其“所见即所得”的特性,因此某些情况下也需要逆向工程。
- 本课程当然以编译型软件的逆向分析技术为主要内容。这方面已经形成了完整的体系和方法论。
- 正向 编写源代码 x.c ->编译-> x.obj ->链接(加入库)-> x.exe
- 逆向 得到 x.exe ->逆向工程工具-> 函数列表、控制流图等基础数据 ->逆向工程师人工分析-> 实现原理 -> 编写源代码(如果需要)
- 反编译(含反汇编)
- 反混淆
- 二进制文件\可执行程序
- PE文件
- 汇编、反汇编、机器指令
- 控制流图
- 函数调用关系图
- API
- 动态链接
- 中断和调试
- file: 查看文件基本类型
- hexdump\od\xxd:以十六进制方式显示文件内容
- objdump:可执行文件(PE和ELF文件)的基本信息查看、反汇编、调试
- radare2:绘制控制流图
- gdb:调试器,包括调试器中断执行、单步执行、显示执行时数据值、反汇编等一系列功能。
- dumpbin:Windows下的可执行文件(PE格式)的基本信息查看,反汇编等。
- PE-explore:Windows下的可执行文件(PE格式)的基本信息查看,反汇编等(GUI)。
- IDA-pro:可视化的反汇编和程序控制流图。
- Windbg:调试器,平台和使用方法不同,功能类似gdb。
- 查阅ELF文件格式文档说明,使用hexdump\od\xxd查看一个ELF格式的文件(如/sbin/ifconfig)的二进制数据,找出其关键的文件头信息。
- 使用objdump命令,查看同一个文件的文件头信息,分析与上一部手工分析的结果是否相同,进行对比。
- 查阅PE文件格式文档说明,使用hexdump\od\xxd查看一个PE格式的文件(如C:\windows\notepad.exe)的二进制数据,找出其关键的文件头信息。(从Windows下拷贝到Linux,或者在Windows下安装MingGW)
- 使用dumpbin(需要安装VS或者SDK)命令,查看同一个文件的文件头信息,分析与上一部手工分析的结果是否相同,进行对比。
- > 输出重定向、转存符 将命令的结果转存到文件以后再分析。