目录
介绍
Eazfuscator.NET是一款支持IL级混淆的强壳.
功能:
20年更新中加入了同态加密(Homomorphic Encryption),大大加强了混淆强度。
同态加密参考:https://blog.gapotchenko.com/eazfuscator.net/homomorphic-encryption-of-code
环境
版本:2020.4版
Demo
.net 5 consoleAPP
using System;
using System.Reflection;
namespace ConsoleApp1
{
internal class Program
{
private static void Main(string[] args)
{
Vertify("123");
Console.ReadKey();
}
//[Obfuscation(Feature = "virtualization", Exclude = false)]
private static void Vertify(string key)
{
if (key.Length == 12345678)
{
Console.WriteLine(key);
}
else
{
Console.WriteLine("Error!");
}
}
}
}
引入nugget包:
给关键方法加特性:
[Obfuscation(Feature = "virtualization", Exclude = false)]
release时,自动加壳(只对有【obfuscation】特性的 模块 虚拟化IL和同态加密)
未开启虚拟化,反编译结果:
只是简单的控制流和命名混淆、资源加密:
开启虚拟化,反编译结果:
首先看到代码迅速膨胀;
同样在入口点断下,未加 [Obfuscation] 特性的方法如上不变,而需要虚拟化的方法已经被虚指令重写:
虚指令的原理是利用反射和opCode类代替原IL指令,参考大佬的文章:
简单使用de4dot还原一下:
虚拟化的部分de4dot无法还原,跟下去发现所有原语句都变为反射实现,参数都变为object数组。
逆向难度相对confuser壳还是高不少的!
优点:
- 方便、release/publish自动混淆,不要像其他混淆工具需要先配置DLL加密,在替换回去;
- 更新快,技术前沿;
- 流程混淆非常好,适合加密核心算法;
缺点:
调试混淆后的程序时,直接对系统类库下断点,观察输入输出较为容易;
(根据大佬们的文章推测出虚拟方法与原IL的对应关系,可以写出脱壳机)
总结
IL混淆比较强,极大的提高了逆向难度,适合加密核心算法;
可搭配其他壳进一步提升逆向难度;
疑问
Q1:复杂算法性能会降低多少?
Q2:原先在代码中提示同态加密的语句,和不使用同态加密对比(即12345678改为123),编译后没有发现区别,
同态加密的程序数据化(Homomorphic encryption is enabled with virtualization since the latter naturally transforms a program into data)
如何观察到区别?
待进一步使用、观察;
知道的大佬请留步回复一下~