看程序的時候碰到這么一行沒見過的代碼,簡單記錄一下
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
經測試,上述猜想應該為正確的,嗯,研究了個寂寞