核心結論:有的,變量在內存中佔據具體存儲空間
代碼a=20; b=30; return a+b;中,a、b、臨時結果50在運行時均佔用內存:
- 棧上分配:局部變量
a、b通常在函數棧幀中,有固定偏移地址。
- 寄存器優化:編譯器優化(-O2/-O3)下,可能直接用寄存器運算,
50不落內存,僅存在寄存器中。
- 調試構建:Debug模式(-O0)強制變量駐留內存,便於調試器監視,此時掃描工具極大概率能搜到
0x32(50的十六進制)。
反外掛視角的記憶體掃描原理
Cheat Engine等工具通過掃描進程虛擬地址空間,匹配特定數值(如整數50、浮點數50.0):
- 首次掃描所有可讀寫內存頁,記錄匹配地址。
- 遊戲數值變化後,再次掃描縮小範圍(如「值增加」),定位目標變量地址。
- 最終鎖定基址+偏移,實現外掛讀寫。
變量不一定有「固定基址」
- ASLR(地址空間佈局隨機化):現代OS啟用ASLR後,模塊基址、堆/棧基址每次運行均不同,需結合基址偏移定位。
- 生命周期:函數返回後棧幀銷毀,地址失效;全局/靜態變量在
.data/.bss段,地址相對固定(模塊基址+偏移)。
- 優化消除:編譯器可能內聯、常量傳播,直接用立即數
50,無內存讀寫指令。
對抗掃描的常見手段
- 關鍵數值加密存儲(XOR、加法混淆)。
- 關鍵邏輯服務端權威驗證,客戶端僅顯示。
- 內存完整性校驗、反調試檢測(IsDebuggerPresent、時間檢測)。
- 使用虛擬機保護(VMProtect、Themida)將關鍵代碼轉為自定義字節碼。
總結:變量在內存中有存儲空間,但地址非固定、形式多變,單純掃描數值並非萬能鑰匙。