如何正确使用虚拟化功能进行检查? (虚拟化代码,而不是虚拟访问器)
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。
我想了解代码虚拟化的概念。
在研究过程中,我发现了 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。