看程序的时候碰到这么一行没见过的代码,简单记录一下
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 的内存位置
具体功能
- 从内存地址
0x427B3C
读取8
字节数据:- 低
4
字节[0x427B3C]
是下界 - 高
4
字节[0x427B3C+4]
是上界
- 低
- 检查
edx
的值是否满足:- 下界
≤ edx ≤
上界
- 下界
- 如果检查失败:
- 触发边界检查异常
(INT 5)
- 通常会导致程序崩溃或被调试器捕获
- 触发边界检查异常
实际作用:
- 安全防护:
- 确保余数在有效范围内
(0-9)
- 防止可能的整数溢出或计算错误
- 确保余数在有效范围内
- 反调试/反篡改:
- 如果程序被修改导致余数超出范围
- 会触发异常使程序崩溃
- 增加逆向工程难度
- 冗余检查:
- 在正常情况下,余数总是
0-9
- 这可能是防御性编程或遗留代码
- 在正常情况下,余数总是
- 在注册机中的处理:
- 在注册机实现中,不需要模拟这条指令,因为余数计算
(% 10)
自然会产生0-9
的值,边界检查不会改变程序逻辑或计算结果,它只是安全防护措施,不影响核心算法
- 在注册机实现中,不需要模拟这条指令,因为余数计算

最后这里看到下界是0
,但是上界居然是0xC
,原因大概是因为那个题当中,要取字符串的值,而这个字符串为LANNY5646521
,其有12
个字符,而bound
指令的上界是12
,所以最后取不到2
和1
两个字符。
例子1
例子2
例子3
经测试,上述猜想应该为正确的,嗯,研究了个寂寞