Babel JS Получает путь дочернего узла от родительского

#node.js #babeljs #abstract-syntax-tree #traversal #deobfuscation

Вопрос:

Я пытаюсь создать AST с типами Babel и заменить это дерево телом функции ниже. В частности, я хочу удалить var G = 2 , создать AST, состоящий из циклов while и операторов if, а затем заменить цикл for этим новым AST. Я смог создать узел оператора if, используя t.ifStatement, но, похоже, не могу получить путь к этому узлу оператора if, который я планирую использовать для добавления дополнительных операторов с помощью функции path.insertAfter.

Я довольно новичок в Babel JS, поэтому, если есть лучший способ преобразовать исходный код в цель, пожалуйста, не стесняйтесь давать мне предложения.

Исходный Код

 q8tt[48318] = (function() {
    var G = 2;
    for (; G !== 9; ) {
        switch (G) {
        case 1:
            return globalThis;
            break;
        case 5:
            var q;
            try {
                var N = 2;
                for (; N !== 6; ) {
                    switch (N) {
                    case 9:
                        delete q['tEKup'];
                        var W = Object['prototype'];
                        delete W['bECIA'];
                        N = 6;
                        break;
                    case 3:
                        throw "";
                        N = 9;
                        break;
                    case 2:
                        Object['defineProperty'](Object['prototype'], 'bECIA', {
                            'get': function() {
                                var s = 2;
                                for (; s !== 1; ) {
                                    switch (s) {
                                    case 2:
                                        return this;
                                        break;
                                    }
                                }
                            },
                            'configurable': true
                        });
                        q = bECIA;
                        N = 5;
                        break;
                    case 5:
                        q['tEKup'] = q;
                        N = 4;
                        break;
                    case 4:
                        N = typeof tEKup === 'undefined' ? 3 : 9;
                        break;
                    }
                }
            } catch (r) {
                q = window;
            }
            return q;
            break;
        case 2:
            G = typeof globalThis === 'object' ? 1 : 5;
            break;
        }
    }
}
)();
 

Цель

 q8tt[48318] = (function() {
    if (typeof globalThis === 'object') {
        return globalThis;
    } else {
        var q;
        Object['defineProperty'](Object['prototype'], 'bECIA', {
            'get': function() {
                return this;
            },
            'configurable': true
        });
        q = bECIA;
        q['tEKup'] = q; 
        if (typeof tEKup === 'undefined') {
            q = window;
        } else {
            delete q['tEKup'];
            var W = Object['prototype'];
            delete W['bECIA'];
        }
        return q;
    }
})