重载归纳方法重命名

Dotfuscator 采用了称为 Overload-Induction™ 的方法重命名专利技术。尽管大多数重命名系统只是为每个旧名称分配一个新名称(例如,“getX()”将变成“a()”,“getY()”将变成“b()”),但重载归纳会最大限度地归纳方法的重载。这种算法的基本思想是将尽可能多的方法重命名为完全相同的名称。很多客户报告说,在所有方法中,整整 33% 的方法被重命名为“a()”。在这些情况下,存在整整 50% 的可重命名方法!之所以说是“可重命名”,是因为很多方法(其中包括构造函数、“类构造函数”和预期由运行库调用的方法)在本质上是不能重命名的。

在经过这种深度的模糊处理后,尽管逻辑没有被破坏,但已经无法再理解它了。下面这个简单的示例演示了重载归纳技术的强大之处:

模糊处理之前的原始源代码
private void CalcPayroll(SpecialList employeeGroup) {
   while (employeeGroup.HasMore()) {
        employee = employeeGroup.GetNext(true);
        employee.UpdateSalary();
        DistributeCheck(employee);
    }
}
在重载归纳模糊处理之后,经反向工程处理得到的源代码
private void a(a b) {
    while (b.a()) {
        a = b.a(true);
        a.a();
        a(a);
    }
}

该示例显示经模糊处理的代码更加精简。重命名的一个积极的副作用是代码体积的减小。例如,如果有一个 20 个字符长的名称,将其重命名为 a() 将节省许多空间(确切地说是节省 19 个字符)。重命名还可通过节约使用字符串堆项来节省空间。将每一项都重命名为“a”意味着“a”只存储一次,而每个重命名为“a”的方法或字段都可指向它。重载归纳可以增强此效果,因为它连续重用了最短的标识符。

此重命名方法具有以下几个独特的优点:

  1. 重命名长期以来始终是一种会使反编译的输出变得更难理解的方法。重命名为不可打印的字符(或在目标源语言中非法的名称)是无用的,因为很容易让反编译器对这些标识符再次进行重命名。考虑到重载归纳可以使三分之一的方法的名称变为“a()”,我们至少可以这样说,理解反编译的输出结果更为困难。
  2. 重载归纳没有比所有重命名系统更多的限制(稍后讨论这些限制)。
  3. 由于重载归纳往往会频繁地使用同一个字母,它很晚才开始使用较长的名称(例如,aaaaa,等等)。这样,也会节省空间。

重载归纳的专利算法可确定所有可能的重命名冲突,并且只有在可以安全地归纳方法重载时,才会这样做。已经证明,此过程是不可逆的。换句话说,重新构造原始的方法名称关系是不可能的(即使通过再次运行重载归纳也是如此)。

© 2002-2007 PreEmptive Solutions. 保留所有权利。