逆向入门(9)汇编篇-bound指令的学习

看程序的时候碰到这么一行没见过的代码,简单记录一下

c 复制代码
00427AC8  |.  6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]

这里是用到了bound指令,这是 x86 汇编中的指令,用于检查数组索引是否在有效范围内。

指令解析

复制代码
bound edx, qword ptr ds:[0x427B3C]
BOUND 指令:
- 语法:BOUND reg, mem
- 功能:检查寄存器值是否在内存指定的边界范围内
- 操作:如果 mem[0] ≤ reg ≤ mem[1] 则继续执行,否则触发异常(INT 5)
操作数:
edx:要检查的寄存器(32位)
qword ptr ds:[0x427B3C]:包含边界值的内存地址
qword 表示 64 位(8 字节)数据
ds:[0x427B3C] 是数据段中偏移量为 0x427B3C 的内存位置

具体功能

  1. 从内存地址0x427B3C 读取 8 字节数据:
    • 低 4 字节[0x427B3C]是下界
    • 高 4 字节[0x427B3C+4]是上界
  2. 检查 edx 的值是否满足:
    • 下界 ≤ edx ≤ 上界
  3. 如果检查失败:
    • 触发边界检查异常(INT 5)
    • 通常会导致程序崩溃或被调试器捕获

实际作用:

  1. 安全防护:
    • 确保余数在有效范围内(0-9)
    • 防止可能的整数溢出或计算错误
  2. 反调试/反篡改:
    • 如果程序被修改导致余数超出范围
    • 会触发异常使程序崩溃
    • 增加逆向工程难度
  3. 冗余检查:
    • 在正常情况下,余数总是 0-9
    • 这可能是防御性编程或遗留代码
  4. 在注册机中的处理:
    • 在注册机实现中,不需要模拟这条指令,因为余数计算(% 10)自然会产生 0-9 的值,边界检查不会改变程序逻辑或计算结果,它只是安全防护措施,不影响核心算法

最后这里看到下界是0,但是上界居然是0xC,原因大概是因为那个题当中,要取字符串的值,而这个字符串为LANNY5646521,其有12个字符,而bound指令的上界是12,所以最后取不到2和1两个字符。

例子1

例子2

例子3

经测试,上述猜想应该为正确的,嗯,研究了个寂寞

相关推荐
二十七日秋30 分钟前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
女神下凡42 分钟前
芯参谋(79):嵌入式学习进阶_(硬件与软件)深入实践指南
arm开发·单片机·嵌入式硬件·学习·fpga开发·设计规范
星恒随风44 分钟前
Linux Socket TCP编程(二):逐文件重构多进程、多线程与线程池服务器,深入fork、pthread_create、popen和std::bind
linux·服务器·笔记·学习·tcp/ip
wq8973871 小时前
[AI问答] VFIO操作的相关函数学习
学习
Century_Dragon2 小时前
把一辆智能汽车“搬“进教室—智能网联汽车自动驾驶虚拟教学实训
学习
兔头?2 小时前
JVM学习文档
jvm·学习
无心水2 小时前
15、云原生架构设计理论与实践 核心考点与学习笔记
笔记·学习·云原生·架构师·软考·系统架构设计师·软考系统架构设计师
动词ing3 小时前
【学习笔记】51单片机 独立按键控制LED显示二进制
笔记·学习·51单片机
银河麒麟操作系统3 小时前
两案例入选全球计算联盟年度产业应用案例汇编
大数据·汇编·人工智能
abc light3 小时前
ARM 裸机开发(2)——ARM 汇编与启动代码
汇编·arm开发