Windows 逆向-通用寄存器

Oyst3r 于 2023-11-23 发布

前言

今天还是很无聊的一节,因为之前早就学过这方面的知识,还是带大家了解一下 DTDdebug 以及 ollydebug 咋用,这俩用法以及界面都是很相似的,但调一些 C 语言写的程序的时候,个人还是比较喜欢内置的那个调试的快捷键,带大家加深一下数据宽度的概念,看完之后,应该就能深刻的理解为什么要有数据宽度这个概念了

课堂

32 位通用寄存器

什么是 32 位,就是下面的寄存器可以用 32 位来存储数据,通俗来说就是一个寄存器可以用 32 个 0 或者 1 来存数据。虽然当初设计时不同的寄存器建议存什么东西做什么运算,但是实际上自己想怎么用寄存器就怎么用,知道有哪些寄存器即可,明确一点昂,这个寄存器可和那个说的多少多少架构的操作系统没关系,那个还是看的是寻址能力,和地址总线的宽度有关

通用寄存器

寄存器不光是只有 32 位的,还有 8 位,16 位,64 位的寄存器,这样统称为通用寄存器,那有人问为什么还有 8 位的呢,这就和历史原因有关系,都是不断发展的,一开始 16 位的计算机,只有 AX,哪有 EAX 的概念,那计算机不断发展了,也不能舍弃原来的,所以就保留了,反正没有什么坏处,而且某些情况下使得操作数据更加的灵活

这个是海东老师给的代码演示,大家可以去试试

汇编指令

MOV

MOV r8/m8,r8    		#可以将8位通用寄存器中的值存入8位通用寄存器或者8位内存中
MOV r16/m16,r16
MOV r32/m32,r32

MOV r8,r8/m8    		#可以将8位通用寄存器或者8位内存中的值存入8位寄存器中
MOV r16,r16/m16
MOV r32,r32/m32

MOV r8,imm8            #将一个8位的立即数存入8位通用寄存器中
MOV r16,imm16
MOV r32,imm32

ADD

ADD r8/m8,imm8
ADD r16/m16,imm16
ADD r32/m32,imm32

ADD r16/m16,imm8        #源操作数与目标操作数可以不一致!!
ADD r32/m32,imm8

ADD r8/m8,r8
ADD r16/m16,r16
ADD r32/m32,r32

ADD r8,r8/m8
ADD r16,r16/m16
ADD r32,r32/m32

SUB

SUB AL, imm8
SUB AX, imm16
SUB EAX, imm32
SUB r/m8, imm8
SUB r/m16,imm16
SUB r/m32,imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32

AND

AND r8/m8, imm8
AND r16/m16,imm16
AND r32/m32,imm32

AND r16/m16, imm8
AND r32/m32, imm8

AND r8/m8, r8
AND r16/m16, r16
AND r32/m32, r32

AND r8, r8/m8
AND r16, r16/m16
AND r32, r32/m32

OR

OR r8/m8, imm8
OR r16/m16,imm16
OR r32/m32,imm32

OR r16/m16, imm8
OR r32/m32, imm8

OR r8/m8, r8
OR r16/m16, r16
OR r32/m32, r32

OR r8, r8/m8
OR r16, r16/m16
OR r32, r32/m32

XOR

XOR r8/m8, imm8
XOR r16/m16,imm16
XOR r32/m32,imm32

XOR r16/m16, imm8
XOR r32/m32, imm8

XOR r8/m8, r8
XOR r16/m16, r16
XOR r32/m32, r32

XOR r8, r8/m8
XOR r16, r16/m16
XOR r32, r32/m32

NOT

NOT r8/m8
NOT r16/m16
NOT r32/m32

作业

因为一个可执行程序打开会发现它停在了一个地址处,至于为什么后面学汇编详解,这里我们只需知道 EIP 寄存器中的存的值是什么,此时程序就执行到哪了,反过来说也可以。那么我们如果按 F8,则会从现在停在的地址,单步往后执行一条指令

剩下的就自己上手试试吧,奥里给