本帖最后由 kay2kay 于 2021-03-14 15:28 编辑
本文为本人的滴水逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出。 陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步 所有笔记链接:
大神论坛 逆向脱壳分析基础学习笔记一 进制篇 大神论坛 逆向脱壳分析基础学习笔记二 数据宽度和逻辑运算 大神论坛 逆向脱壳分析基础学习笔记三 通用寄存器和内存读写 大神论坛 逆向脱壳分析基础学习笔记四 堆栈篇 大神论坛 逆向脱壳分析基础学习笔记五 标志寄存器 大神论坛 逆向脱壳分析基础学习笔记六 汇编跳转和比较指令 大神论坛 逆向脱壳分析基础学习笔记七 堆栈图(重点)(需登录才能访问) 大神论坛 逆向脱壳分析基础学习笔记八 反汇编分析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 |
汇编指令符号 | 含义 |
---|
r | 寄存器 | m | 内存 | imm | 立即数 | r8 | 8位通用寄存器 | m8 | 8位内存 | imm8 | 8位立即数 |
MOV指令MOV 的语法: - MOV r/m8,r8
- MOV r/m16,r16
- MOV r/m32,r32
- MOV r8,r/m8
- MOV r16,r/m16
- MOV r32,r/m32
- MOV r8, imm8
- MOV r16, imm16
- MOV r32, imm32
MOV 目标操作数,源操作数 作用:拷贝源操作数到目标操作数 - 源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元
- 目标操作数可以是通用寄存器、段寄存器或者内存单元
- 操作数的宽度必须一样
- 源操作数和目标操作数不能同时为内存单元
ADD指令ADD 的语法: - ADD r/m8, imm8
- ADD r/m16,imm16
- ADD r/m32,imm32
- ADD r/m16, imm8
- ADD r/m32, imm8
- ADD r/m8, r8
- ADD r/m16, r16
- ADD r/m32, r32
- ADD r8, r/m8
- ADD r16, r/m16
- ADD r32, r/m32
ADD 目标操作数,源操作数 作用:将源操作数加到目标操作数上 SUB指令SUB 的语法: - 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
SUB 目标操作数,源操作数 作用:将源操作数减到目标操作数上 AND指令AND 的语法: - AND r/m8, imm8
- AND r/m16,imm16
- AND r/m32,imm32
- AND r/m16, imm8
- AND r/m32, imm8
- AND r/m8, r8
- AND r/m16, r16
- AND r/m32, r32
- AND r8, r/m8
- AND r16, r/m16
- AND r32, r/m32
AND 目标操作数,源操作数 作用:将源操作数与目标操作数与运算后将结果保存到目标操作数中 OR指令OR 的语法: - OR r/m8, imm8
- OR r/m16,imm16
- OR r/m32,imm32
- OR r/m16, imm8
- OR r/m8, r8
- OR r/m16, r16
- OR r/m32, r32
- OR r8, r/m8
- OR r16, r/m16
- OR r32, r/m32
OR 目标操作数,源操作数 作用:将源操作数与目标操作数或运算后将结果保存到目标操作数中 XOR指令XOR 的语法: - XOR r/m8, imm8
- XOR r/m16,imm16
- XOR r/m32,imm32
- XOR r/m16, imm8
- XOR r/m8, r8
- XOR r/m32, r32
- XOR r8, r/m8
- XOR r16, r/m16
- XOR r32, r/m32
XOR 目标操作数,源操作数 作用:将源操作数与目标操作数异或运算后将结果保存到目标操作数中 NOT指令NOT 的语法: NOT r/m8 NOT r/m16 NOT r/m32 NOT 操作数 作用:取反 LEA指令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,对吗? 不对。可以通过打补丁,或者拓展操作系统来,寻址方式是由操作系统决定的 内存格式- 每个内存单元的宽度为8
- [编号]称为地址,用[]来区分立即数和内存地址
- 地址的作用:当我们想从内存中读取数据或者想向内存中写入数据,首先应该找到要读、写的位置。就像写信要写地址一样。
从指定内存中写入/读取数据只要是涉及到内存读写的,一定要指定内存的宽度 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 原创,欢迎分享本文,转载请保留出处
|