ArachisH / Flazzy

.NET library for [dis]assembling Shockwave Flash binaries.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

AS3 Non-Complex Instruction Execution

ArachisH opened this issue · comments

Allow for the execution of instructions that only utilize the stack for arithmetic, and when instructions are comparing constant values caused by obfuscation.

Motivation

Currently the deobfuscation method in ASCode is capable of reducing the complexity of a method's control flow by removing redundant checks against constant values. Therefore, the idea is to move this logic into another type that allows for the execution of static methods containing basic instructions, as this would allow for more complex methods of deobfuscation.

Consider the following AS3 class which decodes a string at runtime using a collection of integer arrays.

public class SomeClass
{
    private var field1:Array;

    // Non-Static
    public function SomeClass()
    {
        field1 = [10001, 10002, 10002, 10002, 10002];
    }

    // Non-Static 
    public function functionNeedingString() : void
    {
        var local1:* = [0, 0, 0, 0, 0];
        var local2:* = [1, 1, 1, 1, 1];
        var local2:String = getKeyValue(local1, 0)
    }

    // Static
    private static function getKeyValue(param1:Array, param2:int) : String
    {
        var value:String = "";
        for each(var local1 in param1)
        {
            for each(var local2 in local1)
            {
                value += String.fromCharCode(10000 - local2 + param2--);
            }
        }
        return value;
    }
}

Since all of the data required to generate the string is needed, we can load these values into their C# equivalent and call an emulated getKeyValue function to retrieve the string.