吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9318|回复: 52
收起左侧

[调试逆向] 逆向基础笔记三 通用寄存器和内存读写

  [复制链接]
lyl610abc 发表于 2021-2-27 23:14
本帖最后由 lyl610abc 于 2021-3-12 16:36 编辑

继续更新个人的学习笔记,
其它笔记传送门
逆向基础笔记一 进制篇
逆向基础笔记二 数据宽度和逻辑运算
逆向基础笔记四 堆栈篇
逆向基础笔记五 标志寄存器
逆向基础笔记六 汇编跳转和比较指令
逆向基础笔记七 堆栈图(重点)
逆向基础笔记八 反汇编分析C语言
逆向基础笔记九 C语言内联汇编和调用协定
逆向基础笔记十 汇编寻找C程序入口
逆向基础笔记十一 汇编C语言基本类型
逆向基础笔记十二 汇编 全局和局部 变量
逆向基础笔记十三 汇编C语言类型转换
逆向基础笔记十四 汇编嵌套if else
逆向基础笔记十五 汇编比较三种循环
逆向基础笔记十六 汇编一维数组
逆向基础笔记十七 汇编二维数组 位移 乘法
逆向基础笔记十八 汇编 结构体和内存对齐
逆向基础笔记十九 汇编switch比较if else
逆向基础笔记二十 汇编 指针(一)
逆向基础笔记二十一 汇编 指针(二)
逆向基础笔记二十二 汇编 指针(三)
逆向基础笔记二十三 汇编 指针(四)
逆向基础笔记二十四 汇编 指针(五) 系列完结

32位通用寄存器

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

寄存器 主要用途 编号 存储数据的范围
EAX 累加器 0 0 - 0xFFFFFFFF
ECX 计数 1 0 - 0xFFFFFFFF
EDX I/O指针 2 0 - 0xFFFFFFFF
EBX DS段的数据指针 3 0 - 0xFFFFFFFF
ESP 堆栈指针 4 0 - 0xFFFFFFFF
EBP SS段的数据指针 5 0 - 0xFFFFFFFF
ESI 字符串操作的源指针;SS段的数据指针 6 0 - 0xFFFFFFFF
EDI 字符串操作的目标指针;ES段的数据指针 7 0 - 0xFFFFFFFF
寄存器 编号(二进制) 编号(十进制)
32位 16位 8位
EAX AX AL 000 0
ECX CX CL 001 1
EDX DX DL 010 2
EBX BX BL 011 3
ESP SP AH 100 4
EBP BP CH 101 5
ESI SI DH 110 6
EDI DI BH 111 7

image-20210227152416970

汇编指令

符号 含义
r 寄存器
m 内存
imm 立即数
r8 8位通用寄存器
m8 8位内存
imm8 8位立即数

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]

免费评分

参与人数 8吾爱币 +8 热心值 +6 收起 理由
木马的号 + 1 我很赞同!
siuhoapdou + 1 + 1 谢谢@Thanks!
Chenda1 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cherrytoffee + 1 + 1 我很赞同!
风都绕过我in + 1 + 1 热心回复!
751811164 + 1 + 1 谢谢@Thanks!
bailemenmlbj + 1 + 1 谢谢@Thanks!
乌龙小八戒 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bester 发表于 2021-3-1 09:17
本帖最后由 bester 于 2021-3-1 09:19 编辑

lea和mov的重点区别要说明一下,lea和mov在某种情况下作用是相同的,比如mov eax,401000 和lea eax, ds:[0x00401000],但是大部分情况lea不这样用,lea一般传寄存器和立即数,mov则两者情况都常用,如lea eax,dword ptr ds:[ebp-4] 和mov eax,dword ptr ds:[ebp-4],此时mov传的是ebp-4这个地址所保存的值 相当于[ebp-4],lea 传的是ebp-4这个地址 也就是ebp-4  可以用OD的ctrl+G功能输入 ebp-4和[ebp-4] 带括号的区别

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
lyl610abc + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!

查看全部评分

飘零星夜 发表于 2021-3-11 17:23
 NEC电子日前推出12款内置USB2.0通信功能、实现业界尖端低功耗技术的16位全闪存微控制器“78K0R/Kx3-L”系列产品,并于即日起开始提供样品。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上面这句话是 2010 年 NEC公司的新闻稿, 他们自己就认为寄存器多少位,芯片就是多少位的。

78k0r 是 16位的 寄存器,内存是20位的。 主要用于汽车防盗方面。指令集就叫 78K0R

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以多少位的机器,确实没有什么统一规定的,毕竟芯片公司设置的时候,应该不会考虑这个称呼的
cptw 发表于 2021-2-28 00:03
marlborogolo 发表于 2021-2-28 01:49
谢谢楼主分享
王成 发表于 2021-2-28 09:13
一个小白路过!表示看不懂!想学没有地方教啊
 楼主| lyl610abc 发表于 2021-2-28 12:01
王成 发表于 2021-2-28 09:13
一个小白路过!表示看不懂!想学没有地方教啊

这个已经是基础内容了,实在不懂的话,可以结合《滴水逆向基础教材》来看,我的学习笔记也出自于这里
浪子哥哥 发表于 2021-2-28 12:19
感谢楼主笔记
addqcx 发表于 2021-2-28 12:39
谢谢分享
heroes52 发表于 2021-2-28 13:42
楼主写的很详细,学习了。
王成 发表于 2021-2-28 14:05
lyl610abc 发表于 2021-2-28 12:01
这个已经是基础内容了,实在不懂的话,可以结合《滴水逆向基础教材》来看,我的学习笔记也出 ...


多谢
小夫哥 发表于 2021-2-28 22:15
楼主 你写真好     很详细....

先收藏下来先...
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 13:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表