1

我想了解代码虚拟化概念。在研究时,我发现了 2 个用例:
a) 隐藏代码并避免知识提取
b) 避免操纵

用例 A 是合理的,因为 VM 是一个加重障碍。我的问题针对用例 B。
在我的示例中,如果虚拟化 IsUsageAllowed 为负,则程序将不会继续。

[Virtualize]
bool IsUsageAllowed()
{
    return .... ;
}
void Main()
{
  if (!IsUsageAllowed()) //detour call
    return;
    
    // do something
}

在外部操作的情况下,IsUsageAllowed()将是一个困难的目标,因为我们将不得不攻击函数的 VM。但这不是必需的,因为我们可以挂钩函数。为此,我们通过跳转指令将 IsUsageAllowed 的调用绕道到始终提供真实的东西。=保护被移除。

有没有更好的方法来使用虚拟化功能来避免这种情况?

先感谢您

4

1 回答 1

0

为了解决这个问题,虚拟化整个链:

[Virtualize]
bool IsUsageAllowed()
{
    return .... ;
}

[Virtualize]
void Main()
{
  if (!IsUsageAllowed()) //detour call
    return;
   
    // do something
}

对于特定的混淆器,它可能会使用一种特殊的机制(aka int-call),专门针对该场景,使整个链能够抵抗迂回。

Int-call 只是 VM 内部调用的简称。它允许避免 CLR 和 VM 域之间不必要的转换。

免责声明:我在 Eazfuscator.NET 混淆器上工作,它确实支持 int 调用。

于 2021-06-10T14:54:53.220 回答