【网课笔记Ⅱ】滴水逆向(持续更新ing)

1/2.进制

进制的定义

  • 十进制:由10个符号组成,逢9进1
  • N进制:由N个符号组成,逢N-1 进一

重要进制

  • 16进制4个2进制的简写
  • 熟悉数之间的相互转化

image.png

利用进制之间转化表

3.数据宽度_逻辑运算

  • 数据宽度

  • 计算机中的补码、有符号数等只是人为的定义,对于计算机而言,它只知道存了多少个0和1

  • 有符号数、无符号数

  • 逻辑运算 与或非

CPU如何计算2+3 (视频3 42:00左右)
先异或,再与,最后判断

4位二进制转换,最好硬记!

2进制 10进制
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

负数的补码

对于正数,原码、反码、补码都是一致的

负数补码的计算:对应正数取反加一

例子:-1

UntJ7q.png

补码的出现可以简化逻辑运算器,只需要加法器,不需要额外的减法器,大大节省成本和空间

有符号数 / 无符号数

4位二进制情况:

Un8AIO.png

F 为什么对应 -1 ?

F:1111
在有符号情况下,F为补码表示,F的反码为1110,F的原码为1001(减一取反

负数补码的计算:正数下取反加一

理解:F为最大的负数-1,根据这个圆,左半边都是负数

8位二进制情况:

U3hzqO.png

范围:
无符号数:0~FF (0~255)
有符号数:0~7F (0127)、80FF (-128 ~ -1)

80 为什么对应 -128 ?
80 ==>1000 0000
因为是有符号数,这里的符号位在第8位

原码 1 000 0000

反码 1 111 1111

补码 1 1000 0000(数值上看出为-128,但符号位超过了8位的限制)

总之,范围就是 -128 ~ 127

作业题

  1. 八进制2-5在计算器的结果为17777777777777777775,为什么?
    得到结果-3的二进制为1111 1101(补码形式),十六进制为FD,八进制就是该值

  2. 使用异或对87AD6进行加密在进行解密,加解密密钥为5
    1000 0111 1010 1101 0110

    xor 0101 加密密钥
    ----------------------------------------------------
    1000 0111 1010 1101 0011 加密后的值
    xor 0101 解密密钥
    -----------------------------------------------------
    1000 0111 1010 1101 0110 解密后的值,与原值一致

  3. 只用逻辑运算计算2-3=?(计算机计算2-3)(涉及内容:逻辑运算、移位、数据宽度)
    2:0010、-3:1101(补码表示)
    0010
    xor 1101
    ----------------
    1111(X)

    ​ 0010
    & 1101
    ----------------
    ​ 0000(Y)
    0000 << 1 == 0000 就不用再循环一次了
    1111补 = 1001原 = -1

    若Y左移后不全为0000,则需要再对XY做相同的逻辑运算处理,直到新的Y=0

4.通用寄存器_内存读写

通用寄存器

按位数区分:

32位 16位 8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
EBP BP CH
ESI SI DH
EDI DI BH

AX 包括 AH和AL

U33OgK.png

MOV 语法

MOV 目标操作数, 源操作数

U3Gdeg.png

注意点:

操作数的宽度必须一致

不能同时为内存单元

类似的指令还有

  • ADD
  • SUB
  • AND
  • OR
  • XOR
  • NOT

可以查阅提供的课程笔记

作业题

5.内存

寄存器和内存的区别

寄存器在CPU内部,内存在CPU外部的数据总线上。

寄存器是高速存贮部件,暂时存储指令数据和地址,可对内存数据进行操作。内存是所有运行程序存储的空间

32位计算机

32位计算机中的位数,与寄存器宽度无关而与寻址宽度有关(所能查找的内存编号范围),每一内存编号对应的是1字节。

最大内存范围为0xFFFFFFFF ==> 4,294,967,296(10进制)Byte ==> 4,194,304KB ==> 4096MB ==> 4GB

只要是32位计算机,最多识别的内存为4G?
不对,可以通过打补丁或者拓展寻址范围

操作内存

内存不像寄存器,有固定的数据宽度,在对内存进行读或写时,需要指定内存的大小字节(1、2、4字节 ==> byte、word、dword)

MOV 内存宽度 PTR DS:[内存地址], 数据
MOV BYTE PTR DS:[0X01234567], 0X12
MOV WORD PTR DS:[0X01234567], 0X1234
MOV DWORD PTR DS:[0X01234567], 0X11223344

内存宽度:指定读写改内存的数据宽度

PTR:代表的一个指针,指的是一个地址

DS:段寄存器

0x01234567:内存编号,内存的地址,32位

实验

写入:
MOV DWORD PTR DS:[0X00FF12C2], 0X01234567
读取:
MOV EAX, DWORD PTR DS:[0X00FF12C2]

这里的0x00FF12C2在堆栈内,因为一些内存为禁止访问,不方便做实验,这里就选择堆栈地址做实验

堆栈区:显示4个块为一行,看左边的编号并非连续的,而是间隔4个。
编号的地址为该区最小地址,且从右往左依次增大

详情见堆栈部分!

原文地址:https://www.cnblogs.com/labster/p/13288738.html