【技术分享】认识汇编寄存器 ( 复习 )
2017-05-01 / 0 评论 / 628 阅读 / 30 点赞

【技术分享】认识汇编寄存器 ( 复习 )

发光的神
2017-05-01 / 0 评论 / 628 阅读 / 正在检测是否收录...

寄存器是什么?

寄存器是计算机内部存储器的一部分,用于临时保存数据,供CPU进行快速处理。它们在计算机架构中扮演着非常重要的角色,是CPU最直接、最快速的数据存储单元。寄存器通常可以分为不同的类别,包括通用寄存器、指令指针寄存器、标志寄存器等,每种寄存器有其特定的用途。

寄存器与内存

  • 寄存器:像是“顺丰快递”,速度快,但数量少。主要用于存储CPU频繁使用的数据。
  • 内存:像是“普通快递”,便宜且数量多。它的存储容量远超寄存器,通常用于存储程序和数据。

在程序运行时,数据优先存储在寄存器中,因为其访问速度比内存快。然而,由于寄存器数量有限,大部分数据还是存放在内存中。

寄存器的种类

  1. 16位寄存器(早期处理器使用)

    • AX、BX、CX、DX:通用寄存器,分别可以用作累加器、计数器、数据寄存器等。
    • SI、DI:用于存储字符串操作中的源指针和目的指针。
    • BP、SP:栈指针寄存器,SP用于指向栈顶,BP用于存储堆栈数据。
    • IP:指令指针,指向当前执行的指令。
  2. 32位寄存器(现代处理器常用)

    • EAX、EBX、ECX、EDX:通用寄存器,作用与16位寄存器类似,但具有更大的存储范围。
    • ESI、EDI、EBP、ESP、EIP:分别用于字符串操作、堆栈管理和指令指针。
    • 32位寄存器可以存储的最大数值为 0~0xFFFFFFFF,即 0 到 42亿。
  3. 64位寄存器(当前处理器标准)

    • RAX、RBX、RCX、RDX:通用寄存器,功能和32位类似,但存储容量增大。
    • RSI、RDI:用于指向源和目的地址的指针寄存器。
    • RIP:64位指令指针寄存器,指向下一个将要执行的指令。
    • 64位寄存器可以存储的最大数值为 0~0xFFFFFFFFFFFFFFFF,即 0 到 18446744073709551615。

寄存器的作用

  • EAX:通常用于存储函数的返回值。
  • ECX:常用作计数器,保存循环次数,也可用于传递参数。
  • EDX:用于传递额外参数。
  • ESI、EDI:用于字符串操作中的源和目的指针。

例如,汇编指令:

rep movs dword ptr [edi], dword ptr [esi];

此指令的意思是将 esi 地址的内容拷贝到 edi 地址,常用于字符串复制时。

EAX寄存器的使用

EAX寄存器是32位通用寄存器,用于存储函数返回值或临时数据。可以通过 mov 指令来向寄存器中存值。

mov eax, 6  // 将值6存入eax
mov eax, ebx  // 将ebx的值存入eax

l7ved5g7.png

寄存器的存储范围

通用寄存器的存储范围由其位数决定。例如,32位的寄存器能够存储的最大数值为 0xFFFFFFFF,这是十六进制中的最大数值。

  • 0xFFFFFFFF:这是32位寄存器的最大值,对应的二进制是 11111111 11111111 11111111 11111111,共32位。
  • 16进制数 F 代表的是 1111(二进制),一个 F 代表4位。所以,0xFFFFFFFF 就是 8 个 F,每个 F 占 4 位,总共32位。
  • 这个值对应的 十进制 数是 4294967295。

因此,一个32位的寄存器能存储的范围是 0 到 4294967295

AX寄存器的用法

虽然 EAX 是32位寄存器,AXEAX 的低16位部分,它主要用于节省内存空间。当你只需要存储16位的数据时,使用 AX 可以避免占用完整的32位寄存器空间。

  • EAX:是一个32位寄存器,存储范围是 0 到 4294967295(十进制)。
  • AX:是 EAX 的低16位,存储范围是 0 到 65535(十进制)。

例如,假设我们将 0xFFFF 存入 AX

mov ax, 0xFFFF  // 将FFFF(十六进制)存入AX

这个指令的意思是将 0xFFFF 存储到 AX 中,这时只有低16位的数据被存入寄存器,而不会影响到 EAX 中的高16位。因此,这种做法能够节省内存空间,特别是在只需要16位数据时。

l7vf4dkr.png

al, ah寄存器

l7vf7jn9.png

------- ax
FF ----------- FF
ah(high) --- al(low)
FF 一个F有4位 2 * 4 = 8 
ah 可以存高4位
al 可以存低4位

mov al, 0x11 // 往eax存入11
mov ah, 0x22 // 把ebx的值存入22

其它寄存器的操作都是一样的这里就不过多演示了

汇编中的操作码

1. EIP 指针寄存器

  • 作用EIP(Extended Instruction Pointer)寄存器保存下一条要执行的指令的地址。每执行完一条指令,EIP 会自动更新为下一条指令的地址。
  • 用途:帮助控制程序的执行流程。

2. 标志寄存器

标志寄存器用来表示运算结果的状态。常见的四个重要标志位如下:

  • ZF (Zero Flag):如果运算结果为 0,ZF = 1,否则 ZF = 0
  • SF (Sign Flag)SF 表示运算结果的符号位,SF = 0 表示正数,SF = 1 表示负数。
  • CF (Carry Flag):用于无符号数的进位或借位。如果产生进位或借位,CF = 1,否则为 0。
  • OF (Overflow Flag):用于有符号数的溢出情况。如果运算结果超出了能表示的范围,OF = 1,否则为 0。

这些标志位会被不同的指令影响,例如:

  • add 指令会影响进位标志(CF)。
  • cmp 指令会影响零标志位(ZF)。

3. 条件跳转指令

根据标志寄存器中的标志位,汇编语言提供了多种条件跳转指令,用于控制程序流。常见的条件跳转指令包括:

  • JE (Jump if Equal):如果零标志 ZF 为 1,则跳转。
  • JNE (Jump if Not Equal):如果零标志 ZF 为 0,则跳转。
  • JZ (Jump if Zero):如果零标志 ZF 为 1,则跳转。
  • JNZ (Jump if Not Zero):如果零标志 ZF 为 0,则跳转。
  • JC (Jump if Carry):如果进位标志 CF 为 1,则跳转。
  • JNC (Jump if No Carry):如果进位标志 CF 为 0,则跳转。
  • JO (Jump if Overflow):如果溢出标志 OF 为 1,则跳转。
  • JNO (Jump if No Overflow):如果溢出标志 OF 为 0,则跳转。

这些条件跳转指令常用于控制循环、判断等逻辑操作。

4. 常用指令

  • mov:用于将数据从一个位置传送到另一个位置。

    • 示例:mov eax, dword ptr ds:[0x19FF74],将内存地址 0x19FF74 处的数值加载到 eax 寄存器。
    • 示例:mov dword ptr ds:[0x19F30], 0x123,将 0x123 存储到 0x19F30 地址。
  • lea:将一个内存地址加载到寄存器中。

    • 示例:lea eax, dword ptr ds:[0x19f300],将 0x19F30 地址加载到 eax 寄存器。

5. CE 自动汇编常用命令

  • alloc:分配内存。

    • 示例:alloc(newmem, 0x1000),分配 0x1000 字节的内存给 newmem
  • dealloc:释放分配的内存。
  • createthread:创建一个远程线程。

    • 示例:createthread(newmem),在分配的内存 newmem 中创建线程。
  • dbdd:分别用于写字节和双字数据。

    • 示例:db 90 90 90 90(写入字节数据),dd 0 0 0 0(写入双字数据)。
  • registersymbol:注册符号,用于标记全局变量。

    • 示例:registersymbol(newmem),将 newmem 注册为全局符号。
  • jmp:跳转指令。

    • 示例:jmp 00520000,跳转到地址 0x520000
    • 示例:jmp newmem+50,跳转到 newmem 地址偏移 50 的位置。

6. 数据表示

  • 汇编语言中的数据可以使用不同的方式进行赋值:

    • mov eax, 63:将十六进制数 63(即 99 十进制)赋值给 eax
    • mov eax, #99:强制使用十进制表示法。
    • push 63; pop eax:先将 63 压入栈,再弹出到 eax,这比直接使用 mov 指令稍短。
  • 如果需要处理浮点数,可以使用浮点数计算工具,将浮点数转换为十六进制。

这里我提供了Cheat Engine Wiki 文档。

Cheat engine

AOB 注入

lijxhqm1.png

首先找到数值在内存的地址。

lijxjnqc.png

然后找出是什么改写了它。

lijxm72l.png

找到内存反汇编区域。

lijxpgfi.png

选择工具自动汇编。

lijxrjt1.png

选择AOB注入方式。

lijxuced.png

30

评论 (0)

取消
0:00