博客:cbb777.fun
全平台账号:安妮的心动录
github: https://github.com/anneheartrecord
下文中我说的可能对,也可能不对,鉴于笔者水平有限,请君自辨。有问题欢迎大家找我讨论
计算机启动过程
基本围绕着输入输出系统(Basic Input/Onput System BIOS)展开
1.开始供电
2.Power On Self Test 检测关键设备是否存在,能否正常运行。如果系统BIOS在这个过程中发现了一些致命错误,比如内存出错或者没有内存,那就会直接控制喇叭来报告错误
3.BIOS选择启动盘 F12可进入选择页面,比如双系统就要这个阶段选择启动的是哪个操作系统
操作系统启动过程
1.读取硬盘的前512个字节,确定操作系统在磁盘中的位置
2.将操作系统载入内核中
程序的生成和运行
Java程序:将源代码通过编译器编译成.class类型文件(字节码),这种文件只能通过JVM识别。
运行的时候JVM从.class文件中读一行解释执行一行。Java为了实现跨平台,不同的操作系统对应不同的JVM,也就是说Java前半部分是编译,后半部分是解析,是一种混合型程序
一个C程序的编写到运行过程
首先使用编辑器编辑程序源文件(.c .cpp)
源程序经过编译器被编译为等价的汇编代码,再经过汇编器产生与目标平台CPU一致的目标代码,也就是机器码
尽管目标代码的指令已经可以被目标CPU执行了,但是可能还包含没有解析的名称和地址引用,因此需要连接器把目标代码文件和其他的一些库文件及资源文件连接起来,产生可执行的二进制exe文件
当执行.exe文件的时候,windows操作系统会解读链接器记录再可执行程序中的格式信息,然后将代码和数据“放置”在内存中,成为可以运行的内存映像,然后生成一个进程开始运行
编译过程
编译器(汇编器)所作的工作主要是翻译工作
预处理,正式编译之前,通过文件中的预处理指令来修改源文件的内容,包括宏定义指令、条件编译指令、头文件包含指令和特殊符号替换指令等等
编译和优化,通过词法分析、语法分析、语义分析,将其翻译成等价汇编代码,并对其进行优化处理
目标代码生成,将中间代码生成符合当前机器CPU的机器码
预处理指令
1.宏定义指令: #define,这是最常见的用法,可以定义符号常量,函数,重命名等
2.条件编译指令:#if #ifndef #ifdef #elif 等等,主要进行编译时有选择的一些代码,比如#ifdef 如果宏已经定义,则编译下面代码
3.头文件包含指令:#inlcude 是一种最为常见的预处理,主要是作为文件的引用组合源程序正文
4.特殊符号处理:可以识别一些特殊的符号,预编译程序对于在源程序中出现的这些串将用合适的值进行替换
程序的链接
链接器的基本功能是:将编译器产生的多个目标文件合成为一个可以在目标平台下运行的文件,这里说的目标平台指的是程序的运行环境,CPU和操作系统等
链接器按照工作模式分为静态链接和动态链接两类
1.静态链接 链接器将函数的代码从其所在地(目标文件或者静态链接库)复制到最终的可执行程序中,整个过程在程序生成的时候完成,静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码,静态链接则是将相关代码复制到源代码相关位置,参与程序的生成。也就是去静态链接库(文件库)中找代码,复制到最终的可执行程序中
2.动态链接 动态链接库在编译链接的时候只提供符号表和其他少量信息,用于保证所有符号引用都有定义,保证编译顺利通过。程序执行的时候动态链接库的全部内容将被映射到内存中,根据可执行程序中的信息找到相应的函数地址并调用执行。也就是去动态链接库中全部内容会被映射到内存中,程序通过一些符号表和其他信息找到对应的内容,并进行调用。
逆向分析
逆向就是在不能轻易获得必要的生产信息下,直接对成品的分析入手,推导出产品的设计原理,主要分为硬件和软件两大部分
动态分析
将一个目标代码变换为易读形式的过程,一般是在调试器或者工具中加载程序,然后一边运行程序一边对程序的行为进行观察和分析,这些调试器或者调试工作包括:IDE,著名工具OllyDbg等等
缺点:
- 严重依赖输入
- 可能因为环境原因,无法运行目标程序
静态分析
不执行代码,而是通过反汇编、反编译等工具,将程序的二进制代码翻译成汇编语言,之后再进行分析。常用工具有IDA Pro,C32Asm等等
缺点
- 程序加壳之后无法反汇编
- 代码混淆甚至于被加密处理
软件逆向的一般过程
文件装载进行与目标文件相关的一些初步分析,包括文件格式解析、文件信息搜集和文件性质判定,分析出文件执行入口地址,初步分析文件的数据段和代码段以及文件运行所以来的其他文件信息
指令解码指令解析,将指令机器码影视各位成为汇编语言
语义映射通过直接代码实现或者工具实现
相关图构造
过程分析
类型分析
结果输出结果输出时逆向分析的最终阶段