オーバーロード誘導によるメソッドの名前の変更
PreEmptive Protection - DashO は、Overload-Induction(オーバーロード誘導)という洗練された名前変更技法を提供します。名前変更システムの大部分が、単に古い名前 1 つにつき新しい 1 つの名前を割り当てる(例:getX()
が a()
に、getY()
が b()
になる)のに対し、オーバーロード誘導はメソッドのオーバーロードを最大限に誘導します。その根底にある考え方は、アルゴリズムに可能な限り多くの名前をまったく同じ名前に変更させようというものです。
難読化前のソース コード:
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);
}
}
この例についておそらく気付くことの 1 つは、難読化後のコードの方がよりコンパクトになっていることです。名前の変更による好ましい副作用は、サイズの縮小です。たとえば、20 文字の長さの名前がある場合、それを a()
に変更すると、領域は大幅に(具体的には 19 文字分)節約されます。また、これは文字列ヒープ エントリを節約することでも領域を節約します。すべての名前を a に変更するということは、a が 一度だけ格納されることを意味し、名前が a
に変更されたメソッドあるいはフィールドは、それぞれがその名前をポイントできるのです。オーバーロード誘導は、最短の識別子を連続的に再使用するので、この効果を高めます。