如何正确使用虚拟化功能进行检查? (虚拟化代码,而不是虚拟访问器)

How to use virtualized functions correctly for checks ? (virtualized code, not virtual accessor)

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

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

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

在外部操纵的情况下,IsUsageAllowed() 将是一个困难的目标,因为我们必须攻击函数的 VM。 但这不是必需的,因为我们可以挂钩函数。为此,我们通过跳转指令绕过对 IsUsageAllowed 的调用,使其始终传递 true。 = 保护已移除。

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

提前致谢

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

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

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

在特定混淆器的情况下,它可能会使用一种特殊机制(又名 int-call),专门针对该场景,使整个链能够抵抗绕行。

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

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