逆向工程体系化入门
一、课前测试
1、X86寄存器中,EAX寄存器主要用于()
A 计数器 B 累加器 C 函数返回值 D 程序指针
2、C语言中,printf函数属于哪个标准库?()
A time.h B string.h C stdio.h D ctype.h
3、函数调用时,用于保存参数的数据结构是?()
A 链表 B 栈 C 堆 D队列
4、32位CPU的内存寻址空间为?()
A 1G B 2G C 4G D 8G
5、在下列编程语言中,开发效率最高的是?()
A 机器语言 B 汇编语言 C C语言 D C++语言
6、ASCII码使用几个bit进行编码?()
A 7 0x00-0x7f B 8 C 16 D 24
7、下面的动态链接库中,哪个是图形设备接口?()
A kernel32.dll B User32.dll C GDI32.dll D advapi32.dll lib
8、数据在内存中有两种存储方式,分别是大端存储和小端存储,Windows操作系统采用的是哪一种存储方式?()
A 大端 B 小端
二、逆向工程基础体系
逆向工程是计算机领域或网络安全领域难度较大的学习内容,需要的前置知识点较多,包括数据的存储及表示、C语言、C++、汇编语言、操作系统、Windows操作系统、Linux操作系统、ELF文件、PE文件、算法、计算机组成原理、数据结构等。标红部分为本节课主要讲解的内容。
三、数据的存储及表示
数据的存储及表示包括进制及转换、数据的宽度及表示范围、文本字符等内容。
四、C语言编译过程
1、从源代码到可执行文件
- 在命令行中执行gcc hello.c可生成a.out。
- 如果要指定目标文件的名称,命令为:gcc hello.c -o hello
- 整个编译过程分为4个步骤:预处理(Preprocessing)、编译(Compilaiton)、汇编(Assembly)和链接(Linking)。
2、预编译
- gcc -E hello.c -o hello.i
- 预编译过程主要处理源代码中以“#”开始的预编译指令
3、编译
- 编译的命令为: gcc -S hello.c -o hello.s
4、汇编
- 命令为gcc -c hello.s -o hello.o或者gcc -c hello.c -o hello.o
- 可通过objdump查看目标文件:objdump -sd hello.o
5、链接
- 命令为gcc hello.o -o hello
- 通过objdump可查看可执行文件的内容:objdump -d -j .txt hello
- 目标文件需要链接一大堆文件才能得到最终的可执行文件。链接过程包括地址和空间分配(Address and Storage
Allocation)、符号决议(Symbol Resolution)和重定向(Relocation)等。
五、汇编语言
图中对汇编语言寄存器和指令进行梳理,并包含了大量的实验。
六、内存管理
内存管理主要包含内存的基本概念、栈与调用约定、堆与内存管理。内存布局和堆栈是核心。
七、PE文件
PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件。了解PE文件格式有助于加深对操作系统的理解,掌握可执行文件的数据结构机器运行机制,对于逆向破解,加壳等安全方面方面的同学极其重要。
八、相关资源
思维导图原图
1、逆向工程基础
2、数据的存储及表示
3、汇编语言
4、内存管理
5、Windows操作系统
6、PE文件
文本资源
1、C语言编译过程
2、测试题
工具
1、OD
2、c32asm
3、RadASM
其他
1、radasm+od查看实验数据
2、hello.c
百度网盘链接:https://pan.baidu.com/s/1Wxtf0avHZRN6BZ92cmUjpw
提取码:m05m