大神论坛

找回密码
快速注册
查看: 1444 | 回复: 0

[语言编程类] 大神论坛 逆向脱壳分析基础学习笔记三 通用寄存器和内存...

主题

帖子

5

积分

初入江湖

UID
20
积分
5
精华
威望
10 点
违规
大神币
68 枚
注册时间
2021-03-14 10:40
发表于 2021-03-14 15:28
本帖最后由 kay2kay 于 2021-03-14 15:28 编辑

本文为本人的滴水逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出。
陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步


所有笔记链接:

大神论坛 逆向脱壳分析基础学习笔记一 进制篇
大神论坛 逆向脱壳分析基础学习笔记二 数据宽度和逻辑运算
大神论坛 逆向脱壳分析基础学习笔记三 通用寄存器和内存读写
大神论坛 逆向脱壳分析基础学习笔记四 堆栈篇
大神论坛 逆向脱壳分析基础学习笔记五 标志寄存器 
大神论坛 逆向脱壳分析基础学习笔记六 汇编跳转和比较指令
大神论坛 逆向脱壳分析基础学习笔记七 堆栈图(重点)(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记八 反汇编分析C语言
大神论坛 逆向脱壳分析基础学习笔记九 C语言内联汇编和调用协定
大神论坛 逆向脱壳分析基础学习笔记十 汇编寻找C程序入口(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十一 汇编C语言基本类型
大神论坛 逆向脱壳分析基础学习笔记十二 汇编 全局和局部 变量(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十三 汇编C语言类型转换(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十四 汇编嵌套if else(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十五 汇编比较三种循环(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十六 汇编一维数组(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十七 汇编二维数组 位移 乘法(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十八 汇编 结构体和内存对齐(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记十九 汇编switch比较if else(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记二十 汇编 指针(一)(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记二十一 汇编 指针(二)(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记二十二 汇编 指针(三)(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记二十三 汇编 指针(四)(需登录才能访问)
大神论坛 逆向脱壳分析基础学习笔记二十四 汇编 指针(五) 系列完结(需登录才能访问)

更多逆向脱壳资源,请访问  大神论坛

32位通用寄存器

32位通用寄存器的指定用途如下:

寄存器主要用途编号存储数据的范围
EAX累加器00 - 0xFFFFFFFF
ECX计数10 - 0xFFFFFFFF
EDXI/O指针20 - 0xFFFFFFFF
EBXDS段的数据指针30 - 0xFFFFFFFF
ESP堆栈指针40 - 0xFFFFFFFF
EBPSS段的数据指针50 - 0xFFFFFFFF
ESI字符串操作的源指针;SS段的数据指针60 - 0xFFFFFFFF
EDI字符串操作的目标指针;ES段的数据指针70 - 0xFFFFFFFF
寄存器编号(二进制)编号(十进制)
32位16位8位
EAXAXAL0000
ECXCXCL0011
EDXDXDL0102
EBXBXBL0113
ESPSPAH1004
EBPBPCH1015
ESISIDH1106
EDIDIBH1117

image-20210227152416970

汇编指令

符号含义
r寄存器
m内存
imm立即数
r88位通用寄存器
m88位内存
imm88位立即数

MOV指令

MOV 的语法:

  1. MOV  r/m8,r8
  2. MOV  r/m16,r16
  3. MOV  r/m32,r32
  4. MOV  r8,r/m8
  5. MOV  r16,r/m16
  6. MOV  r32,r/m32
  7. MOV r8,  imm8
  8. MOV r16,  imm16
  9. MOV r32,  imm32

MOV 目标操作数,源操作数

作用:拷贝源操作数到目标操作数

  • 源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元
  • 目标操作数可以是通用寄存器、段寄存器或者内存单元
  • 操作数的宽度必须一样
  • 源操作数和目标操作数不能同时为内存单元

ADD指令

ADD 的语法:

  1. ADD r/m8,  imm8
  2. ADD  r/m16,imm16
  3. ADD  r/m32,imm32
  4. ADD r/m16,  imm8
  5. ADD r/m32,  imm8
  6. ADD r/m8,  r8
  7. ADD r/m16,  r16
  8. ADD r/m32,  r32
  9. ADD r8,  r/m8
  10. ADD r16,  r/m16
  11. ADD r32,  r/m32

ADD 目标操作数,源操作数

作用:将源操作数加到目标操作数上

SUB指令

SUB 的语法:

  1. SUB r/m8, imm8
  2. SUB r/m16,imm16
  3. SUB r/m32,imm32
  4. SUB r/m16, imm8
  5. SUB r/m32, imm8
  6. SUB r/m8, r8
  7. SUB r/m16, r16
  8. SUB r/m32, r32
  9. SUB r8, r/m8
  10. SUB r16, r/m16
  11. SUB r32, r/m32

SUB 目标操作数,源操作数

作用:将源操作数减到目标操作数上

AND指令

AND 的语法:

  1. AND r/m8, imm8
  2. AND r/m16,imm16
  3. AND r/m32,imm32
  4. AND r/m16, imm8
  5. AND r/m32, imm8
  6. AND r/m8, r8
  7. AND r/m16, r16
  8. AND r/m32, r32
  9. AND r8, r/m8
  10. AND r16, r/m16
  11. AND r32, r/m32

AND 目标操作数,源操作数

作用:将源操作数与目标操作数与运算后将结果保存到目标操作数中

OR指令

OR 的语法:

  1. OR r/m8, imm8
  2. OR r/m16,imm16
  3. OR r/m32,imm32
  4. OR r/m16, imm8
  5. OR r/m8, r8
  6. OR r/m16, r16
  7. OR r/m32, r32
  8. OR r8, r/m8
  9. OR r16, r/m16
  10. OR r32, r/m32

OR 目标操作数,源操作数

作用:将源操作数与目标操作数或运算后将结果保存到目标操作数中

XOR指令

XOR 的语法:

  1. XOR r/m8, imm8
  2. XOR r/m16,imm16
  3. XOR r/m32,imm32
  4. XOR r/m16, imm8
  5. XOR r/m8, r8
  6. XOR r/m32, r32
  7. XOR r8, r/m8
  8. XOR r16, r/m16
  9. XOR r32, r/m32

XOR 目标操作数,源操作数

作用:将源操作数与目标操作数异或运算后将结果保存到目标操作数中

NOT指令

NOT 的语法:

NOT r/m8

NOT r/m16

NOT r/m32

NOT 操作数

作用:取反

LEA指令

image-20210227164408825

lea:Load Effective Address,即装入有效地址的意思,它的操作数就是地址

lea r32,dword ptr  ds:[内存编号(地址)]

将内存地址赋值给32位通用寄存器

lea是传址,mov是传值,注意区别

内存

内存的数量特别庞大,无法每个内存单元都起一个名字,所以用编号来代替,我们称计算机CPU是32位或者64位,主要指的就是内存编号的宽度,而不是寄存器的宽度。

有很多书上说之所以叫32位计算机是因为寄存器的宽度是32位,是不准确的,因为还有很多寄存器是大于32位的

通常所说的32位计算机是指CPU字长为32位

计算机内存的每一个字节会有一个编号(即内存编号的单位是字节)

0x00000000
0x00000001
0x00000002
....
....
....
....
....
....
0xFFFFFFFF

32位计算机的编号最大是32位,也就是32个1  换成16进制为FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是FFFFFFFF+1

内存的单位是字节,那内存中能存储的信息最多为:FFFFFFFF+1 字节 即4G,这也是为什么我们在一个XP的系统上面如果物理内存超过4G是没有意义的原因

只要是32位的计算机,那么最多识别的内存为4G,对吗?

不对。可以通过打补丁,或者拓展操作系统来,寻址方式是由操作系统决定的

内存格式

image-20210227160836415

  1. 每个内存单元的宽度为8
  2. [编号]称为地址,用[]来区分立即数和内存地址
  3. 地址的作用:当我们想从内存中读取数据或者想向内存中写入数据,首先应该找到要读、写的位置。就像写信要写地址一样。

从指定内存中写入/读取数据

只要是涉及到内存读写的,一定要指定内存的宽度

mov 读/写的数据宽度 ptr ds:[地址],XXXX

例:

mov eax,dword ptr ds:[0x0012FF34]

dword :要读/写多少 此时是32bit  (byte 字节 8bit  word字 16bit  dword双字 32bit)

ds:段寄存器  这里为数据段(后续学习会讲段寄存器)

0x0012FF34 内存编号,必须是32位的,前面的0可以省略

注意:内存编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)

寻址公式

寻址公式一:[立即数]

读取内存的值:

MOV EAX,DWORD PTR  DS:[0x13FFC4]

MOV EAX,DWORD PTR  DS:[0x13FFC8]

向内存中写入数据:

MOV DWORD PTR  DS:[0x13FFC4],eax

MOV DWORD PTR  DS:[0x13FFC8],ebx

获取内存编号:

LEA EAX,DWORD PTR  DS:[0X13FFC4]

LEA EAX,DWORD PTR  DS:[ESP+8]

寻址公式二:[寄存器]

reg代表寄存器  可以是8个通用寄存器中的任意一个

读取内存的值:

MOV ECX,0x13FFD0

MOV EAX,DWORD PTR  DS:[ECX]

向内存中写入数据:

MOV EDX,0x13FFD8

MOV DWORD PTR  DS:[EDX],0x87654321

获取内存编号:

LEA EAX,DWORD PTR DS:[EDX]

寻址公式三:[reg+立即数]

读取内存的值:

MOV ECX,0x13FFD0

MOV EAX,DWORD PTR  DS:[ECX+4]

向内存中写入数据:

MOV EDX,0x13FFD8

MOV DWORD PTR  DS:[EDX+0xC],0x87654321

获取内存编号:

LEA EAX,DWORD PTR DS:[EDX+4]

寻址公式四:[reg+reg*{1,2,4,8}]

读取内存的值:

MOV EAX,13FFC4

MOV ECX,2

MOV EDX,DWORD PTR  DS:[EAX+ECX*4]

向内存中写入数据:

MOV EAX,13FFC4

MOV ECX,2

MOV DWORD PTR  DS:[EAX+ECX*4],87654321

获取内存编号:

LEA EAX,DWORD PTR  DS:[EAX+ECX*4]

寻址公式五:[reg+reg*{1,2,4,8}+立即数]

读取内存的值:

MOV EAX,13FFC4

MOV ECX,2

MOV EDX,DWORD PTR  DS:[EAX+ECX*4+4]

向内存中写入数据:

MOV EAX,13FFC4

MOV ECX,2

MOV DWORD PTR  DS:[EAX+ECX*4+4],87654321

获取内存编号:

LEA EAX,DWORD PTR  DS:[EAX+ECX*4+2]


版权声明:本文由 lyl610abc 原创,欢迎分享本文,转载请保留出处

返回顶部