脱壳学习(一)- 计算机底层基础

简介: 脱壳学习(一)- 计算机底层基础

前言


   

心血来潮想写一篇关于逆向脱壳的教程,这次内容比较多想分为三次发布。今天第一篇主要讲的是基础理论,脱壳前必须了解的内容 、知道计算机底层是什么、CPU是怎么处理数据的


CPU架构及运行过程


说到计算机底层原理,首先要了解底层体系,也就是著名的冯诺依曼原理:

6ac05145b8e26336484dae7d4e471b1b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

CPU从逻辑上分为三部分,分别是控制单元、运算单元和存储单元,这三部分由 CPU 内部总线连接起来。几乎所有的冯·诺伊曼型计算机的 CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数、结果写回。

1.取指令阶段,是将内存中的指令读取到 CPU 中寄存器的过程,程序寄存器用于存储下一条指令所在的地址。

2.指令译码阶段,在取指令完成后,立马进入指令译码阶段,在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别以及各种获取操作数的方法。

3.执行指令阶段,译码完成后,就需要执行这一条指令了,此阶段的任务是完成指令所规定的各种操作,具体实现指令的功能。

4.访问取数阶段,根据指令的需要,有可能需要从内存中提取数据,此阶段的任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算。

5.结果写回阶段,作为最后一个阶段,结果写回(Write Back,WB)阶段把执行指令阶段的运行结果数据写回到 CPU 的内部寄存器中,以便被后续的指令快速地存取。


寄存器


以上基本上就是CPU运行的基本过程,程序在内存中装载,由 CPU 来运行,CPU 的主要职责就是用来处理数据,CPU 不断的通过总线发送请求并进入存储单元,这个过程很繁琐,会占用大量的资源,有一些内存页也是没有必要的,因此出现了寄存器。

|63..32|31..16|15-8|7-0|

|AH.|AL.|

|AX.....|

|EAX............|

|RAX...................|

从图中我们可简单的了解到寄存器都说是在向后兼容,在RAX中EAX依然可以使用,不过指向了RAX的低位,EAX是AX数据扩展,不可分割两个AX,RAX同理,但AX可以分割成AH和AL分别对应高位和地位。除了上面 AX、BX、CX、DX 寄存器以外,其他寄存器均不可以分为两个独立的 8 位寄存器。

我们这里主要讲解各个寄存器的主要功能,所以我们以8086来进行探讨,8086是x86的前身,也就是16位处理器,8086 处理器有 14 个寄存器,每个寄存器都有一个特有的名称AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES,但这些寄存器功能只有三种:


1. 通用寄存器


AX,BX,CX,DX

这些寄存器是16位,能存放两个字节(8bit一个字节)AX、BX、CX、DX 这四个寄存器一般用来存放数据,所以是数据寄存器。


AX(Accumulator Register) :累加寄存器,它主要用于输入/输出和大规模的指令运算。在汇编中最频繁使用

BX(Base Register):基址寄存器,用来存储基础访问地址,还可以用来寻址,即寻找物理内存地址。BX 寄存器中存放的数据一般是用来作为偏移地址 使用的

CX(Count Register):计数寄存器,CX 寄存器在迭代的操作中会循环计数,CX 中的 C 被翻译为 Counting 也就是计数器的功能。当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,当CX的值是0时跳出循环

DX(data Register):数据寄存器,它也用于输入/输出操作。它还与 AX 寄存器以及 DX 一起使用,用于涉及大数值的乘法和除法运算。

19 ,它在 16 位存储器中所存储的表示如下:

d3ac8323bec336ec3ddc904855588095_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

寄存器的存储方式是先存储低位,如果低位满足不了就存储高位,如果低位能够满足,高位用 0 补全,在其他低位能满足的情况下,其余位也用 0 补全。


段寄存器

段寄存器主要包含

CS(Code Segment) :代码寄存器,程序代码的基础位置

DS(Data Segment):数据寄存器,变量的基本位置

SS(Stack Segment):栈寄存器,栈的基础位置

ES(Extra Segment):其他寄存器,内存中变量的其他基本位置。


2.索引寄存器


BP(Base Pointer):基础指针,它是栈寄存器上的偏移量,用来定位栈上变量

SP(Stack Pointer): 栈指针,它是栈寄存器上的偏移量,用来定位栈顶

SI(Source Index): 变址寄存器,用来拷贝源字符串

DI(Destination Index): 目标变址寄存器,用来复制到目标字符串


这两个寄存器通过段寄存器确定基本地址也叫基地址,索引寄存器就是在基地址的基础上的偏移地址,通过基地址加上偏移地址,CPU就可以找到在内存中的准确位置。


3.状态和控制寄存器


IP(Instruction Pointer):指令指针寄存器,它是从 Code Segment 代码寄存器处的偏移来存储执行的下一条指令

FLAG : Flag 寄存器用于存储当前进程的状态,这些状态有

位置 (Direction):用于数据块的传输方向,是向上传输还是向下传输

中断标志位 (Interrupt) :1 - 允许;0 - 禁止

陷入位 (Trap) :确定每条指令执行完成后,CPU 是否应该停止。1 - 开启,0 - 关闭

进位 (Carry) : 设置最后一个无符号算术运算是否带有进位

溢出 (Overflow) : 设置最后一个有符号运算是否溢出

符号 (Sign) : 如果最后一次算术运算为负,则设置 1 =负,0 =正

零位 (Zero) : 如果最后一次算术运算结果为零,1 = 零

辅助进位 (Aux Carry) :用于第三位到第四位的进位

奇偶校验 (Parity) : 用于奇偶校验



结语


以上就是计算机底层的基本运行原理,虽然是一些浅显的概念,但是明白计算机运行的过程我们才能去实现对程序底层的控制,下一篇主要讲解反调试和绕过。

欢迎在下方评论区交流你的想法

下期文章你想看什么?可以在评论区留言告诉我们~


相关文章
|
2月前
|
Ubuntu Linux 测试技术
Linux应用开发基础知识——输入系统应用编程(八)
Linux应用开发基础知识——输入系统应用编程(八)
41 0
Linux应用开发基础知识——输入系统应用编程(八)
|
4月前
计算机底层基础知识
计算机底层基础知识
35 0
|
2月前
|
Linux API
Linux应用开发基础知识——输入系统应用编程(七)
Linux应用开发基础知识——输入系统应用编程(七)
37 0
Linux应用开发基础知识——输入系统应用编程(七)
|
2月前
|
Ubuntu 网络协议 Linux
【操作系统】探究驱动奥秘:驱动程序设计的解密与实战
【操作系统】探究驱动奥秘:驱动程序设计的解密与实战
30 0
|
4月前
|
算法 程序员
涵盖了所有计算机底层知识总结与操作系统的实战教程,建议收藏
第一本是程序员必知的硬核基础知识,这是一本非常入门的经典 PDF,看完能让你对计算机有一个基础的了解和入门,是培养你 内核 的基础,我们看下目录大纲
|
存储 编解码 缓存
【嵌入式基础】常用显示器及其参数等概念整理
【嵌入式基础】常用显示器及其参数等概念整理
121 0
|
芯片 开发者 ice
3.2基础概念:硬件调试器概念及配置方法|学习笔记
快速学习3.2基础概念:硬件调试器概念及配置方法
244 0
3.2基础概念:硬件调试器概念及配置方法|学习笔记
|
存储 小程序 编译器
【从零开始的嵌入式生活】必备基础知识1——数据的表示和程序编译调试
【从零开始的嵌入式生活】必备基础知识1——数据的表示和程序编译调试
【从零开始的嵌入式生活】必备基础知识1——数据的表示和程序编译调试
|
程序员
鸿蒙都发布了,不要再浑浑噩噩,赶紧来学习计算机底层编码原理(下)
哈喽,大家好,我是指北君。 曾几何时,指北君北原码反码补码绕的有点晕,网上教程也很多,详细的太难理解,容易理解的又有问题。于是乎指北君花了很长时间,肝出了这篇文章,目的是让一个小白看完都能彻底理解。 我们知道日常生活中使用的数分为整数和实数,整数的小数点固定在数的最右边,可以省略不写,而实数的小数点则不固定。在计算机中只能识别和表示“0”和“1”,而无法识别小数点,因此要想使得计算机能够处理日常使用的数据,小数点的问题是不可避免的。 关于计算机系统中实数的表示,在下篇文章中会讲解。本篇博客我们讲解的是整数在计算机系统中如何表示。
鸿蒙都发布了,不要再浑浑噩噩,赶紧来学习计算机底层编码原理(下)
鸿蒙都发布了,不要再浑浑噩噩,赶紧来学习计算机底层编码原理(上)
哈喽,大家好,我是指北君。 曾几何时,指北君北原码反码补码绕的有点晕,网上教程也很多,详细的太难理解,容易理解的又有问题。于是乎指北君花了很长时间,肝出了这篇文章,目的是让一个小白看完都能彻底理解。 我们知道日常生活中使用的数分为整数和实数,整数的小数点固定在数的最右边,可以省略不写,而实数的小数点则不固定。在计算机中只能识别和表示“0”和“1”,而无法识别小数点,因此要想使得计算机能够处理日常使用的数据,小数点的问题是不可避免的。 关于计算机系统中实数的表示,在下篇文章中会讲解。本篇博客我们讲解的是整数在计算机系统中如何表示。
鸿蒙都发布了,不要再浑浑噩噩,赶紧来学习计算机底层编码原理(上)