作者章立春,他的第一本书:《软件保护及分析技术–原理与实践》
书中个别地方语焉不详,比如提出一个新的名词,但其解释却非常概括,有种说话说一半,给人自造玄虚的感觉。读者能怎样?参悟?
再比如:
P42:1.8.3 状态机
“状态机是另外一种高级形式的代码虚拟机,笔者将在合适的时机介绍这种虚拟机”
合适的时机是???
衔接也很不明确,多次提到“将在以后的章节介绍”,到底哪些章节?
这些只要稍微具体一些,既然能截那么图,为何要节省那几十个字呢,再加之完书后能做一点回视工作就能大大改善。
毕竟要向经典看齐。取法乎上也。
看新书
《代码虚拟与自动化分析》笔记
新书从实践的角度去造“代码虚拟化保护”程序,然后去破,即“分析”,角度很好。
新书一到,连读三章。下面只记录我认为我个人需要明确的一些点。
第1章 代码虚拟化原理
这里明确了我一些模糊的概念,虚拟机壳大部分是部分模拟。
从 “保存原环境” 到 “回归原环境”
提出了“虚拟介质”的概念。OpCode保存在虚拟介质中。
代码虚拟保护工作流程
以下内容用来替代被虚拟化执行的指令
- 来自原本代码的跳转:
- 代码虚拟机入口
- 保存代码现场
- 建立虚拟化环境
- 模拟执行代码-从虚拟化媒介中解码执行
- 恢复代码现场
- 代码虚拟机出口
- 回归原本代码的跳转
代码虚拟保护步骤:
- 找到被保护代码部分P
- 反编译它
- 编译成虚拟化代码
生成“虚拟化媒介”H
动态生成CRT(为了满足安全的需求,增加破译难度)
销毁原代码
- 加入“虚拟化媒介”H和CRT
- 关联两者
- 增加两原代码和新增内容的进入退出关联
第2章 模拟虚拟化
以Bochs为例,分析了基础模拟过程和组件。
- 模拟CPU对象
- 译码器
- 解码执行器
- OP代码分支
接下来作者举了一个实现的例子。
组成:
- 原程序处理器:PE读取和修改器。
- 译码器
- 虚拟化媒介编码器
- 运行时部件
- 解码执行器
- 虚拟机出入口
使用新的编码,即对原先编码内容做了新的映射。
eg:
B0 01
表示mov al,0x1
如果使用虚拟化执行就得做新的映射。而这个映射关系的复杂程序就体现在了工作上。
据说VMP这种映射关系是发生变化的,而不是一成不变的。
这章的内容直观地让我看到,虚拟化代码是这样的:
保护之前的代码
jmp 虚拟化
NOP//需要保护的命令已经被去除换成其他干扰命令
NOP
......
保护之后的代码<------------来自虚拟机的返回
而不是我推测中的面目全非。
第3章 自动化分析原理
这章详细分享了几种垃圾代码及精简策略。后面章节应该会涉及自动替换。
- 代码等价替换
将现有代码进行等价替换。
应对措施:积累代码等价替换,自动化替换。 - 生成无后果的垃圾代码
如:对称的操作,对寄存器反复覆盖。
有些指令的涉及已经与垃圾指令进行了轻微捆绑,比如垃圾指令移动了栈到一定方向,然后运行被修改后的正常指令,然后用垃圾指令移动回栈。
此时恢复指令就不能直接删除。
应对措施:栈平衡的方法来处理,使用简单的行为分析来处理:参见第4章。 - 代码乱序
此乱序是指:用指令进行切分。如跳转衔接等。如作者所言“廉价而实用”
应对措施:作者认为非常简单:预处理或代码实时记录,来分析实际代码的执行流程,然后充足代码的排列顺序并删除连接代码。
//我认为这样的挑战是设计流程整理工具,怎么更好的合并因代码流程记录而被展开的循环?
//似乎我惧怕的一种方法:假跳转还不严重?
//一种新想法是:用模拟器生成代码,以预测出结果的跳转流程,生成不可到达流程。 - 多分支跳转
作者举例:两条无区别路径,效果相同。
应对措施:使用虚拟化技术在发生代码跳转的地方模拟执行代码跳转的不同分支,然后对比不同分支的执行结果。如果结果没有差异,就当成多分支跳转来处理。
代码虚拟机的自动化分析:
综合性自动化技术:自动化
- 探测代码虚拟机的框架和结构
- 探测代码虚拟机的OP分支
- 分析OP分支的意图
- 记录监控虚拟机的运行状态来了解其运行过程
来达到分析处加密代码的意图的目的。
技术分为:
- 数据统计分析
- 行为匹配分析
- 对比测试分析
- 实时监控分析
前三章笔记如上。