首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,538 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
25
篇与
的结果
2017-05-01
【技术分享】认识汇编寄存器 ( 复习 )
寄存器是什么?寄存器是计算机内部存储器的一部分,用于临时保存数据,供CPU进行快速处理。它们在计算机架构中扮演着非常重要的角色,是CPU最直接、最快速的数据存储单元。寄存器通常可以分为不同的类别,包括通用寄存器、指令指针寄存器、标志寄存器等,每种寄存器有其特定的用途。寄存器与内存寄存器:像是“顺丰快递”,速度快,但数量少。主要用于存储CPU频繁使用的数据。内存:像是“普通快递”,便宜且数量多。它的存储容量远超寄存器,通常用于存储程序和数据。在程序运行时,数据优先存储在寄存器中,因为其访问速度比内存快。然而,由于寄存器数量有限,大部分数据还是存放在内存中。寄存器的种类16位寄存器(早期处理器使用)AX、BX、CX、DX:通用寄存器,分别可以用作累加器、计数器、数据寄存器等。SI、DI:用于存储字符串操作中的源指针和目的指针。BP、SP:栈指针寄存器,SP用于指向栈顶,BP用于存储堆栈数据。IP:指令指针,指向当前执行的指令。32位寄存器(现代处理器常用)EAX、EBX、ECX、EDX:通用寄存器,作用与16位寄存器类似,但具有更大的存储范围。ESI、EDI、EBP、ESP、EIP:分别用于字符串操作、堆栈管理和指令指针。32位寄存器可以存储的最大数值为 0~0xFFFFFFFF,即 0 到 42亿。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寄存器的存储范围通用寄存器的存储范围由其位数决定。例如,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位寄存器,AX 是 EAX 的低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位数据时。al, ah寄存器------- 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 中创建线程。db 和 dd:分别用于写字节和双字数据。示例: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 engineAOB 注入首先找到数值在内存的地址。然后找出是什么改写了它。找到内存反汇编区域。选择工具自动汇编。选择AOB注入方式。
2017年05月01日
628 阅读
0 评论
30 点赞
1
2
3
0:00