我想实现一个基于 VM 的简单概念验证混淆器。它应该将一个 exe 文件作为输入并生成一个新的 pe 文件,并附加了 vm 部分。为简单起见,我们假设 exe 文件被编译为 32 位 pe。
问题是我在网上找到的大多数材料都只解释了如何破解而不是如何实现这样的解决方案,或者只是解释了如何用非常有限的指令实现一个简单的虚拟机。
建筑学
我想构建这样一个架构,如这篇(通过动态字节码调度增强基于虚拟机的代码混淆安全)论文:
让我引用一下:
Fig. 1. A classical process for VM-based code obfuscation.
To obfuscate the code, we first dissemble the code region to be
protected into native assembly code (1).
The assembly code will be mapped into our virtual instructions (2)
which will then be encoded into a bytecode format (3). Finally,
the generated byecode will be inserted into a specific region of
the binary which is linked with a VM library (4).
问题
假设我已经实现了一个非常基本的虚拟机,其中包含 20 条指令,如本[presentation] 所示:
iadd,
isub,
imul,
ilt,
ieq,
br addr,
brt addr,
brf addr,
iconst value,
load addr,
gload addr,
store addr,
gstore addr,
print,
pop,
call addr, numArgs
ret
hlt
在第 2 步(虚拟化)中,我必须以某种方式将提取的英特尔指令集映射到我的虚拟化指令。Intel 指令集很大(超过 200 条指令)。我完全不知道该怎么做。首先,我的虚拟机使用的寄存器比英特尔少。