SMC自修改代码一
一,对SMC的通俗解释。
就比方说,有一个游戏,一般来说游戏的规则是不变的,但是如果游戏规则能够根据你玩游戏的方式而改变,那么该游戏的难度是不是会增加。SMC与之类似,它会根据需要改变代码。
二,SMC的作用与功能
三,原理
基本原理:是在编译可执行文件时,将需要加密的代码区段(如函数、代码块) 单独编译成一个section(段),并将其标记为可读,可写,不可执行,然后通过某种方法在程序运行的时候将section解密为可执行代码,并将其标记为可读、可执行、不可写。这样就不能直接在内存里面找到加密的代码,从而无法执行或修改加密的代码。(其加密过程一般采用异或等简单的加密算法,解密是通过相同的算法对密文进行解密。)
先标记为可读可写不可执行,后标记为可读可执行不可写的目的:
1. 允许代码动态修改,但防止任意代码注入
-
RW- 阶段:
-
程序需要修改自身的代码段(例如动态生成指令、优化热代码路径或解密加密的代码)。
-
此时内存必须可写(
W
),但不能执行(X
),防止 CPU 意外执行未准备好的代码(可能包含恶意或未初始化的指令)。
-
-
RX- 阶段:
-
修改完成后,内存权限切换为可执行(
X
),但禁止写入(移除W
)。 -
这确保修改后的代码可以安全执行,同时防止后续恶意篡改(如攻击者利用漏洞覆盖代码)。
-
2. 防御代码注入攻击(如 Shellcode)
-
如果内存始终保持
RWX
(可读可写可执行),攻击者可能利用缓冲区溢出等漏洞,向内存写入恶意代码并直接执行。 -
SMC 的权限切换策略(RW- → RX-) 遵循 W^X(Write XOR Execute) 原则:
-
任何时候,内存页不能同时可写和可执行,从而阻断攻击者的代码注入途径。
-
3. 兼容现代 CPU 的安全特性
-
现代 CPU(如 Intel NX、ARM XN)支持硬件级的内存执行保护。
-
通过
RW- → RX-
切换:-
在修改阶段禁用执行(避免 CPU 误执行中间状态代码)。
-
在执行阶段禁用写入(利用硬件机制锁定代码完整性)。
-
4. 避免自修改代码的竞争条件
-
如果代码在修改过程中被意外执行,可能导致未定义行为(如指令解析错误或崩溃)。
-
RW- 阶段确保:
-
只有明确的写入操作能修改代码,CPU 不会同时执行该区域。
-
-
RX- 阶段确保:
-
代码一旦完成修改,立即变为只读,避免后续写入干扰执行流。
-