寄存器(CPU工作原理):
X86CPU的寄存器都是16位的,可以存放两个字节。
AX,BX,CX,DX通常用来存放一般性数据被称为通用寄存器
一个16位寄存器可以存放的最大的数字是2的16次方减一。
AX的低8位(07)构成了AL寄存器,高八位(815)构成了AH寄存器
AH和AL都是可以独立使用的8位寄存器
几条汇编指令:
(汇编指令不区分大小写)
mov ax, 18 将8送入AX
mov ah, 78 将78送入A
add ax, 8 将寄存器AX中的数值加上8
mox ax, bx 将寄存器BX中的数据送入寄存器AX中
add ax, bx 将AX,BX中的内容相加,结果存在AX中
16位架构的CPU:
运算器一次最多可以处理16位的数据
寄存器的最大宽度位16位
寄存器和运算器之间的通路是16位的。
8086CPU读写内存时发生的事:
(CPU访问内存单元时,必须向内存提供内存单元的物理地址)
CPU中的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址
段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
地址加法器将两个16位的地址合并成一个20位的物理地址
CPU可以通过不同的段地址和偏移地址生成同一个物理地址
地址加法器的工作原理:
物理地址 = 段地址 * 16 + 偏移地址
段地址 * 16 的意义:
一个数据的十六进制形式左移一位,相当于乘以16
一个数据的十进制位左移一位,相当于乘以10
一个数据的x进制位左移一位,相当于乘以x
CPU是分段的:
段地址 * 16 必然是16的整数倍,所以一个段的起始地址也一定是16的倍数
偏移地址为16位,16位地址的寻址能力位64k,所以一个段的长度最大也为64k
CS
CS和IP是8068CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址
CS为代码段寄存器
IP为指令指针寄存器
8086CPU工作的简要描述:
在8086CPU加电或者是复位后(即CPU开始工作后)
CS被设置为FFFFH,IP为0000H。
每次执行完CS指向的内存单元指令后,IP地址会自增。
并将自增之后的结果输入到CS中继续执行。
即CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元是8086PC机开机执行的第一条指令
编写木马或者病毒时,可以在FFFF0H指令开始执行之前,找到杀毒软件启动的内存地址,
阻止启动或者屏蔽,或者放在内存启动杀毒软件之前执行你的程序。
修改CS,IP的指令
jmp 段地址:偏移地址
eg:jmp 2AE3:3
jmp 3:0B16
暴力破解原理
使用CS:IP指令指向注册后面的汇编指令
查看CPU和内存,用机器指令和汇编指令编程
打开方式:
cmd -> Debug(64位操作系统看下面)
认识Debug功能:
Debug是Dos,windows都提供的实例模式(8086方式)程序的调试工具
使用它,可以查看CPU中各种寄存器中的内容和内存的情况和在机器码
级跟踪程序的运行。
Debug中的R命令:查看和改变CPU寄存器的内容。
D 查看内存中的内容
E 改写内存中的内容
U 将内存中的机器指令翻译成汇编指令
T 执行一条汇编指令
A 以汇编指令的格式在内存中写入一条机器指令
64位操作系统中不自带由debug程序:需要自己手动配置
下载DOSBox和debug.exe程序
安装DOSBox,打开之后输入mount C + “debug.exe”所在目录
输入C:->debug,进入debug模式
配置文件:
在DOSBox安装目录中有一个DOSBox 0.74-3 Options.bat
打开后输入:
mount C “debug.exe”所在目录
C:debug
完成
编写汇编程序解决2的8次方的值:
mov av, 1
add ax, ax
jmp 2000:3